📄 oledbdll2.cpp
字号:
// OleDBDLL2.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "OleDBDLL2.h"
#include "ConfigFile.h"
#include "AdoDatabase.h"
CConfigFile gConfigFile ;
void FillDataToArray(int nType,int nTableOrder) ;
int GetTableOrderByName(char* szTable2) ;
#define MAX_FIELDS 255 //最大字段数量
#define MAX_DATA 255 //字段[字符类型]中最大字节数
#define MAX_FieldLen 30 //最大字段名字长度
#define MAX_TableLen 50 //同一个数据库中最大表数量
//全局变量
CAdoDatabase m_Database[16] ; //总共16路
char lpFieldName[3000],GetName[50] ;
char gArrayTableName[MAX_TableLen][MAX_FieldLen] ; //表名字数组
char gArrayFieldCount[MAX_TableLen][10] ; //每个表对于表字段个数
char gArrayFieldName[MAX_TableLen][MAX_FIELDS][MAX_FieldLen] ; //每个表对应的字段名字数组
char gArrayFieldType[MAX_TableLen][MAX_FIELDS][MAX_FieldLen] ; //每个表对应的字段类型数组 1,2,3,4 /**/
unsigned int nAllTableCount = 0 ; //实际表的总数
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
if(!gConfigFile.FindFile("ConfigFile.ini"))
{
MyTitle("没有ConfigFile文件!\n请检查!") ;
return FALSE ;
}
CoInitialize (NULL);
break ;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
void MyTitle(char* szTitle)
{
MessageBox(::GetFocus(),szTitle,"提示",MB_ICONWARNING|MB_OK) ;
}
/*读取配置文件*/
BOOL ExReadConfigString(LPCTSTR lpSection, LPCTSTR lpKey, LPCTSTR lpDefault,char* szOut)
{
return gConfigFile.ReadConfigString(lpSection,lpKey,lpDefault,szOut) ;
}
/* 1 连接数据库 从0开始 参数: Dsn Uid Pwd */
BOOL ExOpenDatabase1(int nOrder, char* sDSN, char* sUserId, char* sPassword)
{
return m_Database[nOrder].ConnectDB1(sDSN,sUserId,sPassword) ;
}
/* 2 连接数据库 从0开始 参数: int nOrder int nType, char *szServerName, char *szDatabase, char *szUid, char *szPwd */
BOOL ExOpenDatabase2(int nOrder, char *szServerName, char *szDatabase, char *szUid, char *szPwd)
{
return m_Database[nOrder].ConnectDB2(szServerName,szDatabase,szUid,szPwd) ;
}
/* 3 关闭数据库 参数: 没有参数*/
void ExCloseDatabase(int nOrder)
{
m_Database[nOrder].DisconnectionDB() ;
}
/* 4 设置绑定表的某字段的值,在增加纪录时要用到。参数:字段序号、字段的值*/
void ExSetFieldValue(int nOrder,int iFieldOrder,char* sFieldValue)
{
if(iFieldOrder > MAX_FIELDS -1)
return ;
if(strlen(sFieldValue)<MAX_DATA)
strcpy(m_Database[nOrder].m_sFieldValue[iFieldOrder],sFieldValue) ;
else
memcpy(m_Database[nOrder].m_sFieldValue[iFieldOrder],sFieldValue,MAX_DATA-1) ;
}
/* 5 获取绑定表的某字段的值,往往查询出纪录时,取某字段的值用到。 参数:字段序号*/
void ExGetFieldValue(int nOrder,int iFieldOrder,char* fieldValue)
{
if(iFieldOrder > MAX_FIELDS -1)
return ;
strcpy(fieldValue,m_Database[nOrder].m_sFieldValue[iFieldOrder]) ;
}
/* 6 向临时绑定的表增加一条纪录*/
BOOL ExAddRecord(int nOrder)
{
return m_Database[nOrder].AddRecord() ;
}
/* 7 修改临时绑定表的一条纪录*/
BOOL ExUpdateRecord(int nOrder,char* sExWhereUpdate)
{
return m_Database[nOrder].UpdateRecord(sExWhereUpdate) ;
}
/* 8 查找纪录---返回值
1: 即没有错误发生的找到纪录
-1:在查找过程中出现错误
0: 查找过程当中没有错误出现,但是没有找到适合条件的纪录,即没有返回纪录 */
int ExSelectMatchingRecords(int nOrder,char* sExWhereContext)
{
return m_Database[nOrder].SelectMatchingRecords(sExWhereContext) ;
}
/* 9 查找临时绑定的表的下一条纪录。往往用在查找查找多条纪录。
即:先调用ExSelectMatchingRecords()查询纪录,然后再循环
调用ExNextMatchingRecord()函数,这样可以查询到多条纪录*/
BOOL ExNextMatchingRecord(int nOrder)
{
return m_Database[nOrder].NextMatchingRecord() ;
}
/*10 执行一句 SQL语句*/
BOOL ExExecute(int nOrder ,char* sExSQL)
{
return m_Database[nOrder].ExecuteSQL(sExSQL) ;
}
/* 11 返回最近出错的原因 */
void ExGetExecError(int nOrder,char* szError)
{
strcpy(szError,m_Database[nOrder].m_szErrMsg);
}
/*12 开始 事务*/
void ExStartTran(int nOrder)
{
m_Database[nOrder].StartTran() ;
}
/*13 递交事务 */
void ExCommitTran(int nOrder)
{
m_Database[nOrder].CommitTran() ;
}
/*14 回滚事务*/
void ExRollbackTran(int nOrder)
{
m_Database[nOrder].RollbackTran() ;
}
//初始化所有表结构信息
BOOL InitAllTableInfo()
{
unsigned int i,j,k,nLen;
i=0 ;
j=0 ;
k=0 ;
memset(lpFieldName,0x00,sizeof(lpFieldName)) ;
memset(GetName,0x00,sizeof(GetName)) ;
gConfigFile.ReadConfigString("AllTableName","AllTableName","Test",lpFieldName) ;
nLen = strlen(lpFieldName) ;
if(memcmp(lpFieldName,"Test",4)!=0)
{
for(i=0;i<nLen;i++)
{
if(lpFieldName[i]!=',')
{
GetName[j]=lpFieldName[i] ;
j++ ;
}
else
{
GetName[j]=0x00 ;
strcpy(gArrayTableName[k],GetName) ; //取得表名字
k ++ ;
j=0 ;
memset(GetName,0x00,sizeof(GetName)) ;
}
}
nAllTableCount = k ; //实际表的个数
}
else
{
MessageBox(::GetFocus(),"ConfigFile文件缺少信息!","提示",MB_ICONWARNING|MB_OK) ;
return FALSE ;
}
//--------取每个表字段总数
for(i=0;i<nAllTableCount;i++)
{
memset(GetName,0x00,sizeof(GetName)) ;
gConfigFile.ReadConfigString(gArrayTableName[i],"FieldCount","Test",GetName) ;
if(memcmp(GetName,"Test",4)==0)
{
sprintf(GetName,"表名字为 %s 的FieldCount配置有错 !",gArrayTableName[i]) ;
MessageBox(::GetFocus(),GetName,"提示",MB_ICONWARNING|MB_OK) ;
return FALSE ;
}else
strcpy(gArrayFieldCount[i],GetName) ;
//-------取得每个表的字段名字
gConfigFile.ReadConfigString(gArrayTableName[i],"FieldName","Test",lpFieldName) ;
if(lpFieldName[0]=='$')
{
sprintf(GetName,"表名字为 %s 的FieldName配置有错 !",gArrayTableName[i]) ;
MessageBox(::GetFocus(),GetName,"提示",MB_ICONWARNING|MB_OK) ;
return FALSE ;
}else
{//字段名字
FillDataToArray(1,i) ;
}
//-------取得每个表的字段类型
gConfigFile.ReadConfigString(gArrayTableName[i],"FieldNumeric","Test",lpFieldName) ;
if(lpFieldName[0]=='$')
{
sprintf(GetName,"表名字为 %s 的FieldNumeric配置有错 !",gArrayTableName[i]) ;
MessageBox(::GetFocus(),GetName,"提示",MB_ICONWARNING|MB_OK) ;
return FALSE ;
}else
{//字段类型
FillDataToArray(2,i) ; //填充类型
}
}
return TRUE ;
}
//填充相应的数据到数组 nType==1 名字 2 类型
void FillDataToArray(int nType,int nTableOrder)
{
unsigned int i,j,k=0,nLen;
i=0 ;
j=0 ;
memset(GetName,0x00,sizeof(GetName)) ;
nLen = strlen(lpFieldName) ;
for(i=0;i<nLen;i++)
{
if(lpFieldName[i]!=',')
{
GetName[j]=lpFieldName[i] ;
j++ ;
}
else
{
GetName[j]=0x00 ;
if(nType==1)
strcpy(gArrayFieldName[nTableOrder][k],GetName) ;
else
strcpy(gArrayFieldType[nTableOrder][k],GetName) ;
k ++ ;
j=0 ;
memset(GetName,0x00,sizeof(GetName)) ;
}
}
}
//填充表结构
void FillTableInfo2(int nOrder ,char* szTable)
{
unsigned int nTableOrder = GetTableOrderByName(szTable) ;
unsigned int i = 0 ;
if(nTableOrder==-1)
{
sprintf(GetName,"填充表结构出错,\n没有找到你需要的表%s",szTable) ;
MessageBox(::GetFocus(),GetName,"提示",MB_ICONSTOP|MB_OK) ;
return ;
}
//表名字
strcpy(m_Database[nOrder].m_szTableName,gArrayTableName[nTableOrder]) ;
//表字段数量
m_Database[nOrder].m_nFields=atoi(gArrayFieldCount[nTableOrder]) ;
//字段名字
for(i=0;i<m_Database[nOrder].m_nFields;i++)
strcpy(m_Database[nOrder].m_sFieldName[i],gArrayFieldName[nTableOrder][i]) ;
//字段类型
for(i=0;i<m_Database[nOrder].m_nFields;i++)
m_Database[nOrder].m_bNumeric[i]=atoi(gArrayFieldType[nTableOrder][i]) ;
}
//根据表名字返回对于序号
int GetTableOrderByName(char* szTable2)
{
if(nAllTableCount==0)
{
MessageBox(::GetFocus(),"没有调用函数:InitAllTableInfo,\n或者ConfigFile文件没有配置好AllTableName那项。","提示",MB_ICONWARNING|MB_OK) ;
return -1 ;
}
if(nAllTableCount>MAX_TableLen)
{
MessageBox(::GetFocus(),"表总数量错误!","提示",MB_ICONWARNING|MB_OK) ;
return -1 ;
}
for(unsigned int i=0;i<nAllTableCount;i++)
{
if(strcmp(gArrayTableName[i],szTable2)==0)
return i ;
}
return -1 ;
}
//返回某一路字段总数
int ExGetFieldCount(int nOrder)
{
return m_Database[nOrder].m_nFields ;
}
//返回某一路字段总数
BOOL ExGetFieldName(int nOrder,int nFieldOrder,char* szFieldName)
{
if(nFieldOrder > MAX_FIELDS -1)
return FALSE;
strcpy(szFieldName,m_Database[nOrder].m_sFieldName[nFieldOrder]);
return TRUE ;
}
//返回某一路,某个字段类型
int ExGetFieldType(int nOrder,int nFieldOrder )
{
return m_Database[nOrder].m_bNumeric[nFieldOrder] ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -