vb.net事物處理的簡(jiǎn)單介紹

求問(wèn)在.NET中如何使用Oracle數(shù)據(jù)庫(kù)事務(wù) (5)

您可以使用 OracleTransaction 類的 Save() 方法在事務(wù)中設(shè)置保存點(diǎn)。 如果您有一個(gè)非常長(zhǎng)的事務(wù)并且希望能夠僅回滾到某個(gè)特定的時(shí)間點(diǎn),那么您可能要使用保存點(diǎn)。例如,您可能想對(duì) 10 個(gè)產(chǎn)品做一些更改,然后設(shè)置一個(gè)保存點(diǎn),然后再對(duì)另 10 個(gè)產(chǎn)品做更改;如果您在進(jìn)行第二批更改時(shí)出現(xiàn)了錯(cuò)誤,那么您可以回滾至保存點(diǎn),使您的第一批更改原封不動(dòng)。 我將帶您逐步完成演示如何使用保存點(diǎn)的 C# (TransExample2.cs) 示例程序和 VB.NET (TransExample2.vb) 示例程序中的相關(guān)新步驟。這些程序向表 products 中添加一行,設(shè)置一個(gè)保存點(diǎn),向表 products 中添加另一行,回滾至保存點(diǎn),然后從表 products 中讀取這些行。在回滾至保存點(diǎn)后,只有添加到表 products 中的第一行保留了下來(lái):第二行將已被刪除。 第1 到第 3 步與“在 C# 和 VB.NET 中使用數(shù)據(jù)庫(kù)事務(wù)”部分中所示的步驟相同,因此在這里將其省略。 第4 步 向表products 中添加一行,該行的產(chǎn)品 ID 為 6。 在C# 中: myOracleCommand.CommandText = "INSERT INTO products (" + " product_id, product_type_id, name, description, price" + ") VALUES (" + " 6, 2, 'Man from Another World', ' Man from Venus lands on Earth', 24.99" + ")"; myOracleCommand.ExecuteNonQuery();在VB.NET 中: myOracleCommand.CommandText = _ "INSERT INTO products (" _ " product_id, product_type_id, name, description, price" _ ") VALUES (" _ " 6, 2, 'Man from Another World', 'Man from Venus lands on Earth', 24.99" _ ")" myOracleCommand.ExecuteNonQuery()第5 步 使用OracleTransaction 的 Save() 方法設(shè)置一個(gè)名為 SaveProduct 的保存點(diǎn)。 在C# 中: myOracleTransaction.Save("SaveProduct");在VB.NET 中: myOracleTransaction.Save("SaveProduct")第6 步 向表products 中添加另一行,該行的產(chǎn)品 ID 為 7。 在C# 中: myOracleCommand.CommandText = "INSERT INTO products (" + " product_id, product_type_id, name, description, price" + ") VALUES (" + " 7, 2, 'Z-Files', 'Mysterious stories', 14.99" + ")"; myOracleCommand.ExecuteNonQuery();在VB.NET 中: myOracleCommand.CommandText = _ "INSERT INTO products (" _ " product_id, product_type_id, name, description, price" _ ") VALUES (" _ " 7, 2, 'Z-Files', 'Mysterious stories', 14.99" _ ")" myOracleCommand.ExecuteNonQuery()第7 步 回滾到先前在第 5 步中設(shè)置的 SaveProduct 保存點(diǎn)。 在C# 中: myOracleTransaction.Rollback("SaveProduct");在VB.NET 中: myOracleTransaction.Rollback("SaveProduct")完成回滾后,在第 6 步中添加的第二行已被刪除,而在第 4 步中添加的第一行保留了下來(lái)。 TransExample2.cs 和 TransExample2.vb 中剩下的步驟顯示表 products 的內(nèi)容,回滾整個(gè)事務(wù)并從數(shù)據(jù)庫(kù)斷開(kāi)。 用于Microsoft Transaction Server 的 Oracle 事務(wù)服務(wù)的快速說(shuō)明。Microsoft Transaction Server 是一個(gè)運(yùn)行在互聯(lián)網(wǎng)或網(wǎng)絡(luò)服務(wù)器上的專有事務(wù)處理系統(tǒng)。Microsoft Transaction Server 為客戶端計(jì)算機(jī)部署和管理應(yīng)用程序和數(shù)據(jù)庫(kù)事務(wù)請(qǐng)求。 Microsoft Transaction Server 是以服務(wù)器為中心的三層體系結(jié)構(gòu)模型的一個(gè)組件。這種方法實(shí)現(xiàn)了將應(yīng)用程序的表示、業(yè)務(wù)邏輯和數(shù)據(jù)元素清晰地分布到在一個(gè)網(wǎng)絡(luò)中連接的不同計(jì)算機(jī)上。無(wú)需專門集成,您就可以在與 Oracle 數(shù)據(jù)庫(kù)服務(wù)器 8.0.6 版或更高版本連接的 Microsoft Transaction Server 中部署一個(gè)組件,但首先您必須安裝 Oracle Services for Microsoft Transaction Server。 結(jié)論在本文中,您系統(tǒng)學(xué)習(xí)了在 .NET 程序中使用數(shù)據(jù)庫(kù)事務(wù)。 (T004)

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、海珠網(wǎng)絡(luò)推廣、微信小程序開(kāi)發(fā)、海珠網(wǎng)絡(luò)營(yíng)銷、海珠企業(yè)策劃、海珠品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供海珠建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:muchs.cn

