神通数据库ADO应用参考¶
Connection对象¶
Connection 对象代表与数据源之间的一个连接,ADO 的Connection 对象封装了OLE DB 的数据源对象和会话对象。根据OLE DB 提供者的不同性能,Connection 对象的特性也有所不同,所以Connection 对象的方法和属性不一定都可以使用。利用Connection 对象,我们可以完成以下一些基本设置操作。
- 通过ConnectionString、ConnectionTimeOut 和Mode 属性设置连接串、超时信息、访问模式。
- 还可以设置CursorLocation 属性以便指定使用客户端游标,以便在客户程序中使用批处理修改方式。
- 设置连接的缺省数据库属性DefaultDatabase。
- 设置OLE DB 提供者的属性Provider。
- 通过Open 和Close 控制Connection 对象与物理数据源的连接。
- 通过Execute 方法执行命令。
- 提供事务机制,通过BeginTrans、CommitTrans 和RollbackTrans 方法实现事务控制。
- 通过Errors 集合属性检查数据源的错误信息。
- 通过OpenSchema 方法获取数据库的表信息。
Connection 对象是ADO 的基本对象之一,它独立于所有其他的对象。如果我们要对数据库进行查询操作,既可以使用Execute 方法,也可以使用Command 对象。使用Execute 方法比较简便,但用Command 对象可以保存命令的信息,以便多次查询。
Command对象¶
Command 对象代表一个命令,可以通过其方法执行针对数据源的有关操作,比如查询、修改等。Command 对象的用法如下:
- 通过CommandText 属性设置命令串。
- 通过Parameters 集合属性和Parameter对象定义参数化查询或存储过程的参数。
- 通过Execute 方法执行命令,可能的话,返回Recordset 对象。
- 在执行命令之前,可通过设置CommandType 属性以便优化性能。
- 可以通过Prepared属性指示底层的提供者为当前命令准备一个编译过的版本,以后再执行时,速度会大大加快。
- 通过CommandTimeOut 属性设置命令执行的超时值( 以秒为单位)。
- 可以设置ActiveConnection 属性,为命令指定连接串,Command对象将在内部创建Connection 对象。
- 可以设置Name 属性,这样以后可以在相应的Connection 对象上按Name属性指定的方法名执行。
Command 对象执行时,既可以通过ActiveConnection 属性指定相连的Connection对象,也可以独立于Connection对象,直接指定连接串,即使连接串与Connection 对象的连接串相同,Command对象仍然使用其内部的数据源连接。
Recordset对象¶
Recordset对象代表一个表的记录集或者命令执行的结果,在记录集中,总是有一个当前的记录。记录集是ADO管理数据的基本对象,所有的Recordset 对象都按照行列方式的表状结构进行管理,每一行对应一个记录(Record),每一列对应一个域(Field)。Recordset对象也通过游标对记录进行访问,在ADO 中,游标分为以下4 种:
静态游标提供对数据集的一个静态拷贝,允许各种移动操作,包括前移、后移等等,但其他用户所做的操作反映不出来。动态游标允许各种移动操作,包括前移、后移等等,并且其他用户所做的操作也可以直接反映出来。
动态游标允许各种前向移动操作,不能向后移动,并且其他用户所做的操作也可以直接反映出来。
键集(keyset)游标类似于动态游标,也能够看到其他用户所做的数据修改,但不能看到其他用户新加的记录,也不能访问其他用户删除的记录。
Recordset 对象的用法如下:
- 利用CursorType 属性设置游标类型。
- 通过Open 方法打开记录集数据,既可以在Open 之前对ActiveConnection 属性赋值,指定Recordset 对象使用连接对象,也可以直接在Open 方法中指定连接串参数,ADO 将创建一个内部连接,即使连接串与外部的连接对象相同,它也使用新的连接对象。
- Recordset 对象刚打开时,当前记录被定位在首条记录,并且BOF 和EOF 标志属性为False,如果当前记录集为空记录集,则BOF 和EOF 标志属性为True。
- 通过MoveFirst、MoveLast、MoveNext 和MovePrevious 方法可以对记录集的游标进行移动操作。如果OLE DB 提供者支持相关功能的话,可以使用AbsolutePosition、AbsolutePage 和Filter 属性对当前记录重新定位。
- ADO 提供了两种记录修改方式:立即修改和批修改。在立即修改方式下,一旦调用Update 方法,则所有对数据的修改立即被写到底层的数据源。在批修改方式下,可以对多条记录进行修改,然后调用UpdateBatch 方法把所有的修改递交到底层数据源。递交之后,可以用Status 属性检查数据冲突。
Recordset 对象是ADO 数据操作的核心,它既可以作为Connection 对象或Command 对象执行特定方法的结果数据集,也可以独立于这两个对象而使用,由此可以看出ADO 对象在使用上的灵活性。
上面3 个对象都包含一个Property 对象集合的属性,通过Property 对象可使ADO 动态暴露出底层OLE DB 提供者的性能。由于并不是所有的底层提供者都有同样的性能,所以ADO 允许用户动态访问底层提供者的能力。这样既使得ADO 很灵活,又提供了很好的扩展性。ADO 的其他集合对象及其元素对象,都用在特定的上下文环境中,比如Parameter 对象一定要与某个Command 对象相联系后,才能真正起作用。而另外三个对象Field、Error 和Property 对象只能依附于其父对象,不能单独创建这些对象。
在多种语言中使用ADO¶
以上介绍了ADO 的对象模型,现在我们来讨论如何在不同的语言环境中使用ADO 对象。因为ADO 是作为自动化组件程序实现的,所以我们可以在任何支持COM 和自动化特性的语言环境中使用ADO,比如Visual Basic、Visual C++、ASP 和Java 等等,下面分别加以介绍。
在Visual Basic 应用中使用ADO
Visual Basic 应用在设计模式和运行模式下都可以创建和使用自动化对象,在设计模式下,像ADO 这样的对象库可以作为内部对象来使用,我们只需在"Project" 菜单下的"References" 命令弹出的对话框中选中ADO 对象库"Microsoft ActiveX Data Objects Library",于是我们就可以在程序中直接声明或新建ADO 对象,举例如下:
Dim cn as New ADODB.Connection Dim cmd as New ADODB.Command Dim rs as New ADODB.Recordset
可以看出,在设计时使用ADO 对象非常方便,而且Visual Basic 设计环境中提供的对象浏览器(Object Browser) 功能允许用户很方便地查看ADO 对象的属性和方法。
我们也可以在运行时创建自动化对象,使用Visual Basic 的CreateObject 函数可以创建任意的自动化对象,由于ADO 中只有Connection 对象、Command 对象和Recordset 对象可以被独立创建,所以我们也只能创建这3 种对象,举例如下:
Dim cn Set rs=CreateObject("ADODB.Connection ") Dim cmd Set rs=CreateObject("ADODB.Command") Dim rs Set rs=CreateObject("ADODB.Recordset")
注解
不管是设计模式还是运行模式,调用ADO 对象的属性和方法都非常简单,直接调用即可。
在ASP 的VBScript 中使用ADO
ADO 对象也可以用于HTML 和Active Server Page 的VBScript 脚本代码,VBScript 脚本代码与Visual Basic 的代码很类似,它们内嵌在HTML 或ASP 文件的特定标记对内部。但VBScript 引擎比Visual Basic 的设计环境或运行库在功能上还是要弱一些,首先,在VBScript 代码中,没有与设计环境类似的用法,VBScript 引擎不能装入ADO 类型库,所以不能使用New 操作符创建ADO 对象,但可以使用CreateObject 函数创建对象;其次,ADO 对象库中用到的常量只能通过包含文件引入,随ADO 一起提供的Adovbs.inc 文件包含所有ADO 常量的定义,我们可在脚本代码中直接包含此文件。
因此,为了在VBScript 代码中使用ADO,首先要包含Adovbs.inc 文件,然后使用CreateObject 函数创建ADO 对象,以后就可以调用这些对象的属性或方法了。下面的例子显示了在ASP 文件中用ADO 列出数据表中所有作者的姓名和职称,代码如下:
< %@ LANGUAGE = VBScript % > < HTML > < TITLE >Using ADO in a Visual Basic Script Web Page < /TITLE >< /HEAD > < LANGUAGE="VBS" > < !--#include file="adovbs.inc"-- > < CENTER > < H1 >< font size=4 >Using ADO in a Visual Basic Script Web Page < /H1 >< /font >< br >< br > < %set myConnection = CreateObject("ADODB.Connection") myConnection.Open "DSN=MySamples;UID=sa" SQLQuery = "select AuthorName, Title from AuthorDB" set rs = myConnection.Execute(SQLQuery)% > < TABLE align=center COLSPAN=8 CELLPADDING=5 BORDER=0 WIDTH=200 > < !-- BEGIN column header row -- > < TR > < TD VALIGN=TOP BGCOLOR="#800000" > < FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1 > Title ID< /FONT > < /TD > < TD ALIGN=CENTER BGCOLOR="#800000" > < FONT STYLE="ARIAL NARROW" COLOR="#ffffff" SIZE=1 > Title< /FONT >< /TD >< /TR > < !-- Get Data -- >< % do while not rs.EOF % > < TR > < TD BGcolor ="f7efde" align=center > < font style ="arial narrow" size=1 > < %=rs("AuthorName")% >< /font > < /TD > < TD BGcolor ="f7efde" align=center >< font style ="arial narrow" size=1 > < %=rs("Title") % > < /font >< /TD >< /TR > < % rs.MoveNext% >< %loop % >< !-- Next Row -- > < /TABLE >< /center >< /BODY >< /HTML >在Visual C++ 中使用ADO
在Visual C++ 中使用ADO 有多种方法,第一种方法是我们使用CoCreateInstance 函数创建ADO 对象,并得到对象的IDispatch 接口指针,然后调用其Invoke 函数,用这种方法需要我们自己处理参数和返回值,ADO 提供了Adoid.h 和Adoint.h 头文件分别定义了ADO 对象的CLSID 和接口ID;第二种方法是利用#import 编译指示符( 在Visual C++ 5.0 及以后的版本中可以使用),可以方便地使用ADO 对象;第三种方法是利用MFC(Microsoft Foundation Class) 库提供的IDispatch 接口封装类COleDispatchDriver 创建和调用ADO 对象。
下面的代码显示了在Visual C++ 创建数据源连接的过程:
GUID connectionCLSID; HRESULT hResult = ::CLSIDFromProgID(L"ADODB.Connection", &connectionCLSID); if (FAILED(hResult)) { // ...... } IDispatch *pDispatch = NULL; hResult = CoCreateInstance(connectionCLSID, NULL, CLSCTX_SERVER, IID_IDispatch, (void **)&pDispatch); if (FAILED(hResult)) { // ...... } COleDispatchDriver driver; driver.AttachDispatch(pDispatch, FALSE); TRY { BYTE parms[] = VTS_BSTR; driver.InvokeHelper(0xa, DISPATCH_METHOD, VT_EMPTY, &hResult, parms, L"Provider=SQLOLEDB; User ID=sa;Password=;" L"Initial Catalog=LEAVES;Data Source=NetTestServer"); } END_TRY driver.DetachDispatch();
在Java 中使用ADO
在Java 程序中可以引入ADODB 类,然后声明ADO 变量,也可以使用new 操作符创建ADO 变量。下面的代码说明了如何在Java 中打开与数据源连接:
import msado10.*; _Connection m_conn = null; _Recordset m_rs = null; _Command m_cmd = null; void OpenConnection() { String s; Properties properties; Try { properties = m_conn.getProperties(); m_conn.Open("dsn=MySamples", "sa", ""); properties = null; } catch (Exception e) { System.out.println("\nUnable to make a connection \n"); } }