打印本文 打印本文  关闭窗口 关闭窗口
ADO如何提供异动功能?(BIG5)
作者:采集员 文章来源:来源于网络 点击数: 更新时间:2005/9/10 12:32:01
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。



打印本文 打印本文  关闭窗口 关闭窗口