ADO连接数据库.doc
《ADO连接数据库.doc》由会员分享,可在线阅读,更多相关《ADO连接数据库.doc(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、ADO数据库编程中大型的数据库管理信息系统(MIS)的开发,一般很少用VC来完成(因为开发效率低,不过运行效率很高),而是使用VB, C#,Java等开发效率较高的语言。但小型MIS系统完全可以用VC来实现。下面讲解VC中访问数据库的基本技术。一、四种数据库访问技术l ODBC(Open Database Connectivity)开放式数据库连接,是一种用来在数据库管理系统(DBMS)中存取数据的标准应用程序接口。有ODBC API和MFC ODBC两种开发技术。l DAO(Data Access Object )即数据访问对象集,是Microsoft提供的基于一个数据库对象集合的访问技术。
2、和ODBC一样,他们都是Windows API的一部分,可以独立于(DBMS)进行数据库的访问。DAO跟ODBC的区别是:访问机制不同!ODBC工作依赖于数据库制造商(MS SQL Server, Oracle,Sybase等)提供的驱动程序。使用ODBC API的时候,Windows的ODBC管理程序,把对数据库的访问请求传递给正确的驱动程序,驱动程序再使用SQL语句指示DBMS完成数据库访问工作。DAO则绕开中间环节,直接使用数据库引擎(Microsoft Jet Database Engine)提供的各种对象进行工作。速度比ODBC快。l OLE DB(Object Link and E
3、mbedding Database)非常底层,基于COM接口技术;功能强大灵活,但编程非常非常非常麻烦,使用ADO只需要3-5行代码的事情,用OLEDB却需要将近200-300行代码才能完成。WinCE目前不支持ADO,但支持OLEDB。推荐阅读文章:VC+实战OLEDB编程(一)至(九)l ADO(ActiveX Data Object)是建立在OLE DB之上的高层数据库访问技术,是对OLEDB的封装, 微软为我们提供了丰富的COM组件(包括ActiveX)来访问各种关系型/非关系型数据库。特点是简单、易用,这也是为什么大多数数据库应用软件开发者选择ADO的重要原因。下面重点讲解使用ADO
4、连接数据库的方法。二、ADO对象ADO是一个面向对象的COM组件库,用ADO访问数据库,其实就是利用ADO对象来操作数据库中的数据,所以我们首先要撑握ADO的对象。ADO对象有:l 连接对象(connection):连接对象用于与数据库建立连接,执行查询及进行事务处理。在连接时必须指定使用何种数据库的OLEDB供应者。l 命令对象(Command):可以执行数据库操作命令(如查询,修改,增加和删除)。用命令对象执行一个查询字串,可以返回一个记录集合。l 记录集对象(Recordset):用于表示查询返回的结果集,它可以在结果集中增加,删除,修改和移动记录。当建立一个记录集时,一个游标就自动建立
5、了,查询所产生的记录就放在本地的游标中,游标有四种类型:仅能向前移动的游标,静态游标,键集游标和动态游标。记录集对象是对数据库进行查询和修改的主要对象。l 字段对象(Fields字段集合对象,Field字段对象):字段对象用于表示数据库或记录集中的信息,包括列值等信息。一个记录集或一个数据库中的表包括了多行记录,若将其当做二维网格,字段将是网格中的列,每个字段分别有名称,数据类型和值等属性,字段中包括了来自数据库中的真实数据。要修改其中的数据可在记录集中修改Filed字段对象,也可以通过在记录集中访问Fields字段集合对象,再定位要修改的Filed字段对象。对记录集的修改将最终被传送给数据库
6、。l 参数对象(Parameter):是和命令对象联合使用的一个对象。当命令对象执行的查询是一个有参数的查询时,就要用参数对象来为命令对象提供参数信息和数据。下面我们先看一个简单的通过ADO控件访问数据库的例子,然后再学习如何通过上述ADO对象访问数据库。三、通过ADO控件访问数据库示例下面以Microsoft Office Access数据库为例,讲解通过ADO控件访问数据库的方法。这种方法基本不用编写代码,就可以完成对数据库的访问,非常方便。1、在Access中建立数据库student.mdb,并添加表stu_info,如下图:这里的字段名使用了中文,只是为了教学方便,建议在实际工作中使用
7、英文字段名。2、建立一个MFC对话框工程AdoCtrl。3、在对话框界面编辑器中增加如下的2个ADO控件:ADO Data控件,用于建立数据库连接。ADO DataGrid控件,用于表示一个结果记录集。在对话框编辑器中-右键菜单-选择Insert ActiveX Control-在出现的对话框中选择Microsoft ADO Data Control,Version 6.0-点OK,这样ADO Data控件IDC_ADODC1就加入到对话框中了;同样方法,选择Microsoft DataGrid Control,Version 6.0加入到对话框中。这样DataGrid控件IDC_DATAGR
8、ID1就加入到对话框中了。4、设置对话框中连接控件的属性设置ADO Data控件的属性:在属性对话框中选择Control页面,选择Use Connection String选项,点Build按钮,在出现的对话框中选择Microsoft Jet 4.0 OLEDB Provider提供者。点下一步,选择刚建立的Access数据库文件名称student.mdb。点测试连接,应能连接数据库通过。再次打开ADO Data控件的属性设置,选择RecordeSource页面,在Command Type中选择2-adCmdTable,在Table Or StoredProcedure Name中选择stu_
9、info表。设置DataGrid控件的属性:在属性对话框中选择Control页面,选中Allow AddNew和Allow Delete复选框,再选择All页面,设置DataSource参数为连接控件的ID即IDC_ADODC1。5、运行该程序将可以在对话框中连接数据库,并取出表中的数据显示在Grid控件中。如下图:四、预备知识:数据类型_bstr_t和_variant_tVC可以连接各种数据库,而不同数据库对数据类型的定义各有不同,为了在VC中对数据库中的各种类型进行统一的表达,我们需要用到如下知识:4.1 数据类型BSTRBSTR是BASIC中字符串类型数据的表示方式,是一个指向 UNIC
10、ODE 字符串的指针。有关 BSTR 的处理函数,参见下表。API 函数说明SysAllocString()申请一个 BSTR 指针,并初始化为一个字符串SysFreeString()释放 BSTR 内存SysAllocStringLen()申请一个指定字符长度的 BSTR 指针,并初始化为一个字符串SysAllocStringByteLen()申请一个指定字节长度的 BSTR 指针,并初始化为一个字符串SysReAllocStringLen()重新申请 BSTR 指针Cstring类说明AllocSysString()从 CString 得到 BSTRSetSysString()重新申请 B
11、STR 指针,并复制到 CString 中CComBSTR是BSTR 的封装类。在 atlbase.h 中定义Append ()、AppendBSTR()、AppendBytes()、ArrayToBSTR()、BSTRToArray()、AssignBSTR()、 Attach()、Detach()、Copy()、CopyTo()、Empty()、Length()、ByteLength()、 ReadFromStream()、WriteToStream()、LoadString()、ToLower()、ToUpper()运算符重载:!,!=,=,&,+=,+,=,BSTR太多了。详细资料,查
12、看MSDN 吧。CComBSTR类简化了对BSTR类型的使用4.2 数据类型VARIANTC+、BASIC、Java、Pascal、Script.计算机语言多种多样,而它们各自又都有自己的数据类型,COM 产生目的,其中之一就是要跨语言。而 VARIANT 数据类型就具有跨语言的特性,同时它可以表示(存储)任意类型的数据。另外,使用CComVariant类可简化VARIANT,如:VARIANT v = CComVariant(任意C+类型);4.3 用_bstr_t类封装数据类型BSTR_bstr_t是一个对BSTR的完整封装类,实际上它隐藏了底层的BSTR。它提供各种构造函数和操作符来访问
13、底层的C语言风格的字符串。然而,_bstr_t却没有访问BSTR本身的操作符,所以一个_bstr_t类型的字符串不能被作为输出参数传给一个COM方法。如果你需要一个BSTR*参数,使用类CComBSTR是比较容易的方式。一个_bstr_t字符串能够传给一个接收参数类型为BSTR的函数,只是因为下列3个条件同时满足。首先,_bstr_t有一个向wchar_t*转换的转换函数;其次,对编译器而言,因为BSTR的定义,wchar_t*和BSTR有同样的含义;第三,_bstr_t内部含有的wchar_t*指向一片按BSTR的形式存储数据的内存。所以,即使没有文档说明,_bstr_t可以转换成BSTR,
14、这种转换仍然可以正常进行。注意_bstr_t也提供char*和wchar_t*之间的转换操作符。但不提倡使用,因为即使它们是非常量字符串指针,你也一定不能使用这些指针去修改它们指向的缓冲区的内容,因为那将破坏内部的BSTR结构。一个用在自动化接口中的变量类型是VARIANT。它被用来在无类型(typeless)语言,如Jscript和VBScript,来传递数据。一个VARIANT可能含有很多不同类型的数据,例如long和IDispatch*。当一个VARIANT包含一个字符串,字符串被存成一个BSTR。4.4 用_variant_t类封装数据类型VARIANT_variant_t是一个对VA
15、RIANT的完整封装类,它提供很多构造函数和转换函数来操作一个VARIANT可能包含的大量的数据类型。这里,介绍与字符串有关的操作。没有从一个_variant_t变量到一个MBCS字符串的直接转换。你需要创建一个临时的_bstr_t变量,使用提供Unicode到MBCS转换的另一个字符串类或者使用一个ATL转换宏。不像_bstr_t,一个_variant_t变量可以被直接作为参数传递给一个COM方法。_variant_t继承自VARIANT类型,所以传递一个_variant_t来代替VARIANT变量是C+语言所允许的。五、通过ADO对象编程访问数据库通过ADO对象进行数据库开发的基本流程如下
16、:n 初始化COM库CoInitialize(NULL)n 引入ADO库定义文件msado15.dlln 用Connection对象连接数据库n 利用建立好的连接,通过Connection、Command对象执行SQL命令,或利用Recordset对象取得结果记录集进行查询、处理。n 使用完毕后关闭连接释放对象。1、COM库的初始化和释放我们可以使用CoInitialize(NULL)或者AfxOleInit()来初始化COM库,这项工作通常在CWinApp:InitInstance()的重载函数中完成::CoInitialize(NULL); /*if(!AfxOleInit()AfxMes
17、sageBox(COM Error!);return FALSE;*/退出程序前,可以在CWinApp:ExitInstance()中使用CoUninitialize()释放COM。2、用#import指令引入ADO类型库在stdafx.h中加入如下语句:#prgama warning (disable : 4146)#include icrsint.h#import C:Program FilesCommon FilesSystemadomsado15.dll no_namespace rename(EOF,EndOfFile) rename(BOF,FirstOfFile)这个#impor
18、t语句的作用同我们熟悉的#include类似,编译时系统会为我们自动生成msado15.tlh和msado15.tli,这两个文件分别相当于.h和.cpp文件,是ADO COM组件相关的文件。头文件icrsint.h文件包含了VC+对COM扩展的一些预处理指令、宏等的定义。注意1:你的环境中msado15.dll不一定在这个目录下,请按实际情况修改;注意2:如果去掉#prgama warning (disable : 4146),则在编译的时候可能会出现如下警告,对此微软在MSDN中作了说明,并建议我们不要理会这个警告:msado15.tlh(405) : warning C4146: una
19、ry minus operator applied to unsigned type, result still unsigned3、创建Connection对象并连接数据库首先添加一个指向Connection对象的指针:_ConnectionPtrm_pConnection;下面的代码演示了如何创建Connection对象实例及如何连接数据库并进行异常捕捉。BOOL CADOTest1Dlg:OnInitDialog()CDialog:OnInitDialog();HRESULT hr;CString sConnectStr = Provider=Microsoft.Jet.OLEDB.4.
20、0;Data Source=db1.mdb;try hr = m_pConnection.CreateInstance(ADODB.Connection);/创建Connection对象if (SUCCEEDED(hr) hr = m_pConnection-Open(sConnectStr, , , adModeUnknown);/连数据库catch(_com_error e)/捕捉异常CString sErr; sErr.Format(连接数据库失败!rn错误信息:%s, e.ErrorMessage(); AfxMessageBox(sErr);/显示错误信息这里,我们是通过Connec
21、tion对象的Open方法来连接数据库的,该方法的原型如下:HRESULT Connection15:Open (_bstr_tConnectionString,/连接数据库的字符串_bstr_tUserID,/数据库用户名_bstr_tPassword,/数据库密码longOptions/连接选项);其中ConnectionString为连接字串,UserID是用户名, Password是登陆密码,Options是连接选项,用于指定Connection对象对数据的更新许可权,Options可以是如下几个常量:n adModeUnknown:缺省。当前的许可权未设置。n adModeRead:
22、只读n adModeWrite:只写n adModeReadWrite:可以读写n adModeShareDenyRead:阻止其它Connection对象以读权限打开连接n adModeShareDenyWrite:阻止其它Connection对象以写权限打开连接n adModeShareExclusive:阻止其它Connection对象打开连接n adModeShareDenyNone:允许其它程序或对象以任何权限建立连接。我们给出一些常用数据库的连接方式供大家参考:l 通过JET数据库引擎对Access 2000数据库的连接m_pConnection-Open(Provider=Mic
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ADO 连接 数据库
限制150内