ADO 的测试(2)

2008-04-09 04:39:58来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  我们知道在实№的应用上有不少是有可能同时Update同一资料的,例如说,我们用一笔Record来记录流水号,每个Process要取得该Record流水号的那个栏位之内容,之後加1再存回去,这种情况在多人使用时就很有可能有同时Update的情况,那我建议使用ODBC
Provider的悲观锁定,不过,仍有些问题,如果以下程式所示,而有两个Process A,BA执行到rs.MoveFirst後换 B执行到rs.MoveFirst,此时有Dead Lock产生,所以B 会进入等待,而A 呢,它执行到Update时会产生错误,天!这种程式能用吗?所幸,SQL7不会有回题。

Private cn As ADODB.Connection
Private rs As ADODB.Recordset


Dim connstr As String
Dim ans As Integer, errstr As String, sql As String
Set cn = New ADODB.Connection
connstr = "Driver={SQL Server};UID=cww;PWD=jjh5612;Server=OPEN_VIEW;Database=cwwtest"
cn.Provider = "MSDASQL"
cn.ConnectionString = connstr

cn.Open
cn.BeginTrans
sql = "Select * from qppfa where case_no = E8701761 and seq BETWEEN 1 AND 5 "
Set rs = New ADODB.Recordset
Set rs.ActiveConnection = cn
rs.CursorLocation = adUseServer
rs.Source = sql
rs.Open , cn, adOpenKeyset, adLockPessimistic, adCmdText
rs.MoveFirst 这时候才真的有Update Lock
rs!kind = "v"
rs.Update
cn.CommitTrans
$#@60;/pre$#@62;$#@60;/td$#@62;$#@60;/tr$#@62;$#@60;/table$#@62;在Informix之下(用OpenLink的ODBC Driver)呢,情况很乱,後来我发现只要使用Client
端的Cursor,问题会减到最少,而且这里有一点十分奇特,OpenLink ODBC Driver允许
我们使用Recordset的Resync方法,不但没有错,而且还会把on-line Database的资料
传回来(这一点和使用RDO 的Client端Cursor不同,和 ADO SQL Server6.5也不同)。
不过这里要特别提出的是Resync adAffectCurrent 只在我们的Table有Unique的Key,
而且这个Key有在我们的Select的范围内才有效。所以,以下是我OpenLink ODBC Driver
解决Update concurrency的方式。特别提出是,在这OpenLink ODBC Driver下使用ADO,
千万不要用Server端的Cursor,会有太多问题(除非是AdOpenForwardOnly)。以下的程式
只可用於OpenLink Informix ODBC Driver,不可用於SQL Server!!

$#@60;table border$#@62;$#@60;td$#@62;$#@60;tr$#@62;$#@60;pre$#@62;

Dim WithEvents cn As ADODB.Connection
Private WithEvents rs As ADODB.Recordset
Private qry As ADODB.Command
Private adoerr As ADODB.Errors

以下是 update资料库的部份
Private Sub UpdateData()
Dim ans As Integer
cn.Execute "Set lock mode to wait 15" 该设定只对Informix有效
cn.BeginTrans
rs.MoveNext
On Error GoTo errh 设定Update 的错误处理函式
updArea: 设定这一个标记,方便错误函式返回这里做事情

rs!fld1 = "h" 自行更改成update所 的设定
rs.Update 如果Update时产生错误时,则会到errh处处理
cn.CommitTrans
Exit Sub

errh:
Do While cn.Errors.Count $#@62; 0
If cn.Errors(cn.Errors.Count - 1).Number = -2147217864 Then
-2147217864 代表该Record可能被他人更新了 for Client端Cirsor
ans = MsgBox("资料更新有冲突,是否再试一次", vbYesNo)
If ans = vbYes Then
rs.CancelUpdate
rs.Resync adAffectCurrent 重新到Database读取当笔资料
cn.Errors.Clear
Resume updArea 重回资料更新的区域
Else
Exit Do
End If
Else
Exit Do
End If
Loop
MsgBox "Update失败" vbCrLf cn.Errors(0).Description, vbCritical
cn.RollbackTrans
End If
End Sub

开启资料库
Private Sub Form_Load()
Dim connstr As String
Dim ans As Integer, errstr As String, sql As String
Set cn = New ADODB.Connection
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.ConnectionString = connstr
cn.Open
sql = "Select * from testtab order by case_no"
Set rs = New ADODB.Recordset
Set rs.ActiveConnection = cn
rs.CursorLocation = adUseClient
rs.Open sql, cn, adOpenKeyset, adLockOptimistic
End Sub


SQL7.0呢,这就很好用了,不管乐观锁定或悲观锁定都有很好的表现,我们先看悲观锁定:
Private Sub Form_Load()
Dim connstr As String
Dim sql As String
Set cn = New ADODB.Connection

connstr = "Data Source=ACCOUNT;UID=sa;PWD=;Initial Catalog=NKIUAcc"
cn.Provider = "SQLOLEDB"
cn.ConnectionString = connstr
cn.Open
cn.BeginTrans
sql = "Select * from TESTTAB"
Set rs = New ADODB.Recordset
Set rs.ActiveConnection = cn
rs.CursorLocation = adUseServer
rs.Source = sql
rs.Open , cn, adOpenKeyset, adLockPessimistic, adCmdText
rs.MoveFirst
rs!f1 = "x"
rs.Update
cn.CommitTrans

  这样做,如果同时有两个Process执行完rs.Open,而接著都会执行rs.MoveFirst,这时只有一个Process会成功,另一个则会进入等待,等到先前的Process Release Lock後才会再执行,这样子就解决了同时Update一笔资料的问题。唯一要注意的只有等待的时间若太久则会TimeOut,所以改成以下的方式:

Dim cn As ADODB.Connection
Private rs As ADODB.Recordset
Private Sub Form_Load()
Dim connstr As String
Dim sql As String
Set cn = New ADODB.Connection

connstr = "Data Source=ACCOUNT;UID=sa;PWD=;Initial Catalog=NKIUAcc"

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:在记忆体中的ADO资料录集与DataBindin

下一篇:ADO 在informix的 Addnew