在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是“标准”的,是吧。
阅读(495) | 评论(0) | 转发(0) |