首    页 界面/窗口 网络/通讯 数据库 组件开发 图像/多媒体 NET/Web 其它技术 源码下载 资料下载 软件共享 软件外包 曲艺杂谈
栏目导航:  首    页  |  数据库  |  ADO   


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


原作者:风之诺    源出处:CSDN    发布者:施昌权    发布类型:转载    发布日期:2008-10-24


因需要,要利用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 介绍(转载的)
      象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应用程序作了优化。 

          

关于我们 版权声明 广告服务 联系我们 友情链接 加入收藏
站长:施昌权    Email:scq2099yt@163.com    MSN:scq2099yt@live.cn    QQ:14046300    本站QQ群:67202409
Copyright © 2008     卓为VC(www.joyvc.cn)    All Rights Reserved    建议分辨率 1024×768
本站由施昌权制作维护
京ICP备09012297号