在VC中使用ADO开发数据库应用程序
- 格式:pdf
- 大小:8.69 KB
- 文档页数:3
VC中使⽤ADO的⽅法ADO中打开⼀个连接:pConnection->ConnectionString = "这⾥的字符串有下⾯四种写法"; //对连接字符串赋值pConnection->Open(ConnectionString,"","",adModeUnknown); //连接数据库第⼆三个参数分别为⽤户的ID与密码,因为在连接字符串ConnectionCstring中已经设置好了,这⾥可以为空。
第四个参数可以取下⾯两个参数:adAsyncConnect,异步打开数据库,在ASP中直接⽤16。
adConnectUnspecified,同步打开数据库,在ASP中直接⽤-1。
ConnectionString根据不同的数据源,分别对应不同的写法(要记下来很困难,可以在VB中利⽤ADO控件先连接好,再将其拷贝在VC中,这样不容易出错) 1)访问Access 2000 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=userName;Password=userPassWord" 2)访问ODBC数据 "Provider=MADASQL;DSN=dsnName;UID=userName;PWD=userPassword;" 3)访问Oracle数据库 “Provider=MSDAORA;Data Sourse=serverName;User ID=userName;Password=userPassword;" 4)访问MS SQL数据库 "Provider=SQLOLEDB,Data Source=serverName;Initial Catalog=databaseName;User ID=userName;Password=userPassword;" 使⽤ADO开发应⽤程序有两种⽅法,⼀种是直接在应⽤程序中使⽤ADO数据控件,该⽅法最简单,⽆需编写⼀⾏代码即可实现对数据库的访问,另⼀种⽅法是直接使⽤ADO对象实现对数据库的操作,该⽅法较复杂,但可以让程序员更深⼊的控制数据库。
ADO在VC++中的应用摘要介绍了ADO的特点和在VC++中如何通过ADO开发数据库应用程序。
ADO是开发访问OLE数据库应用程序所利用的一种数据库访问组件,是一种能够访问各类数据类型的连接机制。
它不仅能够通过OLEDB、ODBC访问数据库,还能够利用几乎任何一种数据源,如SQLServer、Oracle、Access、Excel和文本文件、图形文件等。
ADO 基于OLEDB,提供统一的数据访问接口,利用简单,容易把握。
关键词ADO;数据库;应用程序的开发;VC++1引言ADO是Microsoft公司新的数据访问技术,由于它是基于OLEDB接口上实现的COM对象,其性能和易用性都达到了极佳水平。
ADO并非与数据库直接打交道,而是要通过ODBC驱动程序或OLEDB连接字符串来操作数据库。
ODBC或OLEDB是应用程序与数据库进行连接通信的接口,其作用是将特定类型数据库中的数据变换为标准而能统一操作的数据源。
利用ADO对象并通过ODBC或OLEDB,能够实现对任意数据库的存取和访问。
ADO模型包括7个对象,要紧对象有3个:Connection、Command和Recordset,能够被独立创建和释放。
另外,还包括其他4个集合对象:Fields、Errors、Parameters和Properties。
一个典型的ADO应用程序利用Connection对象成立与数据源的连接,然后用一个Command 对象给出对数据库操作的命令,如插入数据或查询数据等,而Recordset用于对结果集进行保护或阅读等操作。
其中Command命令所利用的语言与低层所对应的OLEDB数据源有关,不同的数据源能够利用不同的命令语言,关于关系数据库,通常利用SQL作为命令语言。
2VC++中利用ADO开发数据库应用程序一样步骤在VC++中利用ADO开发数据库应用程序一样包括以下步骤:(1)初始化COM库,引入ADO库概念文件。
(2)用Connection对象连接数据库。
VC中使用ADO控件的基本功能ADO(ActiveX Data Objects)是一组可以访问数据库的组件,它提供了一种统一的接口,允许开发者使用不同的编程语言对各种类型的数据存储进行访问和操作。
在VC中使用ADO控件可以方便地进行数据库操作,本文将介绍ADO的基本功能及相关用法。
1.引入ADO库在VC项目中使用ADO之前,首先需要引入ADO库。
可以通过以下步骤引入ADO库:a)打开VC中的项目;b)选择“项目”->“属性”;c)在属性对话框中选择“配置属性”->“常规”->“使用MFC”;d)在“使用MFC”中选择“使用共享DLL”,并点击“应用”;e)在属性对话框中选择“配置属性”->“链接器”->“输入”;f) 在“附加依赖项”中加入“odbc32.lib”和“odbccp32.lib”;g)点击“应用”和“确定”。
2.连接数据库使用ADO控件前,需要建立与数据库的连接。
连接数据库常用的一种方法是使用连接字符串。
连接字符串是一串字符,包含了数据库的相关信息,如数据库类型、地址、用户名、密码等。
可以使用以下代码建立与数据库的连接:```cpp#include <windows.h>void ConnectToDatabase_ConnectionPtr pConn;HRESULT hr = pConn.CreateInstance(__uuidof(Connection));if (SUCCEEDED(hr))_bstr_t connStr = "Provider=SQLOLEDB;DataSource=YourServerName;Initial Catalog=YourDatabaseName;UserId=YourUserId;Password=YourPassword;";hr = pConn->Open(connStr, "", "", adConnectUnspecified);if (SUCCEEDED(hr))//连接成功,可以进行数据库操作}}```在代码中,使用_ConnectionPtr表示连接对象,CreateInstance函数创建连接对象的实例,并使用Open函数打开数据库连接。
在VC++中使用ADO访问Access数据库摘要ADO具有易于使用、速度快、内存支出少和磁盘痕迹小的有点。
并且提供了轻量高性能的接口。
ADO(ActiveEx Data Object)是Microsoft数据库应用程序开发接口,是建立在OLE DB之上的高层数据访问技术。
即使我们对OLE DB 和COM不了解,也能轻松使用ADO,因为它非常的简单易用,甚至比以前的ODBC API、DAO都要容易使用,并不适灵活性。
同时它也提供了多语言访问技术包括Visual C++,Visual Basic和VBA等。
使用ADO编程一般有以下几个步骤组成:(1)连接到一个数据源;(2)打开指定的数据集;(3)执行所需的查询;(4)把数据检索到一个能够在C++代码中很容易访问的对象中;(5)提供检测错误的一般方法。
2.ADO对象的详细介绍如下表:使用Command对象查询数据库并返回 Recordset 对象中的记录,以便执行大量操作或处理数据库结构。
可以使用Command对象的集合、方法、属性进行下列操作:∙使用CommandText属性定义命令(例如,SQL 语句)的可执行文本。
∙通过Parameter对象和Parameters集合定义参数化查询或存储过程参数。
∙可使用Execute方法执行命令并在适当的时候返回Recordset对象。
∙执行前应使用CommandType属性指定命令类型以优化性能。
∙使用Prepared属性决定提供者是否在执行前保存准备好(或编译好)的命令版本。
∙使用CommandTimeout属性设置提供者等待命令执行的秒数。
∙通过设置ActiveConnection属性使打开的连接与Command 对象关联。
∙设置Name属性将Command标识为与Connection对象关联的方法。
∙将Command对象传送给Recordset的Source属性以便获取数据。
注意如果不想使用Command对象执行查询,请将查询字符串传送给Connection对象的Execute方法或Recordset对象的Open方法。
一、ADO概述ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口。
ADO 使您能够编写应用程序以通过 OLE. DB 提供者访问和操作数据库服务器中的数据。
ADO 最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。
ADO 在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。
之所以称为 ADO,是用了一个比较熟悉的暗喻,OLE 自动化接口。
OLE DB是一组”组件对象模型”(COM) 接口,是新的数据库低层接口,它封装了ODBC的功能,并以统一的方式访问存储在不同信息源中的数据。
OLE DB是Microsoft UDA(Universal Data Access)策略的技术基础。
OLE DB 为任何数据源提供了高性能的访问,这些数据源包括关系和非关系数据库、电子邮件和文件系统、文本和图形、自定义业务对象等等。
也就是说,OLE DB 并不局限于 ISAM、Jet 甚至关系数据源,它能够处理任何类型的数据,而不考虑它们的格式和存储方法。
在实际应用中,这种多样性意味着可以访问驻留在 Excel 电子数据表、文本文件、电子邮件/目录服务甚至邮件服务器,诸如 Microsoft Exchange 中的数据。
但是,OLE DB 应用程序编程接口的目的是为各种应用程序提供最佳的功能,它并不符合简单化的要求。
您需要的API 应该是一座连接应用程序和OLE DB 的桥梁,这就是 ActiveX Data Objects (ADO)。
二、在VC中使用ADO(开发步骤如下:)1、引入ADO库文件使用ADO前必须在工程的stdafx.h头文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。
代码如下所示://用#import引入ADO库文件#import "c:\program files\common files\system\ado\msado15.dll" \no_namespaces \rename("EOF" adoEOF")这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。
VC用ADO打开和关闭数据库初始化:1.找到"stdafx.h"文件,并添加代码:#import "C:\WINDOWS\system32\msado15.dll" \no_namespace \rename ("EOF", "adoEOF")解释:"EOF"-"End Of Line"即是否为数据库的最后一行。
2.在"Dlg.h"文件中进行对象定义:public:_ConnectionPtr m_Connection; //连接数据库_RecordsetPtr m_pRecordset; //记录集解释:“m_Connection”负责数据库连接的操作,以及使用m_Connection.Execute()等操作;“m_pRecordset”负责进行数据集的绑定,一般使用为m_pRecordset.Open()等操作;3.在"Dlg.cpp"找到"OnInitDialog()"函数,并添加代码如下:SetIcon(m_hIcon, FALSE); // 设置小图标///数据库初始化部分::CoInitialize(NULL); //初始化COM环境,只在对话框建立的时候才进行HRESULT hr;try{hr = m_Connection.CreateInstance("ADODB.Connection"); //初始化Connection对象实例,不随时释放if(SUCCEEDED(hr)){hr = m_Connection->Open(L"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=MyDBAccess.mdb",L"",L"",adModeUnknown);}m_pRecordset.CreateInstance("ADODB.Recordset"); //初始化对象数据集,不随时释放m_pRecordset->Open("SELECT * FROM 雇员",m_Connection.GetInterfacePtr(),adOpenDynamic,adLockOptim istic,adCmdText); //随时可以使用m_pRecordset->Close()进行关闭}catch(_com_error &e){CString errormessage;errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());AfxMessageBox(errormessage);///显示错误信息}解释:::CoInitialize(NULL); -- 进行COM口的初始化,非常重要的一步;m_Connection.CreateInstance("ADODB.Connection"); --实例化"连接";m_Connection->Open(); --打开连接;m_pRecordset.CreateInstance("ADODB.Recordset"); --实例化"数据集";m_pRecordset->Open(); --绑定数据集4.在"WM_CLOSE"对应的"OnClose()"函数中进行"释放"操作:m_pRecordset->Close();m_Connection->Close();::CoUninitialize(); //关闭COM环境CDialog::OnClose();解释:之所以将这部分归结到初始化中,原因在于此部分实在是很重要,并且容易遗忘,一旦忽略此部分,系统将持续报错.(关闭连接,关闭数据集,关闭COM环境)到此为止,整个的初始化部分就完成了摘自踏雪无痕的专栏。
VC++ ADO连接数据库操作(1)、引入ADO类#import "c:/program files/common files/system/ado/msado15.dll" /no_namespace /rename ("EOF", "adoEOF")(2)、初始化COM在MFC中可以用AfxOleInit();非MFC环境中用:CoInitialize(NULL);CoUnInitialize();(3)#import 包含后就可以用3个智能指针了:_ConnectionPtr、_RecordsetPtr和_CommandPtr 1.连接和关闭数据库(1)连接例子:连接ACCESS数据库AfxOleInit();//初始化HRESULT hr;try{hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象if(SUCCEEDED(hr)){m_pConnection->ConnectionTimeout = 0;hr = m_pConnection->Open( "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=db.mdb", "", "", adModeUnknown);//m_pConnection->PutDefaultDatabase ((_bstr_t)"DB");//设置默认数据库m_pCommand.CreateInstance(__uuidof(Command));m_pCommand->CommandTimeout = 5;m_pCommand->ActiveConnection = m_pConnection;}}catch(_com_error e)///捕捉异常{CString errormessage;errormessage.Format("连接数据库失败!/r/n错误信息:%s",e.ErrorMessage()); AfxMessageBox(errormessage);///显示错误信息}(2)、关闭//如果数据库连接有效if( m_pConnection->State )m_pConnection->Close();m_pConnection = NULL;(3)、设置连接时间//设置连接时间-----------------------------------pConnection->put_ConnectionTimeout(long(5));2.打开一个结果集(1)打开,首先创建一个_RecordsetPtr实例,然后调用Open()得到一条SQL语句的执行结果_RecordsetPtrm_pRecordset;m_pRecordset.CreateInstance(__uuidof(Recordset));// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,// 因为它有时会经常出现一些意想不到的错误。
VC++中使用ADO方式操作ACCESS数据库ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,即使你对OLE DB,COM不了解也能轻松对付ADO,因为它非常简单易用,甚至比你以往所接触的ODBC API、DAO、RDO都要容易使用,并不失灵活性。
本文详细地介绍在Visual C++开发环境下如何使用ADO来进行数据库应用程序开发,并给出示例代码。
为了使读者朋友都能测试本例提供的代码,我们采用Access数据库,您可以直接在我们提供的示例代码中找到这个test.mdb。
程序编译运行后的效果如图一所示:图一、ADO操作ACESS数据库的界面效果图一、实现方法万事开头难,任何一种新技术对于初学者来说最重要的还是"入门",掌握其要点。
让我们来看看ADO 数据库开发的基本流程吧!它的基本步骤如下:(1)初始化COM库,引入ADO库定义文件(2)用Connection对象连接数据库(3)利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。
(4)使用完毕后关闭连接释放对象。
下面我们将详细介绍上述步骤并给出相关代码。
1、COM库的初始化我们可以使用AfxOleInit()来初始化COM库,这项工作通常在CWinApp::InitInstance()的重载函数中完成,请看如下代码:BOOL CADOTest1App::InitInstance(){AfxOleInit();......}2、用#import指令引入ADO类型库为了引入ADO类型库,需要在项目的stdafx.h文件中加入如下语句:#import "c:program filescommon filessystemadomsado15.dll"no_namespace rename("EOF","adoEOF")这一语句有何作用呢?其最终作用同我们已经十分熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh,ado15.tli两个C++头文件来定义ADO库。
VC 使用ADO连接数据库的问题!error C2059 语法错误“<LVC 使用ADO连接数据库的问题!error C2059: 语法错误: “<L_TYPE_raw>”.2012-08-08 10:272006人阅读评论(1)收藏举报数据库cmicrosoftsystemincludemfc在stafx.h中添加#import "C:\Program Files\CommonFiles\System\ado\msado15.dll" no_namespacerename("EOF", "adoEOF")错误提示:1>d:\documents\codes\ch15demo1\ch15demo1\debug\msado15.tlh(2373) : error C2059: 语法错误:“<L_TYPE_raw>”1>d:\documents\codes\ch15demo1\ch15demo1\debug\msado 15.tlh(2373) : error C2238: 意外的标记位于“;”之前1>d:\program files\microsoft visual studio9.0\vc\atlmfc\include\afxv_w32.h(16) : fatal error C1189:#error : WINDOWS.H already included. MFC apps must not #include <windows.h>解决办法如下:#import "c:\program files\commonfiles\system\ado\msado15.dll" named_guidsrename_namespace("ADOCG") rename("EOF", "EndOfFile") rename("BOF","FirstOfFile")using namespace ADOCG;添加到stafx.h的最后面上一篇CTime 使用总结下一篇优秀程序员的十个习惯。
VC中使用ADO进行数据库开发的一些资料的整理1.导入ado库在StdAfx.h中,加入如下代码#import "c:\program files\common files\system\ado\msado15.dll" \no_namespace rename("EOF","adoEOF") renam e("BOF","adoBOF") 初试化在app的InitInstance中,加入AfxOleInit();(MFC)或者CoInitialize(NULL)如果用了CoInitialize退出时,要调用CoUninitialize()注意,如果在线程中也使用了com,那么在线程中也要用CoInitialize初始3.连接数据库_ConnectionPtr m_pAppConn;hResult = m_pAppConn.CreateInstance(_T("ADODB.Connection"));///创建Connection对象然后连接之m_pAppConn->Open("Provider=Microsoft.Jet.OLEDB.4.0 ; \Data Source = .\\DataBase\\aa.mdb","","",adModeUnknown);BOOL OpenConnect(){HRESULT hResult;CloseConnect();try{hResult = m_pAppConn.CreateInstance(_T("ADODB.Connection"));///创建Connection对象 if(SUCCEEDED(hResult)){m_pAppConn->Open("Provider=Microsoft.Jet.OLEDB.4.0 ; \Data Source = .\\DataBase\\aa.mdb","","",adModeUnknown);}}catch(_com_error e)///捕捉异常{CString errormessage;errormessage.Format(_T("连接数据库失败!\r\n错误信息:%s"),e.ErrorMessage()); AfxMessageBox(errormessage);hResult = -1L;}return (SUCCEEDED(hResult) ? TRUE : FALSE);}这里连接的数据库是access数据库,在工程目录下的DataBase\aa.mdb关键连接的字符窜,如果是accessProvider=Microsoft.Jet.OLEDB.4.0;Data Source=\\192.168.1.1\DataBase\aa.mdb; 这是局域网上的文件Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\DataBase\\aa.mdb;本机上的如果是sql 2000Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Password=sa;Initial Catalog=aa;Data Source=192.168.1.1;数据库在192.168.1.1上,数据库名字是aa4.关闭连接BOOL CloseConnect(){HRESULT hResult=0;try{if(m_pAppConn!=NULL){if(m_pAppConn->State!=adStateClosed){hResult=m_pAppConn->Close();}m_pAppConn.Release();}}catch(_com_error e){_bstr_t bstrSource(e.Source());_bstr_t bstrDescription(e.Description());TRACE(_T("\n Source : %s \n Description : %s\n"),(LPCSTR)bstrSource,(LPCSTR)bstrDescription);hResult=-1L;}return (SUCCEEDED(hResult) ? TRUE : FALSE);}5.使用recodeset打开记录_variant_t RecordsAffected;_RecordsetPtr pRecordset = NULL;strSql = _T("SELECT field FROM table");pRecordset.CreateInstance(_uuidof(Recordset));pRecordset = pConn->Execute (_bstr_t(strSql) , &RecordsAffected , adCmdUnknown); 其中&RecordsAffected 可以获得有多少记录返回,这是记录的影像数目6.关闭记录集if(pRecordset != NULL && pRecordset->State){pRecordset->Close();pRecordset = NULL;}7.判断是否为空if (pRecordset->adoBOF && pRecordset->adoEOF) {//MessageBox("没有符合条件的记录存在!","提示");if(pRecordset != NULL && pRecordset->State){pRecordset->Close();pRecordset = NULL;}return;}8,从记录集取数据_variant_t var;pRecordset->MoveFirst();for(;!pRecordset->adoEOF;pRecordset->MoveNext()) {var = pRecordset->GetCollect(_T("field"));}9.几种常见数据的转换如果是字符窜的字段var = pRecordset->GetCollect(_T("field"));if(var.vt!=VT_NULL){str= (LPCTSTR)_bstr_t(var);}if(var.vt!=VT_NULL)判断是必须的,如果是空,转换会出错如果是int形int aa = atoi(str)_variant_t是个可变类型,支持很多种类型,10.使用command利用Command对象来执行SQL命令_CommandPtr m_pCommand;m_pCommand.CreateInstance("mand");_variant_t vNULL;vNULL.vt = VT_ERROR;vNULL.scode = DISP_E_PARAMNOTFOUND;///定义为无参数m_pCommand->ActiveConnection = m_pConnection;///非常关键的一句,将建立的连接赋值给它m_pCommand->CommandText = "SELECT * FROM users";///命令字串m_pRecordset = m_pCommand->Execute(&vNULL,&vNULL,adCmdText);///执行命令,取得记录集如果使用记录集的open来打开command对象.如果在Source 参数中传送 Command 对象并且同时传递ActiveConnection 参数,那么将产生错误。
本文由wby272400贡献 ppt1。
在VC中使用ADO开发数据库 VC中使用 中使用ADO开发数据库 应用程序 一、ADO概述 ADO概述 ADO是Microsoft为最新和最强大的数据访问范例OLE DB 而 设计的,是一个便于使用的应用程序接口。
ADO 使您能够编写应 用程序以通过 OLE.DB 提供者访问和操作数据库服务器中的数据。
ADO 最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹 小。
ADO 在关键的应用方案中使用最少的网络流量,并且在前端 和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性 能的接口。
OLE DB是一组”组件对象模型”(COM) 接口,是新的数据库 低层接口,它封装了ODBC的功能,并以统一的方式访问存储 在不同信息源中的数据。
OLE DB是Microsoft UDA(Universal Data Access)策略的技术基础。
OLE DB 为任何数据源提供了高 性能的访问,这些数据源包括关系和非关系数据库、电子邮件 和文件系统、文本和图形、自定义业务对象等等。
也就是说, OLE DB 并不局限于 ISAM、Jet 甚至关系数据源,它能够处理 任何类型的数据,而不考虑它们的格式和存储方法。
在实际应 用中,这种多样性意味着可以访问驻留在 Excel 电子数据表、 文本文件、电子邮件/目录服务甚至邮件服务器,诸如 Microsoft Exchange 中的数据。
但是,OLE DB 应用程序编程接口的目的是为各种应用程 序提供最佳的功能,它并不符合简单化的要求。
您需要的 API 应该是一座连接应用程序和 OLE DB 的桥梁,这就是 ActiveX Data Objects (ADO)。
VC中使用 中使用ADO 二、在VC中使用ADO 1、引入ADO库文件 、引入 库文件 使用ADO前必须在工程的stdafx.h文件里用直接引入符号 #import引入ADO库文件,以使编译器能正确编译。
代码如 下所示: 代码1: 引入ADO库文件 代码 :用#import引入 引入 库文件 #import "c:\program files\common files\system\ado\msado15.dll" no_namespaces rename("EOF" adoEOF") 这行语句声明在工程中使用ADO,但不使用 这行语句声明在工程中使用 ,但不使用ADO的名字 的名字 空间,并且为了避免常数冲突,将常数EOF改名为 空间,并且为了避免常数冲突,将常数 改名为 adoEOF。
现在不需添加另外的头文件,就可以使用 。
现在不需添加另外的头文件,就可以使用ADO 接口了。
接口了。
2、初始化OLE/COM库环境 初始化OLE/COM库环境 必须注意的是,ADO库是一组COM动态库,这意味 应用程序在调用ADO前,必须初始化OLE/COM库环境。
在 MFC应用程序里,一个比较好的方法是在应用程序主类的 InitInstance成员函数里初始化OLE/COM库环境。
代码2:初始化OLE/COM库环境 代码 :初始化 库环境 BOOL CADOApp:: ::InitInstance() :: { if(!AfxOleInit()) { AfxMessageBox(“OLE初始化出错 初始化出错!”); 初始化出错 return FALSE; } …… } 函数AfxOleInit在每次应用程序启动时初始化 OLE/COM库环境。
同DAO和CDatabase一样,ADO由几个接口组成: _ConnectionPtr,_CommandPtr和_RecordsetPtr. 和 不同于DAO和Cdatabase的是,ADO基于 的是, 基于COM的接 不同于 和 的是 基于 的接 因此,假如你没有接触过COM,你应该在使用 口,因此,假如你没有接触过 ,你应该在使用ADO前 前 先找有关书籍了解一下COM。
先找有关书籍了解一下 。
3、ADO接口简介 、 接口简介 ADO库包含三个基本接口:_ConnectionPtr接口、 _CommandPtr接口和_RecordsetPtr接口。
_ConnectionPtr接口返回一个记录集或一个空指针。
通 常使用它来创建一个数据连接或执行一条不返回任何结果的 SQL语句,如一个存储过程。
使用_ConnectionPtr接口返回一 个记录集不是一个好的使用方法。
通常同CDatabase一样,使 用它创建一个数据连接,然后使用其它对象执行数据输入输 出操作。
_CommandPtr接口返回一个记录集。
它提供了一种简 单的方法来执行返回记录集的存储过程和SQL语句。
在使用 _CommandPtr接口时,你可以利用全局_ConnectionPtr接口, 也可以在_CommandPtr接口里直接使用连接串。
如果你只执 行一次或几次数据访问操作,后者是比较好的选择。
但如果 你要频繁访问数据库,并要返回很多记录集,那么,你应该 使用全局_ConnectionPtr接口创建一个数据连接,然后使用 _CommandPtr接口执行存储过程和SQL语句。
_RecordsetPtr是一个记录集对象。
与以上两种对象 相比,它对记录集提供了更多的控制功能,如记录锁定, 游标控制等。
同_CommandPtr接口一样,它不一定要使用 一个已经创建的数据连接,可以用一个连接串代替连接 指针赋给_RecordsetPtr的connection成员变量,让它自己 创建数据连接。
如果你要使用多个记录集,最好的方法 是同Command对象一样使用已经创建了数据连接的全局 _ConnectionPtr接口,然后使用_RecordsetPtr执行存储过程 和SQL语句。
4、使用_ConnectionPtr接口 、使用 接口 _ConnectionPtr是一个连接接口,它类似于 CDatabase和CDaoDatabase。
它们的工作原理相似。
首先 创建一个_ConnectionPtr接口实例,接着指向并打开一个 ODBC数据源或OLE DB数据提供者(Provider)。
以下代码 和CDaoDatabase分别创建一个基于DSN和非DSN的数据 连接。
代码3:使用 代码 使用CDaoDatabase(基于 使用 (基于DSN) ) CDaoDatabase MyDb = new CDaoDatabase(); MyDb.Open(NULL,FALSE,FALSE,"ODBC;DSN=sam p;UID=admin;PWD=admin"); 代码4:使用 代码 使用CDaoDatabase(基于非 使用 (基于非DSN) ) CDaoDatabase MyDb = new CDaoDatabase(); MyDb.Open(NULL,FALSE,FALSE,"ODBC;DRIVER ={SQL Server};SERVER=server; DATABASE=samp;UID=admin;PWD=admin"); 代码5:使用 基于DSN) 代码 使用_ConnectionPtr(基于 使用 基于 _ConnectionPtr MyDb; MyDb.CreateInstance(__uuidof(Connection)); MyDb->Open("DSN=samp;UID=admin;PWD=admin", "","",-1); 代码6:使用 基于非DSN) 代码 使用_ConnectionPtr (基于非 使用 基于非 _ConnectionPtr MyDb; MyDb.CreateInstance(__uuidof(Connection)); MyDb->Open("Provider=SQLOLEDB;SERVER=server;D ATABASE=samp;UID=admin; PWD=admin","","",-1); 5、使用_RecordsetPtr接口 、使用 接口 _RecordsetPtr接口的使用方法和CDaoDatabase类似, 通过以下代码的比较,你会发现使用_RecordsetPtr接口非常 简单(以下代码使用上面已经创建的数据连接): 代码7:使用 执行SQL语句 代码 使用CDaoDatabase执行 使用 执行 语句 CDaoRecordset MySet = new CDaoRecordset(MyD b); MySet->Open(AFX_DAO_USE_DEFAULT_TYPE," SELECT * FROM t_samp"); 代码8:使用 代码 使用_RecordsetPtr执行 执行SQL语句 语句 使用 执行 _RecordsetPtr MySet; MySet.CreateInstance(__uuidof(Recordset)); MySet->Open("SELECT * FROM some_table", MyDb.GetInterfacePtr(),adOpenDynamic,adLockO ptimistic,adCmdText); 现在我们已经有了一个数据连接和一个记录集,接下来 就可以使用数据了。
从以下代码可以看到,使用ADO的 _RecordsetPtr接口,就不需要象DAO那样频繁地使用大 而复杂的数据结构VARIANT,并强制转换各种数据类 型了,这也是ADO的优点之一。
假定程序有一个名称为 m_List的的ListBox控件,下面代码我们用_RecordsetPtr 接口获取记录集数据并填充这个ListBox控件: 代码9:使用 代码 使用DAO访问数据 使用 访问数据 VARIANT * vFieldValue; COleVariant covFieldValue; CString Holder; while(!MySet->IsEOF()) { MySet->GetFieldValue("FIELD_1", covFieldValue); vFieldValue = (LPVARIANT)covFieldValue; if(vFieldValue->vt!-VT_NULL) { Holder.Format("%s",vFieldValue->pbVal); m_List.AddString(Holder); } MySet.MoveNext(); } 代码10:使用 使用ADO访问数据 代码 使用 访问数据 _variant_t Holder try{ while(!MySet->adoEOF) { Holder = MySet->GetCollect("FIELD_1"); if(Holder.vt!=VT_NULL) m_List.AddString((char*)_bstr_t(Holder)); MySet->MoveNext(); } } catch(_com_error * e) { CString Error = e->ErrorMessage(); AfxMessageBox(e->ErrorMessage()); } catch(……) { MessageBox("ADO发生错误 发生错误!"); 发生错误 } 必须始终在代码中用try和 来捕获ADO错误 否 错误,否 必须始终在代码中用 和catch来捕获 来捕获 错误 错误会使你的应用程序崩溃。