利用VC和ADO接口编写一个dll模块实现对数据库数据的处理

    技术2022-05-11  65

    因需要,要利用 VC ADO 接口编写一个 dll 模块实现对数据库中数据的处理。然后上层程序可以调用此 DLL 通过这个这个模块,熟悉了 DLL 模块的编写与调用方法和 ADO 组件的使用方法。现总结如下:   一.            DLL 模块的编写与调用   1) DLL 编写: 1 .在头文件( lib.h )声明要从 DLL 导出的函数   extern "C" void __declspec(dllexport) getzhishi (int nArray[5500][6],char* sczm[5500],float fTime[5500],float nrate=10);   2 在文件( lib.cpp )定义该函数   void getzhishi(int nArray[5500][6],char* sczm[5500],float fTime[5500],float nrate) { }   2) DLL 调用(dllCall.cpp:(以显式方式调用DLL:通过WINAPI函数) // dllCall.cpp : 以显式方式调用DLL #include "stdafx.h" #include "windows.h" // 需要定义一个函数指针类型指向要调用的函数。 typedef void ( * lpAddFun)(int nArray[100][7],char* sczm[100],float fTime[5500],float nrate);   int main(int argc, char* argv[]) {     HINSTANCE hDll;   //DLL 句柄     lpAddFun addFun; // 函数指针     int nArray[5500][7];     char* sczm[5500];     float fTime[5500];    hDll = LoadLibrary("..//Debug//dllTest.dll"); //     ..// 是本文件所在目录的上级目录的上级马目录(这里是把 DLL 程序和调用程序放在同一个工程文件里)获得 DLL 库的访问句柄     if (hDll != NULL)     {        addFun = (lpAddFun)GetProcAddress(hDll,"getzhishi"); // 获得函数指针(可指定函数名)        if(addFun!=NULL)        {            addFun(nArray,sczm,fTime,100); // 通过函数指针调用该函数                      for(int i=0;i<290;i++)            {           // for(int i=0;i<7;i++)            printf("%s,%d,%d,%d,%d,%d,%d,%5.3f/n",sczm[i],nArray[i][0],nArray[i][1],nArray[i][2],nArray[i][3],nArray[i][4],nArray[i][5],fTime[i]);                         }        }        FreeLibrary(hDll);     }       return 0; }   #import "C:/Program Files/Common Files/System/ADO/msado15.dll" no_namespace named_guids rename("EOF","adoEOF")   二.            VC 中运 ADO COM 动态库): 1. 在头文件( lib.h )引入 ADO 库文件 #import "C:/Program Files/Common Files/System/ADO/msado15.dll" no_namespace named_guids rename("EOF","adoEOF") 2. 加入头文件 #include <comutil.h>   //_variant_t 在其中定义 3. 初始化 OLE/COM 库环境并 连接数据库 CoInitialize(NULL);  // 初始化 OLE/COM _ConnectionPtr m_pConnection; HRESULT hr=NULL; m_pConnection.CreateInstance(__uuidof(Connection)); m_pConnection->Open("Data Source=dtata7;UID=23;PWD=23;","","",adModeUnknown);   // 用户名和密码可以随便设,没有影响 4 .查询数据库 ,并对从ADO获取的 _variant_t 类型数据进行转换成C++支持的类型。(字符串转化成char*,与整形的转化方式不一样。) _RecordsetPtr m_pRecordset; _variant_t RecordsAffected; _variant_t vIndex = (long)0; _variant_t vCount, vCount4;   int i=0; int m=0; char *zhanming ="/0"; int num=0; char *str="SELECT* FROM JZ050307 WHERE (XXLX<6)"; m_pRecordset=m_pConnection->Execute((_bstr_t)str,&RecordsAffected,adCmdText);   for ( m=0;m<5500;m++)// 可在次出修改值,改变要提取的记录的条数   { vIndex = _variant_t((long)3); vCount=m_pRecordset->GetCollect(vIndex); // 获取此记录的第3个字段值 if (vCount.vt!=VT_NULL) //zhanming=(char*)(vCount.pcVal); //BSTR 为指向字符串的32位指针。_bstr_t类封装了对BSTR的操作 zhanming=_com_util::ConvertBSTRToString((_bstr_t)vCount); // 将BSTR转化为CHAR*   //zhanming=(char*)(_bstr_t)vCount; //*pcVal else zhanming=" 空"; sczm[m]=zhanming;   for (i=0;i<7;i++) { vIndex = _variant_t((long)(i+4));      vCount=m_pRecordset->GetCollect(vIndex); if (vCount.vt!=VT_NULL) {  if(i!=2&&i!=4&&i!=6) nArray[m][i]=vCount.iVal;    // 获取INT值  else if(i==6)  fTime[m]=vCount.lVal/nrate;  else nArray[m][i]=vCount.lVal; } else nArray[m][i]=0;   //nArray[m][6]=nArray[m][6]/nrate;   num++; m_pRecordset->MoveNext();     // 读取100个数据的循环 、结束 5 .关闭数据库连接,撤消 OLE/COM 库环境 m_pRecordset->Close();/// 关闭记录集 m_pConnection->Close();/// 关闭连接 CoUninitialize(); 

    最新回复(0)