Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15260559
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: C/C++

2008-05-31 10:22:48

在WINDOWS平台,通过ADO连接数据库,应该是最标准的。但是由于使是通过COM技术实现的,问题就变得复杂了许多。 同时,也因为许多开源的编译器不支持或者不是很好地支持COM技术,给我们学习、开发带来了一些困难。

在 这里,我们讨论使用Borland C++ Free Compiler 5.5 通过ADO来访问ACCESS文件。原本,BCC55对COM的支持也不是很好,许多COM的支持文件都没有,所以,需要另外从SF上BCC的 SDK,当前版本是0.0.7.1,请自行。

此外,我们不打算通过 import  \"...\\msado15.dll\" 的办法来使用ADO,而是用过使用 adoint.h 的办法来使用ADO。

#include Initguid.h
#include adoid.h    // ADO GUID’s
#include adoint.h   // ADO CLASS


再引用对COM的支持。不过,感觉上,假如不用COM中的BSTR转换成char*的函数,和ADOConnection中的错误处理,可以不引 用下面的COM的(未进行严格测试)。反正影响不大,因为WINDOWS总有COM的支持的,起码目前的WINDOWS是,也就用了。

#include comutil.h
#pragma comment( lib, \"comsupp.lib\"  )  //in bccsdk package


好了,定义ADO相关的变量:

    ADOField*  pFld;
    ADOFields* pFlds;
    ADORecordset* pRs;
    ADOConnection* pConn;


然后,初始化COM、创建 ADOConnection、ADORecordset 实例:
    ::CoInitialize (NULL);
    CoCreateInstance(CLSID_CADOConnection, NULL,
            CLSCTX_INPROC_SERVER, IID_IADOConnection15, (LPVOID*)&pConn);
    CoCreateInstance(CLSID_CADORecordset, NULL,
            CLSCTX_INPROC_SERVER, IID_IADORecordset, (LPVOID*)&pRs);


打开ADO连接:
    pConn-〉Open( (_bstr_t)L\"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Contract_me_data.mdb\",
            L\"\",
            L\"\",
            adConnectUnspecified);



打开数据集:(sql是variant类型、hr是HRESULT类型,请自行定义)

    hr = pRs-〉Open(sql, (_variant_t)pConn, adOpenStatic, adLockOptimistic, adCmdText);

    if(SUCCEEDED(hr) ){
           //處理數據
    }


使用时,要判断是否EOF和BOF。
获取数据时,有一种方法是先得到Fields,再获得指定的Field,再根据Fieldr的 get_Value(&value)方法得到数据;另一种方法是,直接通过ADORecordset的get_Collect(index, &value)来得到数据。如果不想得到字段的相关属性,用后一种方法是很直接的。 [Page]
要注意的是数据是variant类型,可以用_com_util::ConvertBSTRToString()转换成字符串。

处理结束,关闭连接、释放COM环境:(其中,state是long类型,请自行定义)
    if(!FAILED(pRs-〉get_State(&state)))
        if(state!=adStateClosed){
            pRs-〉Close();
            pRs-〉Release();
            pRs=NULL;
        }

    if(!FAILED(pConn-〉get_State(&state)))
        if(state!=adStateClosed){
            pConn-〉Close();
            pConn-〉Release();
            pConn=NULL;
        }
    ::CoUninitialize ();


这是一个基本的思路和方法,对于连接其它类型的数据库,都是相似的,只是改变连接字符串就可以了。当然,SQL的差别,就另当别论了。

可以看出,C++使用ADO,和VB、DELPHI等等语言是很相似的。因为ADO是“标准”的,是吧。
阅读(463) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~