在C#中使用COM+实现事务控制
生活随笔
收集整理的這篇文章主要介紹了
在C#中使用COM+实现事务控制
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
.NET技術(shù)是微軟大力推廣的下一代平臺技術(shù),自從.NET技術(shù)架構(gòu)的正式發(fā)布,此項技術(shù)也逐漸走向成熟和穩(wěn)定。按照微軟的平臺系統(tǒng)占有率,我們不難想象得到,在未來的一兩年內(nèi).NET技術(shù)必定會勢如破竹一般的登上主流的技術(shù)平臺,而一個新的技術(shù)平臺得以快速發(fā)展的最重要的前提是:他不會徹底的摒棄以前的技術(shù),這一點對于.NET技術(shù)來說指的就是COM/COM+技術(shù)了。?
?一般來說,在IT技術(shù)界以及硬件產(chǎn)業(yè),技術(shù)的更新?lián)Q代速度非常得驚人,而慣例是所有的新技術(shù)都會遵循向下兼容的原則,但是.NET技術(shù)不僅僅做到了這一點,.NET甚至實現(xiàn)了相互之間的各自調(diào)用,這一點是非常難能可貴的。也就是說,不但我們可以在.NET組件中調(diào)用COM組件,同時也可以在COM組件中正常的調(diào)用.NET組件。這點帶來的好處是顯而易見的,一方面我們可以保持現(xiàn)有的技術(shù)資源,另一方面,在現(xiàn)有資源中可以利用.NET所帶來的各種新技術(shù)。?
?一般的數(shù)據(jù)庫事務(wù)控制要求事務(wù)里所做的操作必須在同一個數(shù)據(jù)庫內(nèi),這樣在出現(xiàn)錯誤的時候才能回滾(RllBack)到初始狀態(tài)。這就存在一個問題,在分布式應(yīng)用程序中,我們往往需要同時操作多個數(shù)據(jù)庫,使用數(shù)據(jù)庫本身的事務(wù)處理,很難滿足程序?qū)κ聞?wù)控制的要求。在COM+中,提供了完整的事務(wù)服務(wù),我們可以利用它來完成在分布式應(yīng)用程序中的事務(wù)控制。?
?具體過程如下?
?一:用VS.NET生成一個類庫?。?
?二:添加對System.EnterpristServices的引用,具體步驟?
?菜單:(項目-添加引用-在.NET選項卡選擇System.EnterpristServices-確定)?
?三:構(gòu)建類?
?1:源程序?
using?System;?
using?System.EnterpriseServices;?
using?System.Data.SqlClient;?
using?System.Reflection;?
namespace?COMPlusSamples?
{?
//表明需要事務(wù)支持?
[?Transaction(TransactionOption.Required)?]?
//聲明為服務(wù)器應(yīng)用程序,還可以選擇Library,表示為庫應(yīng)用程序?
[assembly:?ApplicationActivation(ActivationOption.Server)]?
//描述信息?
[assembly:?Description("sample")]?
public?class?TxCfgClass?:?ServicedComponent?
{?
private?static?string?init1?=?"user?id=sa;password=;initial?catalog=pubs;data?source=(local)";?
private?static?string?init2?=?"user?id=sa;password=;initial?catalog=NorthWind;data?source=(local)";?
private?static?string?add1?=?"insert?into?authors('au_lname','au_fname')?values('test1',?'test2')";?
private?static?string?add2?=?"insert?into?sample?values('test1',22)";?
//the?error?sql?statement?
//there?is?not?table?“sample”?
public?TxCfgClass()?{}?
private?void?ExecSQL(string?init,?string?sql)?
{?
SqlConnection?conn?=?new?SqlConnection(init);?
SqlCommand?cmd?=?conn.CreateCommand();?
cmd.CommandText?=?sql;?
conn.Open();?
cmd.ExecuteNonQuery();?
conn.Close();?
}?
//添加一條記錄到數(shù)據(jù)庫?
public?void?Add()?
{?
try?
{?
//在一數(shù)據(jù)庫中插入一條記錄?
ExecSQL(init1,?add1);?
Console.WriteLine("the?operation?in?the?same?database?completely");?
//在另外一個數(shù)據(jù)庫中插入兩條記錄?
//這次執(zhí)行的是一個錯誤的SQL語句?
ExecSQL(init2,?add2);?
Console.WriteLine("the?operation?in?the?other?database?
completely");?
Console.WriteLine("Record(s)?added,?press?enter...");?
Console.Read();?
}?
catch(Exception?e)?
{?
//事務(wù)回滾?
ContextUtil.SetAbort();?
Console.WriteLine("Because?there?are?some?errors?in?the?operation?,so?transcation?abort");?
Console.WriteLine("The?error?is?"?+?e.Message);?
Console.WriteLine("abort?successfully");?
Console.Read();?
}?
}?
}?
}?
?2:程序說明:?
?添加命名空間?using?System.EnterpriseServices;因為本程序使用了其中的ContextUtil類?
[?Transaction(TransactionOption.Required)?]?說明DLL需要事務(wù)支持。?
?本程序的TxCfgClass?類從ServicedComponent類中繼承,這樣并不會影響該類,而只是在該類中添加了兩個額外的方法,這兩個方法可以使代碼共享變得更加容易。?
?程序使用的sql?server數(shù)據(jù)庫在本機運行,init1?和?init2是兩個連接數(shù)據(jù)庫的連接字符串,init連接pubs數(shù)據(jù)庫,inin2連接northwind數(shù)據(jù)庫,這是sql2000中自帶的示例數(shù)據(jù)庫。add1和add2是兩條sql語句,作用是分別向兩個數(shù)據(jù)庫的表里添加一條記錄。注意:add2是一條錯誤的語句,因為根本沒有sample表,這樣,會在執(zhí)行時引起異常。(這正是我們所期望的)?
?在執(zhí)行到add2語句時,由于它是錯誤的,所以會引發(fā)異常,轉(zhuǎn)到錯誤處理語句里來執(zhí)行。?
?ContextUtil.SetAbort();該語句使所有的數(shù)據(jù)庫操作回滾,這樣add1語句所插入的記錄也將不存在。(達到預(yù)期目標(biāo))?
?四:給程序添加強名(strong?name)?
?1:創(chuàng)建一對密鑰?
?用來創(chuàng)建密鑰的工具是稱為sn.exe的共享工具。通常通過命令提示運行它,該工具可執(zhí)行各種任務(wù)以生成并提取密鑰。我們需要用以下方式來運行sn.exe。?
sn?–k?key.snk?
?其中key.snk?代表將保存密鑰的文件的名稱。它的名稱可以是任意的,不過習(xí)慣上帶有.snk后綴名。?
?2:簽名?
?簽名通常是在編譯時進行的。簽名時,用戶可利用C#屬性通知編譯器應(yīng)該使用正確的密鑰文件對DLL進行簽名。要做到這一點用戶需要打開工程中的AssemblyInfo.cs文件并進行修改。?
?[assembly:AssemblyKeyFile(“..//..//key.snk”)]?
?注:key.snk文件和項目文件在同一個文件夾?
?五:編譯成DLL?(具體步驟)?
?菜單:(生成-生成)?
?如果一切正常,就會生成DLL文件?
?六:使用regsvcs.exe將Dll注冊到COM+?Services里面?
?我們需要用以下方式運行regsvcs.exe?
?regsvcs?dll文件名?
?如果一切正常的話,regsvcs.exe就會把dll輸入到COM+?Services中。?
?至此,我們已經(jīng)生成并注冊了這個可以由其它程序使用的類,現(xiàn)在,我們來寫一個控制臺程序來檢驗這個類是否正常運行?
?七:構(gòu)建客戶機?
?1:新建控制臺應(yīng)用程序項目?
?菜單(文件-新建-項目)?
?選擇控制臺應(yīng)用程序?,并選擇?添入解決方案?,確定?
?2:同上面的第二步一樣,添加對System.EnterpriseServices的引用。?
?3:添加對自己剛才做好的類的引用。?
?菜單(項目-添加引用-瀏覽),選擇剛才生成的DLL,確定?
?4:輸入以下程序?
using?System;?
using?COMPlusSamples;?
using?System.EnterpriseServices;?
public?class?Client?
{?
public?static?void?Main()?
{?
TxCfgClass?cfg?=?new?TxCfgClass();?
cfg.Add();?
}?
}?
?5:將控制臺程序設(shè)置為啟動項,然后編譯運行,就會看到結(jié)果。?
?正如我們希望的,第一條記錄沒有插入數(shù)據(jù)庫?
?一般來說,在IT技術(shù)界以及硬件產(chǎn)業(yè),技術(shù)的更新?lián)Q代速度非常得驚人,而慣例是所有的新技術(shù)都會遵循向下兼容的原則,但是.NET技術(shù)不僅僅做到了這一點,.NET甚至實現(xiàn)了相互之間的各自調(diào)用,這一點是非常難能可貴的。也就是說,不但我們可以在.NET組件中調(diào)用COM組件,同時也可以在COM組件中正常的調(diào)用.NET組件。這點帶來的好處是顯而易見的,一方面我們可以保持現(xiàn)有的技術(shù)資源,另一方面,在現(xiàn)有資源中可以利用.NET所帶來的各種新技術(shù)。?
?一般的數(shù)據(jù)庫事務(wù)控制要求事務(wù)里所做的操作必須在同一個數(shù)據(jù)庫內(nèi),這樣在出現(xiàn)錯誤的時候才能回滾(RllBack)到初始狀態(tài)。這就存在一個問題,在分布式應(yīng)用程序中,我們往往需要同時操作多個數(shù)據(jù)庫,使用數(shù)據(jù)庫本身的事務(wù)處理,很難滿足程序?qū)κ聞?wù)控制的要求。在COM+中,提供了完整的事務(wù)服務(wù),我們可以利用它來完成在分布式應(yīng)用程序中的事務(wù)控制。?
?具體過程如下?
?一:用VS.NET生成一個類庫?。?
?二:添加對System.EnterpristServices的引用,具體步驟?
?菜單:(項目-添加引用-在.NET選項卡選擇System.EnterpristServices-確定)?
?三:構(gòu)建類?
?1:源程序?
using?System;?
using?System.EnterpriseServices;?
using?System.Data.SqlClient;?
using?System.Reflection;?
namespace?COMPlusSamples?
{?
//表明需要事務(wù)支持?
[?Transaction(TransactionOption.Required)?]?
//聲明為服務(wù)器應(yīng)用程序,還可以選擇Library,表示為庫應(yīng)用程序?
[assembly:?ApplicationActivation(ActivationOption.Server)]?
//描述信息?
[assembly:?Description("sample")]?
public?class?TxCfgClass?:?ServicedComponent?
{?
private?static?string?init1?=?"user?id=sa;password=;initial?catalog=pubs;data?source=(local)";?
private?static?string?init2?=?"user?id=sa;password=;initial?catalog=NorthWind;data?source=(local)";?
private?static?string?add1?=?"insert?into?authors('au_lname','au_fname')?values('test1',?'test2')";?
private?static?string?add2?=?"insert?into?sample?values('test1',22)";?
//the?error?sql?statement?
//there?is?not?table?“sample”?
public?TxCfgClass()?{}?
private?void?ExecSQL(string?init,?string?sql)?
{?
SqlConnection?conn?=?new?SqlConnection(init);?
SqlCommand?cmd?=?conn.CreateCommand();?
cmd.CommandText?=?sql;?
conn.Open();?
cmd.ExecuteNonQuery();?
conn.Close();?
}?
//添加一條記錄到數(shù)據(jù)庫?
public?void?Add()?
{?
try?
{?
//在一數(shù)據(jù)庫中插入一條記錄?
ExecSQL(init1,?add1);?
Console.WriteLine("the?operation?in?the?same?database?completely");?
//在另外一個數(shù)據(jù)庫中插入兩條記錄?
//這次執(zhí)行的是一個錯誤的SQL語句?
ExecSQL(init2,?add2);?
Console.WriteLine("the?operation?in?the?other?database?
completely");?
Console.WriteLine("Record(s)?added,?press?enter...");?
Console.Read();?
}?
catch(Exception?e)?
{?
//事務(wù)回滾?
ContextUtil.SetAbort();?
Console.WriteLine("Because?there?are?some?errors?in?the?operation?,so?transcation?abort");?
Console.WriteLine("The?error?is?"?+?e.Message);?
Console.WriteLine("abort?successfully");?
Console.Read();?
}?
}?
}?
}?
?2:程序說明:?
?添加命名空間?using?System.EnterpriseServices;因為本程序使用了其中的ContextUtil類?
[?Transaction(TransactionOption.Required)?]?說明DLL需要事務(wù)支持。?
?本程序的TxCfgClass?類從ServicedComponent類中繼承,這樣并不會影響該類,而只是在該類中添加了兩個額外的方法,這兩個方法可以使代碼共享變得更加容易。?
?程序使用的sql?server數(shù)據(jù)庫在本機運行,init1?和?init2是兩個連接數(shù)據(jù)庫的連接字符串,init連接pubs數(shù)據(jù)庫,inin2連接northwind數(shù)據(jù)庫,這是sql2000中自帶的示例數(shù)據(jù)庫。add1和add2是兩條sql語句,作用是分別向兩個數(shù)據(jù)庫的表里添加一條記錄。注意:add2是一條錯誤的語句,因為根本沒有sample表,這樣,會在執(zhí)行時引起異常。(這正是我們所期望的)?
?在執(zhí)行到add2語句時,由于它是錯誤的,所以會引發(fā)異常,轉(zhuǎn)到錯誤處理語句里來執(zhí)行。?
?ContextUtil.SetAbort();該語句使所有的數(shù)據(jù)庫操作回滾,這樣add1語句所插入的記錄也將不存在。(達到預(yù)期目標(biāo))?
?四:給程序添加強名(strong?name)?
?1:創(chuàng)建一對密鑰?
?用來創(chuàng)建密鑰的工具是稱為sn.exe的共享工具。通常通過命令提示運行它,該工具可執(zhí)行各種任務(wù)以生成并提取密鑰。我們需要用以下方式來運行sn.exe。?
sn?–k?key.snk?
?其中key.snk?代表將保存密鑰的文件的名稱。它的名稱可以是任意的,不過習(xí)慣上帶有.snk后綴名。?
?2:簽名?
?簽名通常是在編譯時進行的。簽名時,用戶可利用C#屬性通知編譯器應(yīng)該使用正確的密鑰文件對DLL進行簽名。要做到這一點用戶需要打開工程中的AssemblyInfo.cs文件并進行修改。?
?[assembly:AssemblyKeyFile(“..//..//key.snk”)]?
?注:key.snk文件和項目文件在同一個文件夾?
?五:編譯成DLL?(具體步驟)?
?菜單:(生成-生成)?
?如果一切正常,就會生成DLL文件?
?六:使用regsvcs.exe將Dll注冊到COM+?Services里面?
?我們需要用以下方式運行regsvcs.exe?
?regsvcs?dll文件名?
?如果一切正常的話,regsvcs.exe就會把dll輸入到COM+?Services中。?
?至此,我們已經(jīng)生成并注冊了這個可以由其它程序使用的類,現(xiàn)在,我們來寫一個控制臺程序來檢驗這個類是否正常運行?
?七:構(gòu)建客戶機?
?1:新建控制臺應(yīng)用程序項目?
?菜單(文件-新建-項目)?
?選擇控制臺應(yīng)用程序?,并選擇?添入解決方案?,確定?
?2:同上面的第二步一樣,添加對System.EnterpriseServices的引用。?
?3:添加對自己剛才做好的類的引用。?
?菜單(項目-添加引用-瀏覽),選擇剛才生成的DLL,確定?
?4:輸入以下程序?
using?System;?
using?COMPlusSamples;?
using?System.EnterpriseServices;?
public?class?Client?
{?
public?static?void?Main()?
{?
TxCfgClass?cfg?=?new?TxCfgClass();?
cfg.Add();?
}?
}?
?5:將控制臺程序設(shè)置為啟動項,然后編譯運行,就會看到結(jié)果。?
?正如我們希望的,第一條記錄沒有插入數(shù)據(jù)庫?
總結(jié)
以上是生活随笔為你收集整理的在C#中使用COM+实现事务控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用 ASP.NET 实用工具加密凭
- 下一篇: 西服多少钱啊?