下面给出一个运行rdoConnection对象Cn的OpenResultset方法的例子。
Dim Rs As Resultset Set Rs = Cn.OpenResultset(name:=“SELECT * FROM Authors WHERE Year_Born=1966”) If Rs.RowCount > 0 Then MsgBox Rs.RowCount & “条记录取得完毕。” Else MsgBox “没有取得任何记录。” End If |
这个例子中用了name:=,OpenResultset方法,除了name参数以外,也可以使用lock、 locktype、option等。下面是从Resultset中将数据读取到ListBox中的方法:
Do Until Rs.EOF List1.AddItem Rs(“au_lname”) Rs.MoveNext Loop |
存储过程虽然不在本文讨论的范围内,这里也简单地介绍一下。存储过程基本上有以下4种类型:
{call myStoreProcedure} ' 没有参数的存储过程 {call myStoreProcedure(?)} ' 单一的输入或输出参数 {? = call myStoreProcedure(?)} ' 单一参数、有返回值 {? = call myStoreProcedure(?, ?)} ' 多个参数、有返回值 |
下面演示一个运行存储过程的例子:
sp_GetVendorCount参数是名称的条件,其返回值为符合该条件的记录数。 Dim CPw As rdoQuery Dim sSQL As String SSQl = “{? = call sp_GetVendorCount(?)}” |
这里“名称的条件”是输入参数,由ODBC驱动器进行自动识别。使用rdoParameters(n).Direction可以对返回值(rdParamReturnValue)、输入参数 (rdParamInput) 、输出参数(rdParamOutput)和输入输出参数(rdParamInputOutput)加以控制。但通常ODBC都会读入存储过程的定义式,并加以正确识别,所以绝大多数的情况下不必使用这个参数。
Dim CPw = Cn.CreateQuery(“GetVendorCount”, sSQL) |
代码生成名为GetVendorCount的rdoQuery对象,并将rdoQuery对象自动增加到rdoQueries集合中,以后可以重复使用。
现在将CPw对象的第一个参数指定为返回值:
CPw.rdoParameters(0).Direction = rdParamReturnValue |
最后由Execute方法运行:
返回行的查询(存储过程中包含一个以上的SELECT)时,可使用OpenResultset方法。运行后,可通过rdoParameters集合取得返回值:
If CPw.rdoParameters(0) > 0 Then MsgBox CPw.rdoParameters & “数据取得成功” Else MsgBox “数据读取失败” End If |
数据的追加、更新、删除
对SQL语句已经有一定了解的读者,应该比较熟悉INSERT、UPDATE、DELETE等语句。对于rdoConnection对象,虽然可以在OpenResultset的Name参数中直接代入SQL语句,用Execute方法运行,但没有充分利用RDO对象的长处。在rdoResultset中有AddNew、Edit、Update、Delete、MoveNext、MovePrevious、MoveFirst、MoveLast方法,与DAO/Jet相似,用起来非常便利。
下面在先前的Resultset的例子中追加记录:
Rs.AddNew Rs(“au_id”) = “111-46-1992” Rs(“au_lname”) = “Takenami” RS(“au_fname”) = “Teruo” '设定所有的field,通常调用Call SetField,在别的模块中设定 Rs.Update |
与SQL语句中的INSERT相比起来,这种方法非常简单,而且代码可读性好。记录的更新方法如下,与追加相似,所不同的只有最初的Edit方法:
Rs.Edit Rs(“au_lname”) = “Takenami” RS(“au_fname”) = “Teruo” '设定所有的field,通常调用Call SetField,在别的模块中设定 Rs.Update |
在实际应用中,字段的更新放在别的模块中,便于从AddNew、Edit两种处理中都可以进行调用。
使用Delete方法删除记录时,当前行被删除。当前行可以通过MoveNext、MovePrevious等Move方法以及Bookmark属性设定。
Rs.Delete '删除当前记录
这里需要注意的是当前记录被删除之后记录指针的位置。Delete执行后,记录指针仍然指向已被删除的记录,也就是空的记录,对这个空记录进行读写操作会产生错误。所以通常在Delete之后应立即执行ReQuery或MoveNext操作:
Rs.ReQuery 或 Rs.MoveNext
以上简单地说明了数据的增加、更新、删除方法,根据数据库的模式的不同,增加、更新会变得非常复杂。另外,由于数据表的原因,有时会使得删除操作变得复杂。通常与数据表的构造、相关性有关的处理,为了使客户端的代码尽可能简洁,应在SQL Server上创建触发器。有关触发器的内容已超出了本文讨论的范围,这里不详细说明。本文介绍的只是一些基本的操作方法,RDO数据处理功能不仅限于此,读者可在实际开发中进一步领会。
总结
RDO是开发数据库应用程序功能强大的对象方法,要真正做到应用自如,需要付出很大努力。本文描绘了RDO基本的构成、功能、编程方式,希望读者由此对数据库编程方式以及RDO的使用有更为充分的了解。如果需要进一步研究,建议可以从以下几方面入手:
* SQL Server(或Oracle)的功能,特别是存储过程、View、触发器、安全模式等;
* 数据库设计基础;
* SQL语句;
* Visual Basic的对象概念。
这些粗看起来与RDO没有什么联系,但实际上有助于对RDO的结构、原理等基本技术的理解。换而言之,学习数据库编程的基本内容为大前提,RDO或者ADO的应用不过是访问数据库的一种手段而已。
查看本文来源