在VB中,怎樣對(duì)SQL進(jìn)行事務(wù)處理

事務(wù)處理是在數(shù)據(jù)處理時(shí)經(jīng)常遇到的問(wèn)題,經(jīng)常用到的方法有以下3種總結(jié)整理如下:

方法1:直接寫(xiě)入到sql?中

在存儲(chǔ)過(guò)程中使用?BEGIN?TRANS,?COMMIT?TRANS,?ROLLBACK?TRANS?實(shí)現(xiàn)

begin?trans

declare?@orderDetailsError?int,@procuntError?int

delete?from?[order?details]?where?productid=42

select?@orderDetailsError?=@@error

delete?from?products?where?productid=42

select?@procuntError=@@error

if(@orderDetailsError?=0?and?@procuntError=0)

COMMIT?TRANS

else

ROLLBACK?TRANS

優(yōu)點(diǎn):

所有事務(wù)邏輯包含在一個(gè)單獨(dú)的調(diào)用中

擁有運(yùn)行一個(gè)事務(wù)的最佳性能

獨(dú)立于應(yīng)用程序

限制:

事務(wù)上下文僅存在于數(shù)據(jù)庫(kù)調(diào)用中

數(shù)據(jù)庫(kù)代碼與數(shù)據(jù)庫(kù)系統(tǒng)有關(guān)

方法2?:使用ADO.NET?實(shí)現(xiàn)?

使用ADO.NET?實(shí)現(xiàn),使用這種方式的優(yōu)點(diǎn)是可以在中間層來(lái)管理事務(wù),當(dāng)然你也可以選擇在數(shù)據(jù)層來(lái)實(shí)現(xiàn)。

SqlConnection?和OleDbConnection??對(duì)象有一個(gè)?BeginTransaction?方法,它可以返回?SqlTransaction

或者OleDbTransaction?對(duì)象。而且這個(gè)對(duì)象有?Commit?和?Rollback?方法來(lái)管理事務(wù)

SqlConnection?sqlConnection?=?new?SqlConnection("workstation?id=WEIXIAOPING;packet?size=4096;user?id=sa;initial?catalog=Northwind;persist?security?info=False");

sqlConnection.Open();

SqlTransaction??myTrans?=?sqlConnection.BeginTransaction();

SqlCommand?sqlInsertCommand?=?new?SqlCommand();

sqlInsertCommand.Connection?=?sqlConnection

sqlInsertCommand.Transaction=myTrans;

try{

sqlInsertCommand.CommandText="insert?into?tbTree(Context,ParentID)?values('北京',1)";

sqlInsertCommand.ExecuteNonQuery();

sqlInsertCommand.CommandText="insert?into?tbTree(Context,ParentID)?values('上海',1)";

sqlInsertCommand.ExecuteNonQuery();

myTrans.Commit();

}catch(Exception?ex)

{

myTrans.Rollback();

}

finally

{

sqlConnection.Close();

}

優(yōu)點(diǎn):

簡(jiǎn)單性

和數(shù)據(jù)據(jù)事務(wù)差不多的快

獨(dú)立于數(shù)據(jù)庫(kù),不同數(shù)據(jù)庫(kù)的專有代碼被隱藏了

缺點(diǎn):

事務(wù)不能跨越多個(gè)數(shù)據(jù)庫(kù)連接

