VC-----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的通知事件,绑定数据,设置过滤条件,索引和排序,事务处理。(略去,请参考其它资料)

原文地址

(1)建立ODBC数据源。

参考方法:http://www.gz9f.com/jiaocai/hcc/hcc6/hcc6-p1/hcc6-p1.htm

牢记:在此之前要把自己的数据库服务器启动,不然在服务器选择的时候看不到自己的服务器。

(2)

   在工程的stdafx.h里用#import引入ADO库文件。
  
  #import "C:/Program Files/Common Files/System/ado/msado15.dll" no_namespace rename("BOF","adoBOF") rename("EOF","adoEOF")

   牢记:一定要在所有的#include后加入这句话,不然会出现。fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not #:nclude <windows.h>

我是参考了如下文章:http://www.allife.org/index.php?job=art&articleid=a_20060116_134912

原文引用如下:

非MFC工程使用MFC库时的问题及解决办法

2006年1月16日13:49星期一  [笔记]

文章来源:李世平的专栏

一、问题由来

 

vc6vc71的工程向导中都包含非MFC的工程,诸如win32 console project, win32 static library。非MFC工程创建时是不支持MFC特性的,然后我们在处理实际问题时有时会用到MFC相关类,如Cstring, Cedit等等,这是很正常的。可能有人会说,为何不在一开始就创建MFC工程呢?问题在于MFC工程会产生很多向导生成代码,如基于单文档的工程会有View,Doc等类,很多时候我们只需要一个空工程就可以了。

 

 

二、常见问题

MFC工程使用MFC库时最常见的问题就是windows.h重复包含错误,具体如下:

fatal error C1189: #error :  WINDOWS.H already included.  MFC apps must not #include <windows.h>

 

 

三、解决办法

MFC工程使用MFC库时,可参考以下步骤

1、工程设置中,将MFC的使用由原来的“使用标准windows库”改为“在共享DLL中使用MFC”(VC71

如果是英文版,相关选项是:

Microsoft Foundation Classes: Use MFC in a shared dll, no using MFCVC6

NOTE:因为我用的是中文版的vc71,英文版的vc6.

2、头文件包含

不同的MFC类需包含的头文件是不一样的。

常用的类,如Cstring, Cedit 等,包含afxwin.h就可以了

如果不清楚包含什么头文件的话,可以同msdn进行查询,msdn中,对于MFC类的介绍中,都会给出相应的header file requirement.

3、#include 语句一定要写在首行

这一点很重要,通常出现前面讲到的windows.h重复包含错误,都是因为#include 语句没有写在首行。

另外还要注意的是,如果#include语句是在一个头文件里,那么对应头文件的包含也要写在首行。示例如下:

=============

test.h文件的内容如下:

include <afxwin.h> //保证该语句在首行

test.cpp的文件内容如下:

#include “test.h” //同样也要保证该语句在首行

=============

ps: 这么做的具体原因我也不知道,我是在实际调试中琢磨出这个道理的。我自己在这个问题上花了很多冤枉时间,写下该篇,就是希望大家不要在这个问题上绊脚。

(3)在进行连接之前要初始化OLE环境,初始化语句

   ::CoInitialize(NULL); //初始化OLE/COM库环境 
  
  AfxOleInit();//初始化OLE/COM库环境(MFC自带的)

    这两句话缺一不可,不然会有运行期错误

    程序运行结束后记住::CoUninitialize();  //关闭OLE/COM库环境,释放资源

 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编 者 的 话 5 第1篇 基础篇 6 第1章 数据库原理与访问 7 1.1 数据库基本原理 7 1.1.1 概述 7 1.1.2 桌面数据库 7 1.1.3 对象数据库 8 1.1.4 关系数据库服务器 9 1.1.5 选择适用的数据库 9 1.2 数据库访问技术 10 1.2.1 概述 10 1.2.2 ODBC API 10 1.2.3 ODBC的MFC类 11 1.2.4 DAO与RDO 11 1.2.5 OLE DB与ADO 12 1.3 数据库操纵语言SQL 13 1.3.1 SQL命令 13 1.3.2 SQL从句 13 1.3.3 SQL运算符 14 1.3.4 SQL合计函数 14 1.4 小 结 14 第2章 COM与数据库访问 15 2.1 COM的基本原理 15 2.1.1 COM历史 16 2.1.2 COM结构 16 2.1.3 COM优势 17 2.1.4 COM接口 18 2.1.5 COM与数据库访问 19 2.1.6 COM与Internet 19 2.2 ACTIVEX的数据库访问 19 2.2.1 ActiveX简介 19 2.2.2 ActiveX对数据库访问的支持 20 2.3 ATL的数据库访问 20 2.3.1 ATL目标 20 2.3.2 ATL内容简介 22 2.3.3 ATL对数据库访问的支持 22 2.4 小 结 23 第3章 数据库开发过程 23 3.1 阶段1:调查与分析 24 3.2 阶段2:数据建模 24 3.3 阶段3:功能设计 24 3.4 阶段4:选择数据库系统 25 3.5 阶段5:选择数据库访问技术 25 3.6 阶段6:代码设计 25 3.7 阶段7:测试与调试 26 3.8 阶段8:发行产品 26 第4章 VC++数据库开发基础 26 4.1 VC++ 6.0工程创建向导 26 4.2 VC++ 6.0数据库新建工具 27 4.3 VC++ 6.0的数据库工程 29 4.4 小 结 31 第2篇 实例篇 32 第5章 ODBC API编程 33 5.1 了解ODBC API 34 5.2 ODBC API编程步骤 34 5.2.1 步骤1:连接数据源 34 5.2.2 步骤2:分配语句句柄 36 5.2.3 步骤3:准备并执行SQL语句 36 5.2.4 步骤4:获取结果集 37 5.2.5 步骤5:提交事务 38 5.2.6 步骤6:断开数据源连接并释放环境句柄 39 5.3 ODBC API编程实例 39 5.3.1 实例概述 39 5.3.2 实例实现过程 40 5.3.3 编译并运行ODBCDemo1工程 97 5.3.4 ODBCDemo1实例小结 98 5.4 本 章 小 结 99 第6章 MFC ODBC编程 100 6.1 了解MFC ODBC 100 6.1.1 CDatabase类 100 6.1.2 CRecordSet类 100 6.2 MFC ODBC数据库访问技术 101 6.2.1 记录查询 101 6.2.2 记录添加 102 6.2.3 记录删除 102 6.2.4 记录修改 102 6.2.5 撤销数据库更新操作 103 6.2.6 直接执行SQL语句 103 6.2.7 MFC ODBC的数据库操作过程 103 6.3 MFC ODBC编程实例 104 6.3.1 实例概述 104 6.3.2 实例实现过程 105 6.3.3 编译并运行ODBCDemo2工程 132 6.3.4 ODBCDemo2实例小结 137 6.4 本 章 小 结 137 第7章 DAO数据库编程 138 7.1 DAO的数据访问 138 7.1.1 DAO对象 138 7.1.2 MFC对DAO的支持 139 7.1.3 DAO与ODBC的比较 139 7.1.4 MFC的DAO类简介 139 7.2 DAO编程实例 142 7.2.1 实例概述 142 7.2.2 实例实现过程 143 7.2.3 运行DAODemo工程 167 7.2.4 DAODemo实例小结 171 7.3 小 结 172 第8章 OLE DB客户数据库编程 172 8.1 OLE DB原理 172 8.1.1 OLE DB与ODBC 172 8.1.2 OLE DB的结构 173 8.1.3 OLE DB的优越性 173 8.1.4 OLE DB对象 174 8.1.5 OLE DB客户模板结构 177 8.1.6 OLE DB客户模

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值