这次除了介绍rdoConnection物件的Events之外,另外介绍除了OpenResultset之外, 另一种可以传回Resultset的方式,即把rdoQuery物件当作是rdoConnection物件的方法 来使用,而後再使用rdoConnection物件的LastQueryResults来取得Resultset。而这里 也提出一个比较完整的范例,含Error handle。
sql = "Select * from qppfa where case_no = 'E8701761' " sql = sql + "and seq between ? and ?" Set qry = cn.CreateQuery("MyQuery", sql) qry.CursorType = rdOpenKeyset qry.LockType = rdConcurValues qry.QueryTimeout = 10 Call cn.MyQuery(1,40)
首先设定成叁数查询的方式,并设定好rdoQuery的CursorType, LockType等属性,而後 cn.MyQuery(1,40)
这便是把rdoQuery物件当作rdoConnection的方法来呼叫,而且又不用设定rdoParameter ,但是如此呼叫之後,并没有指定接收传回的Resultset物件,所以要再使用
set rs = cn.LastQueryResults 以取得Resultset。
不过,使用这种方式我没有找到要在何处设定rdAsyncEnable的非同步查询设定,如果要 使用非同步查询,则需改成 sql = "Select * from qppfa where case_no = 'E8701761' " sql = sql + "and seq between ? and ?" Set qry = cn.CreateQuery("MyQuery", sql) qry.QueryTimeout = 10 qry.rdoParameters(0) = 1 qry.rdoParameters(1) = 40 Set rs = qry.OpenResultset(rdOpenKeyset,rdConcurValues, rdAsyncEnable) '如果没有使用QueryComplete事件,那只好用以下的方式来做 'Do While rs.StillExecuting ' 'Do something ' DoEvents 'Loop
最後要提出的是QueryTimeout这个Event,当设定的Query的Timeout已到(qry.QueryTimeout) 则会产生这个事件,而Cancel这个叁数是来控制就此打住不再查询了,或者再查一次, 不过就算我们设定它不再查询了(Cancel = True),经Testing於Informix(7.2 Dynamic Server, OpenLink之ODBC Driver)不一定代表Server端就打住,可能会再经过某些动作後 才真的会停,这个期间,程序会Lock住,就好比程序死掉一般。而SQL Server6.5则不会 有这种情况,在Timeout之後,设定Cancel = true则真的就结束查询,不会像Informix 一般会Lock住一段时间。因此我的建议是,如果在Informix之下,不要去改变rdoQuery Timeout的设定,如此一来,等Informix真正处理到Timeout後,取消查询才不会被Lock 住。
Option ExplicitDim WithEvents cn As rdoConnectionDim en As rdoEnvironmentPrivate WithEvents rs As rdoResultsetPrivate qry As rdoQuery'在连结之前发生的Event,在此提供一个机会可以改变rdoConnection物件的'Connect属性(即改ConnectionString)Private Sub cn_BeforeConnect(ConnectString As String, Prompt As Variant)Debug.Print "Befor Connection"End Sub'发生在到伺服器的连结建立之後,不管连结过程有没有错误,都会传回这个EventsPrivate Sub cn_Connect(ByVal ErrorOccurred As Boolean)Dim i As LongIf ErrorOccurred Then Dim errstr As String errstr = GetrdoErrorDescription() Call MsgBox(errstr, vbCritical, "Connect过程有误")Else Debug.Print "Connect Success!!" '连结成功之後才能或才要做的动作,请在写这里End IfEnd SubPrivate Sub cn_Disconnect()Debug.Print "DisConnection!!"End Sub'发生在 rdoResultset 的查询传回第一个结果集或有误时,这个事件在非同步OpenResultset'时最为有效,方这个事件取代StillExecuting的查询。另外,如果是MultiResult的'Query,这QueryComplete事件的产生,经Testing是在所有Query都完成後才发生Private Sub cn_QueryComplete(ByVal Query As RDO.rdoQuery, ByVal ErrorOccurred As Boolean)If ErrorOccurred Then Dim errstr As String errstr = "原始查询:" + Query.sql + vbCrLf errstr = errstr + GetrdoErrorDescription() Call MsgBox(errstr, vbCritical, "查询过程有误")Else Debug.Print "Query SQL =" + Query.sql Set rs = cn.LastQueryResults 'Debug.Print rs.rdoColumns(0).ValueEnd If End SubPrivate Sub cn_QueryTimeout(ByVal Query As RDO.rdoQuery, Cancel As Boolean)Dim ans As Integerans = MsgBox("查询逾时,是否继续再查?", _ vbRetryCancel + vbCritical, "查询逾时")If ans = vbRetry Then Cancel = FalseElse Cancel = TrueEnd IfEnd Sub'在OpenResultset, Execute, rdoConnection物件.rdoQuery名称之前发生'在这里Query物件指的是rdoConnection物件要执行的动作,而设定Cancel = true'则会取消这次的查询。Private Sub cn_WillExecute(ByVal Query As RDO.rdoQuery, Cancel As Boolean)Debug.Print "Will Execute"End SubPrivate Sub Command1_Click()rs.CancelEnd SubPrivate Sub Form_Load()Dim connstr As StringDim ans As Integer, errstr As StringSet en = rdoEnvironments(0)Set cn = New rdoConnectioncn.CursorDriver = rdUseServerconnstr = "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 = connstrOn Error GoTo ConnectErrcn.EstablishConnection rdDriverNoPrompt, FalseDim sql As Stringsql = "Select * from qppfa where case_no = 'E8701761' "sql = sql + "and seq between ? and ?"Set qry = cn.CreateQuery("MyQuery", sql)qry.CursorType = rdOpenKeysetqry.LockType = rdConcurValuesqry.QueryTimeout = 10On Error GoTo QryErrCall cn.MyQuery(1,40)Exit SubConnectErr: errstr = GetrdoErrorDescription ans = MsgBox(errstr, _ vbRetryCancel + vbCritical, "连结错误") If ans = vbRetry Then err.Clear rdoErrors.Clear Resume Else Resume ExitErr End If Exit SubQryErr: errstr = GetrdoErrorDescription ans = MsgBox(errstr, _ vbRetryCancel + vbCritical, "查询错误") If ans = vbRetry Then err.Clear rdoErrors.Clear Resume Else Resume ExitErr End If Exit SubExitErr:End SubPrivate Function GetrdoErrorDescription() As StringDim rdoerr As rdoError, errstr As String For Each rdoerr In rdoErrors errstr = errstr + rdoerr.Description + vbCrLfNexterrstr = errstr + "重新试一次?"GetrdoErrorDescription = errstrEnd FunctionPrivate Sub Form_Unload(Cancel As Integer)If Not (rs Is Nothing) Then rs.CloseIf Not (cn Is Nothing) Then cn.CloseEnd Sub
RDO rdoConnection物件的Events |