[ 来源: | 作者: | 时间:2007-06-26 | 收藏 | 推荐 ] 【大 中 小】
上回谈的是如何建立连结,这SQL与Informix没有什麽不同,但是
再来要谈的是令人十分痛苦的事了,那便是如何产生一个rdoResultSet物件
rdoResultSet相对应於DAO的Recordset物件,产生的方式主要如下:
Private WithEvents cn As rdoConnection
Private en As rdoEnvironment
Private rs As rdoResultset
Private qry As rdoQuery
Dim sql As String
Set en = rdoEnvironments(0)
Set cn = New rdoConnection
en.CursorDriver = rdUseServer '见注一
connstr = "UID=cww;PWD=jjh5612;Database=cwwpf@eis;" _
+ "Driver={OpenLink Generic 32 Bit Driver};" _
+ "Host=192.168.0.61;" _
+ ";FetchBufferSize=30" _
+ ";NoLoginBox=Yes" _
+ ";Options=" _
+ ";Protocol=TCP/IP" _
+ ";ReadOnly=No" _
+ ";ServerOptions=" _
+ ";ServerType=Informix 7.2"
cn.Connect = connstr
Set cn = en.OpenConnection("", rdDriverNoPrompt, _
False, connstr) '第三个叁数False表示非ReadOnly
.
.
rs.Close
cn.Close
|
Set en = rdoEnvironments(0)
Set cn = New rdoConnection
connstr = "UID=cww;PWD=jjh5612;Database=cwwpf@eis;" _
+ "Driver={OpenLink Generic 32 Bit Driver};" _
+ "Host=192.168.0.61;" _
+ ";FetchBufferSize=30" _
+ ";NoLoginBox=Yes" _
+ ";Options=" _
+ ";Protocol=TCP/IP" _
+ ";ReadOnly=No" _
+ ";ServerOptions=" _
+ ";ServerType=Informix 7.2"
Set cn = New rdoConnection
cn.CursorDriver = rdUseServer
cn.EstablishConnection rdDriverNoPrompt, False
sql = "Select * From qppfa"
Set rs = cn.OpenResultset(sql, rdOpenForwardOnly, _
rdConcurReadOnly)
.
.
rs.Close
cn.Close
|
重点都是在OpenResultset这个方法上,但是如果要做更多的控制,我会在rdoQuery上使 用OpenResultset,如下:
Set en = rdoEnvironments(0)
Set cn = New rdoConnection
cn.CursorDriver = rdUseServer
connstr = "UID=cww;PWD=jjh5612;Database=cwwpf@eis;" _
+ "Driver={OpenLink Generic 32 Bit Driver};" _
+ "Host=192.168.0.61;" _
+ ";FetchBufferSize=30" _
+ ";NoLoginBox=Yes" _
+ ";Options=" _
+ ";Protocol=TCP/IP" _
+ ";ReadOnly=No" _
+ ";ServerOptions=" _
+ ";ServerType=Informix 7.2"
cn.Connect = connstr
cn.EstablishConnection rdDriverNoPrompt, False
sql = "Select * From testtab"
Set qry = cn.CreateQuery("MyQuery", sql)
qry.RowsetSize = 50 '见注二
qry.MaxRows = 200 '见注三
Set rs = qry.OpenResultset(rdOpenKeyset, _
rdConcurRowVer)
.
.
rs.Close
cn.Close
|
至於说OpenResultset方法中又提及记录集又分成以下四种:
rdOpenForwardOnly 0 (预设值)是固定集 (Fixed Set),不可卷动 (Non-Scrolling)
rdOpenKeyset 1 固定集,可卷动的查询记录集的资料指标,存的只是Key,而其
他的资料於需要时可以去读取,因此它可以读到其他人更新过後
的资料,当然,需和RowSetSize做搭配,别人在我们读取到Data
後才更新资料时,我们的Process仍然没有反映最新的资料,此
时下个Move 0指令可以更新至最新的Data。不过看不到其他人新
增到该Result Set的资料
rdOpenDynamic 2 动态集的资料指标,特性和rdOpenKeyset同,唯其他Process加入
该Resultset的资料可以在目前Process中看到。
rdOpenStatic 3 是固定集,和rdOpenKeyset不同的是,资料集一建立之後就看不
见其他Process对Resultset的修正。
其实,我觉得MS 对於这些东西的说明十分不清楚,而且上面的说明针对的都是rdUseServer
的Server端之Cursor,而ODBC端的Cursor没有像上面所说的那样,ODBC端的Cursor因为
资料是Copy到Client端,自然也就看不到他人是如何对Resultset成员的修改了;当然了,
理论上还是可以得知,不过这要花上代价,那就是每一次读取资料时还得向Server来询问
是否有改,那不就失去Client端Cursor的原意了吗?所以我们可以想像,ODBC端的Cursor
只有rdOpenForwardOnly与rdOpenStatic这两种。
这样就结束了吗?还没有!以上是MS SQL SERVER6.5的特性,而Informix呢?InforMix
Server端的Cursor只有rdOpenForwardOnly与rdOpenKeyset两种(注意,不是rdOpenStatic)
这和Informix Server有关,然而我们在Informix为後端的Server中使用rdOpenStatic/
rdOpenDynamic时,也不会有误,只是行为和rdOpenKeyset相同。而Informix为後端,但
我们使用rdUseOdbc之Client端Cursor呢,此时只有rdOpenForwardonly与rdOpenStatic
(注意,不是rdOpenKetset喔),这个原因是来自於ODBC Cursor的特性。
而不管是SQL SERVER或Informix为後端,rdUseNone的方式就没有太多的选择,一律只能
使用rdOpenForwardonly的Cursor型态,这不必多说,应是很自然的事吧。
透过上面的说明,何时用Client端的Cursor何时用Server端的Cursor应比较有念了吧。
注一:
CursorDriver 有以下数种方式
rdUseIfNeeded 0 ODBC 驱动程序 将选取适当的资料指标样式。可能的话,使用
伺服端资料指标。
rdUseOdbc 1 将使用ODBC 资料指标程序库(ODBC Cursor Library)。
rdUseServer 2 使用伺服端资料指标。
rdUseClientBatch 3 RDO 将使用乐观批次资料指标程序库
rdUseNone 4 记录集(Result Set)不以资料指标型态传回。
(阅读次数:)