事務(wù)執(zhí)行在數(shù)據(jù)庫(kù)連接層上,所以需要在事務(wù)過(guò)程中維護(hù)一個(gè)數(shù)據(jù)庫(kù)連接

ADO.NET分布事務(wù)也可以跨越多個(gè)數(shù)據(jù)庫(kù),但是其中一個(gè)SQL?SERVER?數(shù)據(jù)庫(kù)的話,通過(guò)用SQL?SERVER連接服務(wù)器連接到別的數(shù)據(jù)庫(kù),但是如果是在DB2和Orcal之間就不可以。

以上兩種事務(wù)是經(jīng)常用到的事務(wù)處理方法。

方法3??COM+事務(wù)(分布式事務(wù))

.NET?Framework?依靠?MTS/COM+?服務(wù)來(lái)支持自動(dòng)事務(wù)。COM+?使用?Microsoft?Distributed?Transaction?Coordinator?(DTC)?作為事務(wù)管理器和事務(wù)協(xié)調(diào)器在分布式環(huán)境中運(yùn)行事務(wù)。

這樣可使?.NET?應(yīng)用程序運(yùn)行跨多個(gè)資源結(jié)合不同操作(例如,將定單插入?SQL?Server?數(shù)據(jù)庫(kù)、將消息寫(xiě)入?Microsoft?消息隊(duì)列?(MSMQ)?隊(duì)列、以及從?Oracle?數(shù)據(jù)庫(kù)檢索數(shù)據(jù))

的事務(wù)。

COM+事務(wù)處理的類必須繼承System.EnterpriseServices.ServicedComponent,其實(shí)web?service就是繼承System.EnterpriseServices.ServicedComponent,所以web?service也支持

COM+事務(wù)。

定義一個(gè)COM+事務(wù)處理的類

[Transaction(TransactionOption.Required)]

public?class?DataAccess:System.EnterpriseServices.ServicedComponent

{

}

TransactionOption枚舉類型支持5個(gè)COM+值(Disabled,NotSupported,Required,RequiresNew,Supported)

Disabled??????忽略當(dāng)前上下文中的任何事務(wù)。

NotSupported??使用非受控事務(wù)在上下文中創(chuàng)建組件。

Required??????如果事務(wù)存在則共享事務(wù),并且如有必要?jiǎng)t創(chuàng)建新事務(wù)。

RequiresNew???使用新事務(wù)創(chuàng)建組件,而與當(dāng)前上下文的狀態(tài)無(wú)關(guān)。

Supported?????如果事務(wù)存在,則共享該事務(wù)。

一般來(lái)說(shuō)COM+中的組件需要Required?或Supported。當(dāng)組件用于記錄或查帳時(shí)RequiresNew?很有用,因?yàn)榻M件應(yīng)該與活動(dòng)中其他事務(wù)處理的提交或回滾隔離開(kāi)來(lái)。

派生類可以重載基類的任意屬性。如DataAccess選用Required,派生類仍然可以重載并指定RequiresNew或其他值。

COM+事務(wù)有手動(dòng)處理和自動(dòng)處理,自動(dòng)處理就是在所需要自動(dòng)處理的方法前加上[AutoComplete],根據(jù)方法的正?;驋伋霎惓Q定提交或回滾。

手動(dòng)處理就是調(diào)用ContextUtil類中EnableCommit,SetComplete,SetAbort方法。

public?string??testTransaction()

{

try

{

ContextUtil.EnableCommit();

InsertARecord1();

InsertARecord2();

ContextUtil.SetComplete();

return?"succeed!";

}

catch(Exception?ex)

{

ContextUtil.SetAbort();

return?"failed!";

}

}

public?void?InsertARecord1()

{

string?strconn="workstation?id=WEIXIAOPING;packet?size=4096;user?id=sa;initial?catalog=Northwind;persist?security?info=False";

SqlConnection?conn=new?SqlConnection(strconn);

conn.Open();

SqlCommand?command=new?SqlCommand("insert?into?tbTree(Context,ParentID)?values('北京',1)",conn);

command.ExecuteNonQuery();

conn.Close();

}

public?void?InsertARecord2()

{

string?strconn="workstation?id=WEIXIAOPING;packet?size=4096;user?id=sa;initial?catalog=Northwind;persist?security?info=False";

SqlConnection?conn=new?SqlConnection(strconn);

conn.Open();

SqlCommand?command=new?SqlCommand("insert?into?tbTree(Context,ParentID)?values('上海',1)",conn);

command.ExecuteNonQuery();

conn.Close();

}

