?? 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 + -