
所謂事務(wù)處理,簡單地說,就是所有的數(shù)據(jù)庫操作都可以看做事務(wù)處理。當(dāng)開始一個(gè)事務(wù)處理后,就打開Web頁面與數(shù)據(jù)庫的事務(wù)處理通道,此時(shí)可以從Web頁面上直接更新數(shù)據(jù)庫內(nèi)容,但是更新結(jié)果并不馬上真正反映到數(shù)據(jù)庫中。只有在提交事務(wù)處理結(jié)果后,數(shù)據(jù)庫內(nèi)容才能被真正更新,否則,所有的操作都無效。
用法舉例(db1.mdb中有一個(gè)test表,只包含一個(gè)name文本字段):
<%
Dim conn,sqlstr,sqlstr2,sqlstr3
Set conn=server.createobject("ADODB.connection")
Conn.connectionstring="provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("db1.mdb")
Conn.open
sqlstr="insert into test(name) values('aaa')" '正確的SQL語句
sqlstr2="insert into test(name2) values('bbb')" '錯(cuò)誤的SQL語句
sqlstr3="insert into test(name) values('ccc')" '正確的SQL語句
Conn.BeginTrans
conn.execute(sqlstr)
conn.execute(sqlstr2)
conn.execute(sqlstr3)
If conn.Errors.Count=0 then
Conn.CommitTrans
Response.write ""
Else
Conn.RollbackTrans
Response.write ""
End if
Conn.close
Set conn=nothing
%>
這樣當(dāng)執(zhí)行到錯(cuò)誤的SQL語句時(shí)程序拋出錯(cuò)誤信息,不再理會(huì)后面第三條SQL語句正確與否,事務(wù)處理機(jī)制生效,整個(gè)提交過程無效。實(shí)現(xiàn)運(yùn)用中我們并不希望將錯(cuò)誤信息展示在用戶面前,于是我們加了On error resume next語句,如下:
<%
Dim conn,sqlstr,sqlstr2,sqlstr3
Set conn=server.createobject("ADODB.connection")
Conn.connectionstring="provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("db1.mdb")
Conn.open
sqlstr="insert into test(name) values('aaa')"
sqlstr2="insert into test(name2) values('bbb')"
sqlstr3="insert into test(name) values('ccc')"
On error resume next
Conn.BeginTrans
conn.execute(sqlstr)
conn.execute(sqlstr2)
conn.execute(sqlstr3)
If conn.Errors.Count =0 then
Conn.CommitTrans
Response.write ""
Else
Conn.RollbackTrans
Response.write ""
End if
On Error GoTo 0
Conn.close
Set conn=nothing
%>
這樣出現(xiàn)的問題是只要最后一條SQL語句是正確的,那么conn.Errors.Count的值就必定為0,這樣的結(jié)果是先前錯(cuò)誤的SQL語句不會(huì)執(zhí)行,正確的SQL語句會(huì)被正確執(zhí)行,整個(gè)事務(wù)處理機(jī)制基本上等于失效,解決的辦法是將conn.Errors.Count改為err.number,代碼如下:
<%
Dim conn,sqlstr,sqlstr2,sqlstr3
Set conn=server.createobject("ADODB.connection")
Conn.connectionstring="provider=microsoft.jet.oledb.4.0; data source=" & server.mappath("db1.mdb")
Conn.open
sqlstr="insert into test(name) values('aaa')"
sqlstr2="insert into test(name2) values('bbb')"
sqlstr3="insert into test(name) values('ccc')"
On error resume next
Conn.BeginTrans
conn.execute(sqlstr)
conn.execute(sqlstr2)
conn.execute(sqlstr3)
If err.number = 0 then
Conn.CommitTrans
Response.write ""
Else
Conn.RollbackTrans
Response.write ""
End if
On Error GoTo 0
Conn.close
Set conn=nothing
%>
您發(fā)布的評(píng)論即表示同意遵守以下條款:
一、不得利用本站危害國家安全、泄露國家秘密,不得侵犯國家、社會(huì)、集體和公民的合法權(quán)益;
二、不得發(fā)布國家法律、法規(guī)明令禁止的內(nèi)容;互相尊重,對(duì)自己在本站的言論和行為負(fù)責(zé);
三、本站對(duì)您所發(fā)布內(nèi)容擁有處置權(quán)。