VC++ ADO连接SQL2000

VC++ ADO连接SQL2000
2010-11-04 11:44

1、使用ADO编程的方法有三种:
(1)使用预处理指令#import,例如:
#import "c:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF", "adoEOF") rename("BOF", "adoBOF")
程序在编译时读取msado15.dll中的类型库信息,自动生成两个该类型库的头文件和实现文件msado15.tlh和msado15.tli(在Debug或Release目录下)。两个文件中定义了ADO的所有对象和方法,以及一些枚举类型的变量,程序只要直接调用这些方法即可。
(2)通过读取msado15.dll中的类型库信息,建立一个ColeDispatchDriver类的派生类,然后通过它调用ADO对象。
(3)直接使用COM提供的API,例如:
CLSID clsid;
HRESULT hr = ::CLSIDFromProgID(L"ADODB.Connection", &clsid);
if (FAILED(hr))
{
...
}
::CoCreateInstance(clsid, NULL, CLSCTX_SERVER, IID_IDispatch, (void **)&pDispatch);
if (FAILED(hr))
{
...
}
前两种方法类似,第3种方法编程可能最麻烦,但效率最高,程序尺寸最小,并且对ADO的控制能力也最强。
2、以下使用#import方法操作数据库
(1)可以在stdafx.h的所有include指令之后import
(2)使用AfxOleInit()初始化COM库,通常在CwinApp::InitInstance的重载函数中添加。
(也可以使用::CoInitialize(NULL),之后在ExitInstance中调用::CoUninitialize)
(3)定义_ConnectionPtr变量后调用Connection对象的Open方法建立与服务器的连接。
数据类型_ConnectionPtr实际上是由类模板_com_ptr_t得到的一个具体的实例类。_ConnectionPtr类封装了Connection对象的Idispatch接口指针及其一些必要的操作。可以通过这个指针操纵Connection对象。
例如连接SQLServer数据库,代码如下:
// 连接到MS SQL Server
_ConnectionPtr pMyConnect = NULL;
HRESULT hr = pMyConnect.CreateInstance(__uuidof(Connection));
if (FAILED(hr))
return;

_bstr_t strConnect = "Provider=SQLOLEDB; Server=hch; Database=mytest; uid=sa; pwd=sa;";

try
{
// Open方法连接字串必须四BSTR或者_bstr_t类型
pMyConnect->Open(strConnect, "", "", NULL);
}
catch(_com_error &e)
{
MessageBox(e.Description(), "警告", MB_OK|MB_ICONINFORMATION);
}
(4)
//定义_RecordsetPtr变量,调用它Recordset对象的Open,即可打开一个数据集
_RecordsetPtr pRecordset;
if (FAILED(pRecordset.CreateInstance(__uuidof(Recordset))))
{
return;
}
try
{
pRecordset->Open(_variant_t("userinfo"), _variant_t((IDispatch*)pMyConnect),
adOpenKeyset, adLockOptimistic, adCmdTable);
}
catch (_com_error &e)
{
MessageBox("无法打开userinfo表", "系统提示", MB_OK|MB_ICONINFORMATION);
}
(5)
//定义_RecordsetPtr变量,调用它Recordset对象的Open,即可打开一个数据集
_RecordsetPtr pRecordset;
if (FAILED(pRecordset.CreateInstance(__uuidof(Recordset))))
{
return;
}
try
{
pRecordset->Open(_variant_t("userinfo"), _variant_t((IDispatch*)pMyConnect),
adOpenKeyset, adLockOptimistic, adCmdTable);
}
catch (_com_error &e)
{
MessageBox("无法打开userinfo表", "系统提示", MB_OK|MB_ICONINFORMATION);
}
(6)
// 读取当前记录集
try
{
pRecordset->MoveFirst();
while (pRecordset->adoEOF == VARIANT_FALSE)
{
// Fields是Recordset对象的容器,GetItem方法返回Field对象,Value是Field对象的属性,也可以用GetValue方法
CString sName = (char*)(_bstr_t)(pRecordset->Fields->GetItem(_variant_t("UserName"))->Value);
// 或者使用GetValue()
//CString sName = (char*)(_bstr_t)(pRecordset->Fields->GetItem(_variant_t("UserName"))->GetValue());
AfxMessageBox(sName);
pRecordset->MoveNext();
}
}
catch (_com_error &e)
{
MessageBox(e.Description(), "系统提示", MB_OK|MB_ICONINFORMATION);
}
(7)
// 修改记录
try
{
pRecordset->MoveFirst();
while(pRecordset->adoEOF == VARIANT_FALSE)
{
pRecordset->Fields->GetItem(_variant_t("Address"))->Value = _bstr_t("北京大学");
pRecordset->Update();
pRecordset->MoveNext();
}
}
catch (_com_error &e)
{
MessageBox(e.Description(), "系统提示", MB_OK|MB_ICONINFORMATION);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值