BeginTrans/CommitTrans/Rollback方法您必更新多料表中的料位,保在所有的料表中所作的改都被完成(Commit)、或者不(撤原Rollback),您可以使用(transaction)料的完整性。
例如,您甲到另一乙,需要甲上去一加到另一乙上。如果其中有一更新失,就不平衡。
使用(transaction)功能,料所做的任何改都可撤原(Rollback),或者可以(Commit)存所有料的改。
加上(transaction)功能的方法,在更新第一料位前,先使用BeginTrans 方法,然後,只要有任何更新失,就可以使用RollbackTrans方法撤所有的更新。您成功地更新最後一料位之後,就可使用CommitTrans方法(Commit)存到料。
ADO有三支援理的方法:BeginTrans、CommitTrans、Rollback。但是,料本身也必支援理的功能,譬如SQL Server提供(transaction)理的功能,但是Access未提供。
BeginTrans:始一理,一旦始一理,就必在料或用程式之前使用CommitTrans或Rollback。用程式束,有交付(Commit)的要自原。
CommitTrans:改存到料中。用BeginTrans方法理以後,CommitTrans方法RecordSet所有的改存到料。行CommitTrans,所有改成永久性的改。
Rollback:撤原,倒退或者撤目前理中所有已改的料。它同止理。
(transaction)例子
我看一於ASP程式中使用BeginTrans/ CommitTrans/RollbackTrans提供(transaction)功能的例子。
本例子,使用RecordSet 的Requery方法,重新行SELECT指令入料到RecordSet。
行本例子的料必支援理的功能,譬如SQL Server提供(transaction)理的功能,但是Access未提供。
若要行本例子,先安「企站用精」,以便自於SQL Server建立comPak料。
譬如ASP程式rs4.asp如下,使用BeginTrans方法始一理, [案下] 料表每一的 [案下次] 位加上100,再使用CommitTrans方法RecordSet所有的改存到料。或者使用Rollback方法,撤目前理中所有已改的料:
<%
Set conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "driver={SQL Server};server=(Local);uid=sa;pwd=;database=comPak"
Set rs2 = Server.CreateObject("ADODB.Recordset")
sql = "SELECT * FROM 案下"
rs2.Open sql,conn1,1,2,1
conn1.BeginTrans
Do while not rs2.EOF
if IsNull(rs2("案下次")) then rs2("案下次") = 100
rs2("案下次") = rs2("案下次") + 100
rs2.MoveNext
Loop
conn1.CommitTrans
'conn1.RollbackTrans
rs2.Requery
'rs2.Close
'Set rs2 = Server.CreateObject("ADODB.Recordset")
'sql = "SELECT * FROM 案下"
'rs2.Open sql,conn1,1,2,1
%>
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<TR>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">名</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">案下案</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">案下次</FONT></TD>
</TR>
<% Do while not rs2.EOF %>
<TR>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs2("名")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs2("案下案")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs2("案下次")%></TD>
</TR>
<%
rs2.MoveNext
Loop
%>
以上的 ASP程式rs4.asp,於用端使用器,行的果,使用rs2.Requery方法重新行SELECT指令入料到RecordSet,示理後的。
每行一次, [案下] 料表每一的 [案下次] 位加上100。
UpdateBatch/CancelBatch (SQL Server)
您可以使用UpdateBatch方法,多更的,批次回到料。
使用UpdateBatch方法,不必每一更都下一Update方法,多一起更,最後再使用UpdateBatch方法,回到料。或是使用CancelBatch方法,放所有的更。
行本例子的料必支援UpdateBatch批次更理的功能,譬如SQL Server提供UpdateBatch的功能,但是Access未提供。
若要行本例子,先安「企站用精」,以便自於SQL Server建立comPak料。
譬如ASP程式rs3.asp如下, [案下] 料表每一的 [案下次] 位加上10,再使用UpdateBatch方法RecordSet所有的改存到料。或者使用CancelBatch方法,放所有的更:
<%
Set conn1 = Server.CreateObject("ADODB.Connection")
conn1.Open "driver={SQL Server};server=(Local);uid=sa;pwd=;database=comPak"
Set rs3 = Server.CreateObject("ADODB.Recordset")
sql = "SELECT * FROM 案下"
rs3.Open sql,conn1,1,4
Do while not rs3.EOF
if IsNull(rs3("案下次")) then rs3("案下次") = 10
rs3("案下次") = rs3("案下次") + 10
rs3.MoveNext
Loop
rs3.UpdateBatch
'rs3.CancelBatch
rs3.Requery
%>
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<TR>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">名</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">案下案</FONT></TD>
<TD ALIGN=CENTER BGCOLOR="#800000"><FONT COLOR="#FFFFFF">案下次</FONT></TD>
</TR>
<% Do while not rs3.EOF %>
<TR>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("名")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("案下案")%></TD>
<TD BGCOLOR="f7efde" ALIGN=CENTER><%= rs3("案下次")%></TD>
</TR>
<%
rs3.MoveNext
Loop
%>
</TABLE>
<%
rs3.Close
conn1.Close
%>
以上的 ASP程式rs3.asp,於用端使用器,行的果,示代重覆的。
其中rs3.Open sql,conn1,1,4的4表示批次定(Batch Optimistic lock),使用UpdateBatch方法多更的批次回到料,才定此批料。
每行一次, [案下] 料表每一的 [案下次] 位加上10。