在VisualC中用ADO进行数据库编程.
- 格式:pdf
- 大小:85.31 KB
- 文档页数:16
MFC里用ADO方式连接数据库1.在stdafx.h文件中添加如下代码#import"c:\program files\common files\system\ado\msado15.dll" \no_namespace \rename ("EOF", "adoEOF")用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll的附属资源中,其中路径名可以根据自己系统安装的ADO支持文件的路径来自行设定。
当编译器遇到#import语句时,它会为引用组件类型库中的接口生成包装类,#import语句实际上相当于执行了API涵数LoadTypeLib()。
#import语句会在工程可执行程序输出目录中产生两个文件,分别为*.tlh(类型库头文件)及*.tli(类型库实现文件),它们分别为每一个接口产生智能指针,并为各种接口方法、枚举类型,CLSID等进行声明,创建一系列包装方法。
语句no_namespace说明ADO对象不使用命名空间,rename ("EOF", "adoEOF")说明将ADO中结束标志EOF改为adoEOF,以避免和其它库中命名相冲突。
2.定义_ConnectionPtr变量调用Connection对象的Open方法建立与服务器的连接。
UpdateData(true);//_ConnectionPtr m_pConnection;//声明一个Connection指针HRESULT hr=m_pConnection.CreateInstance("ADODB.Connection");//创建Connection对象//定义初始化的连接参数CStringstrConnection=_T("Provider=SQLOLEDB;Server=(local);Database=");//服务器名称为localstrConnection+=m_datasource;//数据库名称strConnection+=";User ID=";strConnection+=m_user; //登陆名strConnection+=";Password=";strConnection+=m_password; //登陆密码//把CString转换为 _bstr_t型_bstr_t bstrSRC(strConnection);//用try。
Visual C++中的ADO编程
陈涛
【期刊名称】《微型电脑应用》
【年(卷),期】2001(017)007
【摘要】ADO(SetFilter Database Connectivity,开放式数据库连接),是一种用来在相关或不相关的数据库管理系统(DBMS)中存取数据的标准应用程序接口(API).本文给出Windows95环境下用Visual C++进行ADO编程的具体方法及技巧.【总页数】3页(P63-64,62)
【作者】陈涛
【作者单位】湖北大学数学与计算机科学学院
【正文语种】中文
【中图分类】TP31
【相关文献】
1.Visual C++的ADO编程 [J], 王文甫;张战杰
2.Visual C++的ADO编程 [J], 王文甫;张战杰
3.ADO技术及其在VisUal C++环境下数据库编程中的应用 [J], 赵法信
4.基于Visual C++的ADO数据库编程 [J], 康梅娟;郭状先
5.在Visual C++中ADO对象如何访问数据库应用程序 [J], 孙超
因版权原因,仅展示原文概要,查看原文内容请购买。
在Visual C++中使用ADO在Visual C++中,要使用ADO对象,必须先在类的头文件中导入ADO的库文件,并包含头文件icrsint.h。
ADO数据绑定对话框向导可自动导入ADO对象库,并包含icrsint.h。
在对象Visual C++中,CADORecordBinding类实现了如何在Visual C++中使用ADO对象。
ADO数据绑定对话框向导建立了一个CADORecordBinding类的派生类CCustomRs。
CCustomRs类定义了与制定数据库表字段对应的数据成员,并将数据成员绑定到字段。
在CCustomRs类头文件RsCgDlg.h的头部,导入了ADO库:#import "C:/Program Files/Common Files/system/ado/msado15.dll" rename_namespace("ADOCG") rename("EOF", "EndOfFile")using namespace ADOCG;#include "icrsint.h"然后,向导定义了一个CRsCgDlg类,该类继承了CDialog(对话框类)和CCustomRs。
CRsCgDlg类定义了一个记录集对象指针m_pRs,如下:_RecordsetPtr m_pRs;_RecordsetPtr在CADORecordBinding类中被定义为ADO的Recordset对象指针。
通过m_pRs即可在对话框中使用ADO的Recordset对象访问数据库。
1.打开记录集首先要创建一个Connection对象实例,然后执行Open方法打开记录集。
例如:m_strConnection = _T("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=C://Documents and Settings//Administrator//桌面 //File.mdb;Persist SecurityInfo=False"); //定义连接字符串m_strCmdText = _T("F1");//定义命令文本内容m_pRs.CreateInstance(__uuidof(Recordset)); //创建Connection对象实例m_pRs->CursorLocation = adUseClient; //设置游标位置m_pRs->Open((LPCTSTR)m_strCmdT ext, //命令文本内容(LPCTSTR)m_strConnection, //连接字符串adOpenKeyset, //设置游标类型adLockReadOnly, //设置锁定类型adCmdTableDirect); //设置命令类型2.游标位置Connection对象的CursorLocation属性用于设置或返回游标位置,常数adUseClient表示使用本地游标库提供的客户端游标。
88 // // RADIO & TELEVISION INFORMATION // 2008年9月 // www.rti.cn目前用于数据库开发的前端工具的开发环境有Delphi、Visual FoxPro、Visual Basic、PowerBuilder以及SQL Server等。
随着Vi-sual C++的数据库开发功能的不断增强,它作为一种方便易用的前端开发工具在实际开发中被广泛应用。
它的优势集中体现在以下几个方面:1)简化的开发过程;2)灵活多变的开发方式;3)更快捷的数据库访问;4)更强的扩展性。
1 Visual C++进行数据库开发的常用技术1.1 ODBC APIODBC(Open Database Connectivity)是客户应用程序访问关系数据库时提供的一个统一的接口,对于不同的数据库,ODBC提供了一套统一的API,使应用程序可以应用所提供的API来访问任何提供了ODBC驱动程序的数据库,并且,ODBC已经成为一种标准,目前所有的关系数据库都提供了ODBC驱动程序,这使ODBC的应用非常广泛,基本上可用于所有的关系数据库。
但由于ODBC只能用于关系数据库,使得利用ODBC很难访问对象数据库及其他非关系数据库。
由于ODBC是一种底层的访问技术,因此,ODBC API可以使客户应用程序能够从底层设置和控制数据库,完成一些高层数据库技术无法完成的功能。
1.2 MFC ODBC(MicrosoftFoundation Class ODBC)ODBC虽然提供了一种统一访问数据库的接口,但是直接使用ODBC API创建应用程序需要编制大量的代码。
所以,VisualC++提供了MFC ODBC类,在MFC ODBC类中封装了ODBC API,提供了面向对象的数据库类,主要有三类:CDatabase、CRecordSet、CRecordView。
这使得创建数据库应用程序的过程大大简化。
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函数打开数据库连接。
一、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。
MFC中用ADO连接数据库(2012-04-12 15:50:06)分类:MFC标签:mfc杂谈一、数据库操作准备1、导入ADO动态链接库在工程的stdafx.h中加入如下语句:#import "c:\program files\common files\system\ado\msado15.dll" no_namespace\rename("EOF","adoEOF")这一语句有何作用呢?其最终作用同我们熟悉的#include类似,编译的时候系统会为我们生成msado15.tlh和msado15.tli两个C++头文件来定义ADO库,即加载ADO动态库(msado15.dll)。
其中,no_namespace表明不使用命名空间,rename("EOF","adoEOF")表明把ADO中用到的EOF改为adoEOF,防止发生命名冲突。
注意:该代码需要在一行中完成,如果写成两行或者多行,行末要加上“\”符号,表示把这几行看成一行,如本例。
2、初始化OLE/COM库环境在基于MFC的应用里,初始化OLE/COM库环境的一个比较好的位置是在应用类的InitInstance成员函数中,而且直接使用AfxOleInit,在退出应用时,该函数也负责COM资源的释放,将此函数添加在InitInstance中的如下位置:BOOL CExpApp::InitInstance(){AfxEnableControlContainer();//初始化OLE DLLsif(!AfxOleInit()){AfxMessageBox("初始化OLE DLL失败!");Return FALSE;}......}说明:也可以在InitInstance中使用::CoInitialize初始化OLE/COM库环境,但须在ExitInitInstance中使用::CoUninitialize释放占用的COM资源,显然使用AfxOleInit更为方便。
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()来捕获错误信息,// 因为它有时会经常出现一些意想不到的错误。
在Visual C++中用ADO进行数据库编程C++中用学习各种高级外挂制作技术,马上去百度搜索"魔鬼作坊",点击第一个站进入,快速成为做挂达人。
1.生成应用程序框架并初始化OLE/COM库环境创建一个标准的MFC AppWizard(exe应用程序,然后在使用ADO数据库的InitInstance 函数中初始化OLE/COM库(因为ADO库是一个COM DLL库。
本例为:BOOL CAdotestDlg::OnInitDialog({::CoInitialize(NULL;//初始化OLE/COM库环境}程序最后要调用::CoUninitialize(;//释放程序占用的COM资源。
另外:m_pRecordset->Close(;注意!!!不要多次关闭!!!!!!!!!!!!m_pConnection->Close(;m_pRecordset=NULL;m_pConnection=NULL;2.引入ADO库文件使用ADO前必须在工程的stdafx.h文件最后用直接引入符号#import引入ADO库文件,以使编译器能正确编译。
代码如下:#import"C:\Program Files\common files\system\ado\msado15.dll"no_namespace rename("EOF","adoEOF"ADO类的定义是作为一种资源存储在ADO DLL(msado15.dll中,在其内部称为类型库。
类型库描述了自治接口,以及C++使用的COM vtable接口。
当使用#import 指令时,在运行时Visual C++需要从ADO DLL中读取这个类型库,并以此创建一组C++头文件。
这些头文件具有.tli和.tlh扩展名,读者可以在项目的目录下找到这两个文件。
在C++程序代码中调用的ADO类要在这些文件中定义。
程序的第三行指示ADO对象不使用名称空间。
在有些应用程序中,由于应用程序中的对象与ADO中的对象之间可能会出现命名冲突,所以有必要使用名称空间。
如果要使用名称空间,则可把第三行程序修改为:rename_namespace("AdoNS"。
第四行代码将ADO 中的EOF(文件结束更名为adoEOF,以避免与定义了自己的EOF的其他库冲突。
3.利用智能指针进行数据库操作在CaboutDlg头文件中定义两个ADO智能指针类实例,并在对话框中加入一个ListCtrl。
class CAdotestDlg:public CDialog{_ConnectionPtr m_pConnection;_RecordsetPtr m_pRecordset;ClistCtrl m_List;......}ADO库包含三个智能指针:_ConnectionPtr、_CommandPtr和_RecordsetPtr。
_ConnectionPtr通常被用来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。
_CommandPtr返回一个记录集。
它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。
在使用_CommandPtr接口时,可以利用全局_ConnectionPtr 接口,也可以在_CommandPtr接口里直接使用连接串。
_RecordsetPtr是一个记录集对象。
与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定、游标控制等。
在使用ADO程序的事件响应中OnButton1加入以下代码:void CAdotestDlg::OnButton1({m_List.ResetContent(;m_pConnection.CreateInstance(_uuidof(Connection;//初始化Connection指针m_pRecordset.CreateInstance(_uuidof(Recordset;//初始化Recordset指针try{m_pConnection->Open("DSN=ADOTest","","",0;//连接叫作ADOTest的ODBC 数据源//注意:这是连接不需要用户ID或密码的open函数//否则形式为->Open("DSN=test;uid=sa;pwd=123;","","",0;//执行SQL语句得到一个记录集把其指针赋值给m_pRecordsetCString strSql="select*from middle";BSTR bstrSQL=strSql.AllocSysString(;m_pRecordset->Open(bstrSQL,(IDispatch*m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText;//adOpenDynamic:动态adLockOptimistic乐观封锁法adCmdText:文本查询语句while(!m_pRecordset->adoEOF//遍历所有记录{//取纪录字段值方式之一_variant_t TheValue;//VARIANT数据类型TheValue=m_pRecordset->GetCollect("BIG_NAME";//得到字段BIG_NAME的值if(TheValue.vt!=VT_NULLm_List.AddString((char*_bstr_t(TheValue;//将该值加入到列表控件中//取纪录字段值方式之二//_bstr_t TheValue1=m_pRecordset->Fields->GetItem("BIG_NAME"->Value;//CString temp=TheValue1.copy(;//m_List.AddString(temp;//数据类型转换_variant_t vUsername,vBirthday,vID,vOld;TRACE("id:%d,姓名:%s,年龄:%d,生日:%s\r\n",vID.lVal,(LPCTSTR(_bstr_tvUsername,vOld.lVal,(LPCTSTR(_bstr_tvBirthday; m_pRecordset->MoveNext(;//转到下一条纪录}m_pRecordset->Close(;m_pConnection->Close(;}catch(_com_error e//异常处理{AfxMessageBox(e.ErrorMessage(;}m_pRecordset->Close(;//注意!!!不要多次关闭!!!!否则会出错m_pConnection->Close(;m_pRecordset=NULL;m_pConnection=NULL;}程序中通过_variant_t和_bstr_t转换COM对象和C++类型的数据,_variant_t类封装了OLE自治VARIANT数据类型。
在C++中使用_variant_t类要比直接使用VARIANT数据类型容易得多。
好,编译后该程序就能运行了,但记住运行前要创建一个叫ADOTest的ODBC 数据源。
该程序将把表middle中的BIG_NAME字段值显示在列表控件中。
4.执行SQL命令并取得结果记录集为了取得结果记录集,我们定义一个指向Recordset对象的指针:_RecordsetPtr m_pRecordset;并为其创建Recordset对象的实例:m_pRecordset.CreateInstance("ADODB.Recordset"; SQL命令的执行可以采用多种形式,下面我们一进行阐述。
(1利用Connection对象的Execute方法执行SQL命令Execute方法的原型如下所示:_RecordsetPtr Connection15::Execute(_bstr_t CommandText,VARIANT* RecordsAffected,long Options其中CommandText是命令字串,通常是SQL命令。
参数RecordsAffected是操作完成后所影响的行数,参数Options表示CommandText中内容的类型,Options可以取如下值之一:adCmdText:表明CommandText是文本命令adCmdTable:表明CommandText是一个表名adCmdProc:表明CommandText是一个存储过程adCmdUnknown:未知Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。
_variant_t RecordsAffected;///执行SQL命令:CREATE TABLE创建表格users,users包含四个字段:整形ID,字符串username,整形old,日期型birthdaym_pConnection->Execute("CREATE TABLE users(ID INTEGER,username TEXT,old INTEGER,birthday DATETIME",&RecordsAffected,adCmdText;///往表格里面添加记录m_pConnection->Execute("INSERT INTOusers(ID,username,old,birthdayVALUES(1,'Washington',25,'1970/1/1'",&RecordsAffected,adCmdText;///将所有记录old字段的值加一m_pConnection->Execute("UPDATE users SET old=old+1",&RecordsAffected,adCmdText;///执行SQL统计命令得到包含记录条数的记录集m_pRecordset=m_pConnection->Execute("SELECT COUNT(*FROM users",&RecordsAffected,adCmdText;_variant_t vIndex=(long0;_variant_t vCount=m_pRecordset->GetCollect(vIndex;///取得第一个字段的值放入vCount变量上两句可以写成—_variant_t vCount= m_pRecordset->GetCollect((_variant_t((long0;m_pRecordset->Close(;///关闭记录集CString message;message.Format("共有%d条记录",vCount.lVal;AfxMessageBox(message;///显示当前记录条数(2利用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;///执行命令,取得记录集在这段代码中我们只是用Command对象来执行了SELECT查询语句,Command对象在进行存储过程的调用中能真正体现它的作用。