您的位置:首页 > 数据库

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

2007-02-28 19:00 876 查看
因需要,要利用VC和ADO接口编写一个dll模块实现对数据库中数据的处理。然后上层程序可以调用此DLL。
通过这个这个模块,熟悉了DLL模块的编写与调用方法和ADO组件的使用方法。现总结如下:

一. DLL模块的编写与调用

1) DLL编写:
1.在头文件(lib.h)声明要从DLL导出的函数

[align=left]extern "C" void __declspec(dllexport) getzhishi(int nArray[5500][6],char* sczm[5500],float fTime[5500],float nrate=10);[/align]
[align=left] [/align]
2.在文件(lib.cpp)定义该函数
[align=left] [/align]
[align=left]void getzhishi(int nArray[5500][6],char* sczm[5500],float fTime[5500],float nrate)[/align]
[align=left]{[/align]
[align=left]}[/align]
[align=left] [/align]
[align=left]2) DLL调用(dllCall.cpp):(以显式方式调用DLL:通过WINAPI函数)[/align]
[align=left]// dllCall.cpp : 以显式方式调用DLL[/align]
[align=left]#include "stdafx.h"[/align]
[align=left]#include "windows.h"[/align]
[align=left]//需要定义一个函数指针类型指向要调用的函数。[/align]
[align=left]typedef void ( * lpAddFun)(int nArray[100][7],char* sczm[100],float fTime[5500],float nrate);[/align]
[align=left] [/align]
[align=left]int main(int argc, char* argv[])[/align]
[align=left]{[/align]
[align=left] HINSTANCE hDll; //DLL句柄[/align]
[align=left] lpAddFun addFun; //函数指针[/align]
[align=left] int nArray[5500][7];[/align]
[align=left] char* sczm[5500];[/align]
[align=left] float fTime[5500];[/align]
[align=left] hDll = LoadLibrary("..//Debug//dllTest.dll"); // ..//是本文件所在目录的上级目录的上级马目录(这里是把DLL程序和调用程序放在同一个工程文件里)获得DLL库的访问句柄[/align]
[align=left] if (hDll != NULL)[/align]
[align=left] {[/align]
[align=left] addFun = (lpAddFun)GetProcAddress(hDll,"getzhishi"); //获得函数指针(可指定函数名)[/align]
[align=left] if(addFun!=NULL)[/align]
[align=left] {[/align]
[align=left] addFun(nArray,sczm,fTime,100); //通过函数指针调用该函数[/align]
[align=left] [/align]
[align=left] for(int i=0;i<290;i++)[/align]
[align=left] {[/align]
[align=left] // for(int i=0;i<7;i++)[/align]
[align=left] [/align]
[align=left]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]);[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] FreeLibrary(hDll);[/align]
[align=left] } [/align]
[align=left] return 0;[/align]
[align=left]}[/align]
[align=left] [/align]
#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库环境并连接数据库
[align=left]CoInitialize(NULL); //初始化OLE/COM库[/align]
[align=left]_ConnectionPtr m_pConnection;[/align]
[align=left]HRESULT hr=NULL;[/align]
[align=left]m_pConnection.CreateInstance(__uuidof(Connection)); [/align]
m_pConnection->Open("Data Source=dtata7;UID=23;PWD=23;","","",adModeUnknown); //用户名和密码可以随便设,没有影响
[align=left]4.查询数据库 ,并对从ADO获取的_variant_t类型数据进行转换成C++支持的类型。(字符串转化成char*,与整形的转化方式不一样。)[/align]
[align=left]_RecordsetPtr m_pRecordset;[/align]
[align=left]_variant_t RecordsAffected;[/align]
[align=left]_variant_t vIndex = (long)0;[/align]
[align=left]_variant_t vCount, vCount4;[/align]
[align=left] [/align]
[align=left]int i=0;[/align]
[align=left]int m=0;[/align]
[align=left]char*zhanming ="/0";[/align]
[align=left]int num=0;[/align]
[align=left]char*str="SELECT* FROM JZ050307 WHERE (XXLX<6)";[/align]
[align=left]m_pRecordset=m_pConnection->Execute((_bstr_t)str,&RecordsAffected,adCmdText);[/align]
[align=left] [/align]
[align=left]for( m=0;m<5500;m++)//可在次出修改值,改变要提取的记录的条数[/align]
[align=left] [/align]
[align=left]{[/align]
[align=left]vIndex = _variant_t((long)3);[/align]
[align=left]vCount=m_pRecordset->GetCollect(vIndex); //获取此记录的第3个字段值[/align]
[align=left]if(vCount.vt!=VT_NULL) [/align]
[align=left]//zhanming=(char*)(vCount.pcVal); //BSTR为指向字符串的32位指针。_bstr_t类封装了对BSTR的操作[/align]
[align=left]zhanming=_com_util::ConvertBSTRToString((_bstr_t)vCount); //将BSTR转化为CHAR*[/align]
[align=left] [/align]
[align=left]//zhanming=(char*)(_bstr_t)vCount; //*pcVal[/align]
[align=left]else[/align]
[align=left]zhanming="空";[/align]
[align=left]sczm[m]=zhanming;[/align]
[align=left] [/align]
[align=left]for(i=0;i<7;i++)[/align]
[align=left]{[/align]
[align=left]vIndex = _variant_t((long)(i+4)); [/align]
[align=left]vCount=m_pRecordset->GetCollect(vIndex);[/align]
[align=left]if(vCount.vt!=VT_NULL) [/align]
[align=left]{[/align]
[align=left] if(i!=2&&i!=4&&i!=6)[/align]
[align=left]nArray[m][i]=vCount.iVal; //获取INT值[/align]
[align=left] else if(i==6)[/align]
[align=left] fTime[m]=vCount.lVal/nrate;[/align]
[align=left] else [/align]
[align=left]nArray[m][i]=vCount.lVal;[/align]
[align=left]}[/align]
[align=left]else[/align]
[align=left]nArray[m][i]=0;[/align]
[align=left] [/align]
[align=left]//nArray[m][6]=nArray[m][6]/nrate;[/align]
[align=left] [/align]
[align=left]num++;[/align]
[align=left]m_pRecordset->MoveNext();[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]} //读取100个数据的循环 、结束 [/align]
[align=left]5.关闭数据库连接,撤消OLE/COM库环境[/align]
[align=left]m_pRecordset->Close();///关闭记录集[/align]
[align=left]m_pConnection->Close();///关闭连接[/align]
CoUninitialize();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