因需要,要利用
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 (
ActiveX Data Objects,
ActiveX数据对象)是Microsoft提出的应用
程序接口(
API)用以实现访问关系或非关系
数据库中的数据。例如,如果您希望编写应用程序从
DB2或
Oracle数据库中向网页提供数据,可以将ADO程序包括在作为活动服务器页(ASP)的HTML
文件中。当用户从网站请求网页时,返回的网页也包括了数据中的相应数据,这些是由于使用了ADO代码的结果。
象Microsoft的其它系统接口一样,ADO是
面向对象的。它是Microsoft
全局数据访问(
UDA)的一部分,Microsoft认为与其自己创建一个数据,不如利用UDA访问已有的数据库。为达到这一目的,Microsoft和其它数据库公司在它们的数据库和Microsoft的OLE数据库之间提供了一个“桥”程序,OLE数据库已经在使用ADO技术。ADO的一个特征(称为
远程数据服务)支持网页中的数据相关的ActiveX控件和有效的
客户端缓冲。作为ActiveX的一部分,ADO也是Microsoft的
组件(COM)的一部分,它的面向组件的
框架用以将程序组装在一起。
对象
模式
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是一种面向对象的编程接口,微软介绍说,与其同IBM和Oracle提倡的那样,创建一个统一数据库,不如提供一个能够访问不同数据库的统一接口,这样会更加实用一些。为实现这一目标,微软在数据库和微软的OLE DB中提供了一种“桥”程序,这种程序能够提供对数据库的连接。 开发人员在使用ADO时,其实就是在使用OLE DB,不过OLE DB更加接近底层。ADO的一项属性??远程数据服务,支持“
数据仓库组件以及高效的客户端缓存。作为ActiveX的一部分,ADO也是COM组件的一部分。ADO是由早期的微软数据接口??远程数据对象RDO演化而来的。RDO同微软的ODBC一同连接关系数据库,不过不能连接非关系数据库。 ”ActiveX
ADO向我们提供了一个熟悉的,高层的对OLE DB的Automation封装接口。对那些熟悉RDO的程序员来说,你可以把OLE DB比作是ODBC驱动程序。如同RDO对象是ODBC驱动程序接口一样,ADO对象是OLE DB的接口;如同不同的
数据库系统需要它们自己的ODBC驱动程序一样,不同的数据源要求它们自己的OLE DB提供者(OLE DB provider)。目前,虽然OLE DB提供者比较少,但微软正积极推广该技术,并打算用OLE DB取代ODBC。
ADO向VB程序员提供了很多好处。包括易于使用,熟悉的界面,高速度以及较低的内存占用(已实现ADO2.0的Msado15.dll需要占用342K内存,比RDO的Msrdo20.dll的368K略小,大约是
DAO3.5的Dao350.dll所占内存的60%)。同传统的数据对象层次(DAO和RDO)不同,ADO可以独立创建。因此你可以只创建一个"Connection"对象,但是可以有多个,独立的"Recordset"对象来使用它。ADO针对客户/服务器以及WEB应用程序作了优化。