因需要,要利用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();
补充资料:
1.ADO 介绍(转载的)
ADO从原来的Microsoft数据接口 远程数据对象(RDO)而来。RDO与 ODBC一起工作访问关系数据库,但不能访问如ISAM和VSAM的非关系数据库。
ADO 是对当前微软所支持的数据库进行操作的最有效和最简单直接的方法,它是一种功能强大的数据访问编程模式,从而使得大部分数据源可编程的属性得以直接扩展到你的Active Server 页面上。可以使用ADO 去编写紧凑简明的脚本以便连接到 Open Database Connectivity (ODBC) 兼容的数据库和 OLE DB 兼容的数据源,这样 ASP 程序员就可以访问任何与 ODBC 兼容的数据库,包括 MS SQL SERVER、Access、 Oracle 等等。
比如,如果网站开发人员需要让用户通过访问网页来获得存在于IBM DB2或者Oracle数据库中的数据,那么就可以在ASP页面中包含ADO程序,用来连接数据库。于是,当用户在网站上浏览网页时,返回的网页将会包含从数据库中获取的数据。而这些数据都是由ADO代码做到的。
ADO向VB程序员提供了很多好处。包括易于使用,熟悉的界面,高速度以及较低的内存占用(已实现ADO2.0的Msado15.dll需要占用342K内存,比RDO的Msrdo20.dll的368K略小,大约是 DAO3.5的Dao350.dll所占内存的60%)。同传统的数据对象层次(DAO和RDO)不同,ADO可以独立创建。因此你可以只创建一个"Connection"对象,但是可以有多个,独立的"Recordset"对象来使用它。ADO针对客户/服务器以及WEB应用程序作了优化。
|