ADO 的测试(2)
2008-04-09 04:39:58来源:互联网 阅读 ()
我们知道在实№的应用上有不少是有可能同时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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash
