⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oledbdll2.cpp

📁 这是一个基于COM的数据库访问技术
💻 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 + -