ADO数据库编程入门

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);
 }
(8)添加,删除,使用带参数的命令,相应ADO的通知事件,绑定数据,设置过滤条件,索引和排序,事务处理。(略去,请参考其它资料)

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值