在需要事務(wù)跨?MSMQ?和其他可識(shí)別事務(wù)的資源(例如,SQL?Server?數(shù)據(jù)庫(kù))運(yùn)行的系統(tǒng)中,只能使用?DTC?或?COM+?事務(wù),除此之外沒(méi)有其他選擇。DTC?協(xié)調(diào)參與分布式事務(wù)的所有資源管理器, ?也管理與事務(wù)相關(guān)的操作。

這種做法的缺點(diǎn)是,由于存在?DTC?和?COM?互操作性開(kāi)銷,導(dǎo)致性能降低。

COM+事務(wù)處理的類必須強(qiáng)命名。

詳談如何在VB.NET使用ORACLR數(shù)據(jù)庫(kù)事務(wù)麻煩告訴我

Oracle.DataAccess.Client 命名空間是 ODP.NET 的一部分,它包含許多類,其中有OracleConnection、OracleCommand 和 OracleTransaction。示例程序用到了這些類。 VB.NET使用ORACLR第 1 步創(chuàng)建一個(gè) OracleConnection 對(duì)象連接到 Oracle 數(shù)據(jù)庫(kù),然后打開(kāi)該連接。

在C# 中:OracleConnection myOracleConnection =new OracleConnection( "User Id=store;Password=store;Data Source=ORCL" ); myOracleConnection.Open(); 在VB.NET 中:Dim myOracleConnection As New OracleConnection( _ "User Id=store;Password=store;Data Source=ORCL") myOracleConnection.Open() User Id 和 Password 屬性指定了您所要連接到的模式的數(shù)據(jù)庫(kù)用戶和口令。Data Source 屬性指定了數(shù)據(jù)庫(kù)的 Oracle Net 服務(wù)名稱;初始數(shù)據(jù)庫(kù)的默認(rèn)服務(wù)名稱為 ORCL。如果您使用的不是初始數(shù)據(jù)庫(kù),或者您的服務(wù)名稱不同,那么您需要在程序中修改 Data Source 屬性的設(shè)置。 VB.NET使用ORACLR第 2 步創(chuàng)建一個(gè) OracleTransaction 對(duì)象,然后調(diào)用 OracleConnection 對(duì)象的 BeginTransaction() 方法啟動(dòng)事務(wù)。 在C# 中:OracleTransaction myOracleTransaction = myOracleConnection.BeginTransaction(); In VB.NET: Dim myOracleTransaction As OracleTransaction = _ myOracleConnection.BeginTransaction() VB.NET使用ORACLR第3 步創(chuàng)建一個(gè) OracleCommand 對(duì)象,用于存儲(chǔ) SQL 語(yǔ)句。 在C# 中:OracleCommand myOracleCommand = myOracleConnection.CreateCommand(); 在VB.NET 中:Dim myOracleCommand As OracleCommand = myOracleConnection.CreateCommand 因?yàn)镺racleCommand 對(duì)象使用 OracleConnection 對(duì)象的 CreateCommand() 方法創(chuàng)建的,所以它自動(dòng)使用在第 2 步中為 OracleConnection 對(duì)象設(shè)置的事務(wù)。 VB.NET使用ORACLR第 4 步將OracleCommand 對(duì)象的 CommandText 屬性設(shè)為向表 product_types 中添加一行的第一條 INSERT 語(yǔ)句。

在C# 中:myOracleCommand.CommandText = "INSERT INTO product_types (" + " product_type_id, name" + ") VALUES (" + " 3, 'Magazine'" + ")"; 在VB.NET 中:myOracleCommand.CommandText = _ "INSERT INTO product_types (" _ " product_type_id, name" _ ") VALUES (" _ " 3, 'Magazine'" _ ")" VB.NET使用ORACLR第 5 步

使用OracleCommand 對(duì)象的 ExecuteNonQuery() 方法運(yùn)行 INSERT 語(yǔ)句。

在C# 中:myOracleCommand.ExecuteNonQuery(); 在VB.NET 中:myOracleCommand.ExecuteNonQuery(); VB.NET使用ORACLR第 6 和第 7 步將OracleCommand 對(duì)象的 CommandText 屬性設(shè)為向表 Products 中添加一行的第二條 INSERT 語(yǔ)句,并運(yùn)行它。

