[返回]
微电脑世界1999年第11期
潘爱民
(3)Recordset 对象Recordset
对象代表一个表的记录集或者命令执行的结果,在记录集中,总是有一个当前的记录。记录集是ADO
管理数据的基本对象,所有的Recordset
对象都按照行列方式的表状结构进行管理,每一行对应一个记录(Record),每一列对应一个域(Field)。Recordset
对象也通过游标对记录进行访问,在ADO 中,游标分为以下4 种:
静态游标提供对数据集的一个静态拷贝,允许各种移动操作,包括前移、后移等等,但其他用户所做的操作反映不出来。动态游标允许各种移动操作,包括前移、后移等等,并且其他用户所做的操作也可以直接反映出来。
前向游标允许各种前向移动操作,不能向后移动,并且其他用户所做的操作也可以直接反映出来。
键集(keyset)
游标类似于动态游标,也能够看到其他用户所做的数据修改,但不能看到其他用户新加的记录,也不能访问其他用户删除的记录。
Recordset 对象的用法如下:
a. 利用CursorType 属性设置游标类型。
b. 通过Open 方法打开记录集数据,既可以在Open 之前对ActiveConnection
属性赋值,指定Recordset 对象使用连接对象,也可以直接在Open
方法中指定连接串参数,ADO
将创建一个内部连接,即使连接串与外部的连接对象相同,它也使用新的连接对象。
c. Recordset 对象刚打开时,当前记录被定位在首条记录,并且BOF
和EOF 标志属性为False,如果当前记录集为空记录集,则BOF 和EOF
标志属性为True。
d. 通过MoveFirst、MoveLast、MoveNext 和MovePrevious
方法可以对记录集的游标进行移动操作。如果OLE DB
提供者支持相关功能的话,可以使用AbsolutePosition、AbsolutePage 和Filter
属性对当前记录重新定位。
e. 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
等等,下面分别加以介绍。
1 .在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
对象的属性和方法都非常简单,直接调用即可。
2 .在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 >
3 .在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();
......
4 .在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");
}
}