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。
?您必?更新多??料表中的?料?位?,??保在所有的?料表中所作的改?都被完成(??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。