在C# 中:myOracleCommand.CommandText = "INSERT INTO products (" + " product_id, product_type_id, name, description, price" + ") VALUES (" + " 5, 3, 'Oracle Magazine', 'Magazine about Oracle', 4.99" + ")"; myOracleCommand.ExecuteNonQuery(); 在VB.NET 中:myOracleCommand.CommandText = _ "INSERT INTO products (" _ " product_id, product_type_id, name, description, price" _ ") VALUES (" _ " 5, 3, 'Oracle Magazine', 'Magazine about Oracle', 4.99" _ ")" myOracleCommand.ExecuteNonQuery() VB.NET使用ORACLR第 8 步使用OracleTransaction 對(duì)象的 Commit() 方法提交數(shù)據(jù)庫(kù)中的事務(wù)。

在C# 中:myOracleTransaction.Commit(); 在VB.NET 中:myOracleTransaction.Commit() 在完成 Commit() 方法之后,由 INSERT 語(yǔ)句添加的兩行將在數(shù)據(jù)庫(kù)中永久記錄。 VB.NET使用ORACLR第 9 步使用Close() 方法關(guān)閉 OracleConnection 對(duì)象。在C# 中:myOracleConnection.Close(); 在VB.NET 中: myOracleConnection.Close() 編譯并運(yùn)行示例程序要編譯 C# 示例程序,您可以使用 csc 命令運(yùn)行 C# 編譯器。因?yàn)槌绦蚴褂?Oracle Data Access DLL,所以您應(yīng)使用 /r 選項(xiàng)指定該 DLL 的完整路徑,例如:注意:您需要用您計(jì)算機(jī)上的相應(yīng)路徑來(lái)替換該 DLL 的路徑。此外,如果您的計(jì)算機(jī)找不到 csc 編譯器,那么您可能需要運(yùn)行 Microsoft sdkvars.bat 腳本來(lái)首先設(shè)置 .NET SDK 的環(huán)境變量;您可以在安裝 .NET SDK 的 bin 目錄中找到該腳本。 如果您遇到以下錯(cuò)誤:Example1.cs(10,7):error CS0246:The type or namespace name 'Oracle' could not be found (are you missing a using directive or an assembly reference?) 這說(shuō)明您沒(méi)有在編譯命令中正確指定 Oracle Data Access DLL。(有關(guān)設(shè)置的信息,請(qǐng)參閱 John Paul Cook 的技術(shù)文章“在 Oracle 數(shù)據(jù)庫(kù)上構(gòu)建 .NET 應(yīng)用程序”。) 下面是用于編譯 VB.NET 程序的等價(jià)命令:vbc TransExample1.vb /r:C:\oracle\product\10.1.0\ Client_1\bin\Oracle.DataAccess.dll /r:system.dll /r:system.data.dll 接下來(lái),輸入以下命令,運(yùn)行示例: An exception was thrown Message = ORA-12514:TNS:listener does not currently know of service requested in connect descriptor 您將看到程序的輸出。不過(guò),如果您遇到類似以下的異常這說(shuō)明 OracleConnection 對(duì)象的連接字符串中的 Data Source 的設(shè)置不正確。您應(yīng)當(dāng)咨詢您的 DBA 或查閱 Oracle Net 文檔以獲得更多詳細(xì)信息。 如果您使用的是 VS .NET,那么您可以遵循以下指示來(lái)編譯和運(yùn)行 C# 程序 TransExample1.cs:

創(chuàng)建一個(gè)新的 C# 控制臺(tái)應(yīng)用程序。FileNew Project,然后選擇 Visual C# Projects,Console Application。

關(guān)于在VB.NET中怎么使用事務(wù)的問(wèn)題,還有其

在vb.net中要定義一個(gè)事務(wù),需要使用Begin tran命令,在這一命令之后的任何語(yǔ)句都將被認(rèn)為是事務(wù)的一部分。命令Commit用來(lái)完成VB.NET處理,并使事務(wù)對(duì)數(shù)據(jù)庫(kù)所作的修改成為永久的。Rollback命令用來(lái)取消一個(gè)事務(wù),并還原事務(wù)對(duì)數(shù)據(jù)庫(kù)所作的修改。

當(dāng)前題目:vb.net事物處理的簡(jiǎn)單介紹
文章鏈接:http://muchs.cn/article42/dojhihc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、定制網(wǎng)站、響應(yīng)式網(wǎng)站、定制開(kāi)發(fā)、外貿(mào)建站、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)