在C#中使用COM+實現事務控制 (轉)
在中使用COM+實現事務控制:namespace prefix = o ns = "urn:schemas--com::office" />
技術是大力推廣的下一代平臺技術,自從.NET技術架構Beta2版本的正式釋出,此項技術也逐漸走向成熟和穩定。按照微軟的平臺佔有率,我們不難想象得到,在未來的一兩年內.NET技術必定會勢如破竹一般的登上主流的技術平臺,而一個新的技術平臺得以發展的最重要的前提是:他不會徹底的摒棄以前的技術,這一點對於.NET技術來說指的就是COM/COM+技術了。
一般來說,在IT技術界以及產業,技術的換代速度非常得驚人,而慣例是所有的新技術都會遵循向下相容的原則,但是.NET技術不僅僅做到了這一點,.NET甚至實現了相互之間的各自,這一點是非常難能可貴的。也就是說,不但我們可以在.NET中呼叫COM元件,同時也可以在COM元件中正常的呼叫.NET元件。這點帶來的好處是顯而易見的,一方面我們可以保持現有的技術資源,另一方面,在現有資源中可以利用.NET所帶來的各種新技術。
一般的事務控制要求事務裡所做的操作必須在同一個資料庫內,這樣在出現錯誤的時候才能回滾(RllBack)到初始狀態。這就存在一個問題,在分散式應用中,我們往往需要同時操作多個資料庫,使用資料庫本身的事務處理,很難滿足程式對事務控制的要求。在COM+中,提供了完整的事務服務,我們可以利用它來完成在分散式應用程式中的事務控制。
具體過程如下
一:用VS.NET生成一個類庫 。
二:新增對System.EnterpristServices的引用,具體步驟
選單:(專案-新增引用-在.NET選項卡選擇System.EnterpristServices-確定)
三:構建類
1:源程式
using System;
using System.EnterpriseServices;
using System.Data.Client;
using System.Reflection;
namespace COMPlusSamples
{
//表明需要事務支援
[ Transaction(TransactionOption.Required) ]
//宣告為應用程式,還可以選擇Library,表示為庫應用程式
[assembly: ApplicationActivation(ActivationOption.Server)]
//描述資訊
[assembly: Description("sample")]
public class TxCfgClass : ServicedComponent
{
private static string init1 = "user id=sa;pass=;initial catalog=pubs;data =(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();
}
//新增一條記錄到資料庫
public void Add()
{
try
{
//在一資料庫中插入一條記錄
ExecSQL(init1, add1);
Console.WriteLine("the operation in the same database completely");
//在另外一個資料庫中插入兩條記錄
//這次的是一個錯誤的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)
{
//事務回滾
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 succesully");
Console.Read();
}
}
}
}
2:程式說明:
新增名稱空間 using System.EnterpriseServices;因為本程式使用了其中的ContextUtil類
[ Transaction(TransactionOption.Required) ] 說明DLL需要事務支援
本程式的TxCfgClass 類從ServicedComponent類中繼承,這樣並不會影響該類,而只是在該類中新增了兩個額外的方法,這兩個方法可以使程式碼共享變得更加容易
程式使用的資料庫在本機執行,init1 和 init2是兩個連線資料庫的連線字串,init連線pubs資料庫,inin2連線northwind資料庫,這是sql2000中自帶的示例資料庫。add1和add2是兩條sql語句,作用是分別向兩個資料庫的表裡新增一條記錄。注意:add2是一條錯誤的語句,因為根本沒有sample表,這樣,會在執行時引起異常。(這正是我們所期望的)
在執行到add2語句時,由於它是錯誤的,所以會引發異常,轉到錯誤處理語句裡來執行。
ContextUtil.SetAbort();該語句使所有的資料庫操作回滾,這樣add1語句所插入的記錄也將不存在。(達到預期目標)
四:給程式新增強名(strong name)
1:建立一對金鑰
用來建立金鑰的工具是稱為sn.exe的共享工具。通常透過命令提示執行它,該工具可執行各種任務以生成並提取金鑰。我們需要用以下方式來執行sn.exe。
sn –k key.snk
其中key.snk 代表將儲存金鑰的的名稱。它的名稱可以是任意的,不過習慣上帶有.snk字尾名。
2:簽名
簽名通常是在編譯時進行的。簽名時,可利用C#屬性通知應該使用正確的金鑰檔案對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中。
至此,我們已經生成並註冊了這個可以由其它程式使用的類,現在,我們來寫一個控制檯程式來檢驗這個類是否正常執行
七:構建客戶機
1:新建控制檯應用程式專案
選單(檔案-新建-專案)
選擇控制檯應用程式 ,並選擇 添入解決方案 ,確定
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:將控制檯程式設定為啟動項,然後編譯執行,就會看到結果。
正如我們希望的,第一條記錄沒有插入資料庫
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991224/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用C#開發COM+元件 (轉)C#元件
- AOP實現事務控制的疑惑
- 在SQL SERVER中實現事務的部分回滾SQLServer
- 在C#中利用DirectX實現聲音播放(轉)C#
- 在LINUX中實現流量控制器(轉)Linux
- C#實現控制元件陣列 (轉)C#控制元件陣列
- 如何在Redis中實現事務Redis
- C#中寫簡單的COM+元件C#元件
- Spring中的事務控制Spring
- 在BCB中使用向量實現控制元件陣列 (轉)控制元件陣列
- spring基於註解配置實現事務控制Spring
- 說說在 Spring 中,如何程式設計實現事務管理Spring程式設計
- 使用Spring Boot實現事務管理Spring Boot
- C#二維陣列在SLG中的實現和使用C#陣列
- Spring事務專題(四)Spring中事務的使用、抽象機制及模擬Spring事務實現Spring抽象
- 在 Wed 中應用 MyBatis(同時使用MVC架構模式,以及ThreadLocal 事務控制)MyBatisMVC架構模式thread
- C#處理Access中的事務C#
- oracle實驗記錄 (事務控制)Oracle
- 怎樣在遊戲設計製作中實現指令碼控制(轉)遊戲設計指令碼
- 使用JOTM實現分散式事務的例子分散式
- 使用Spring Boot實現分散式事務Spring Boot分散式
- 在Java中利用動態代理實現資料庫連線與事務的自動管理【轉】Java資料庫
- Spring宣告式事務控制原理之宣告式事務的重要元件在AOP中的應用Spring元件
- Spring系列之事務的控制 註解實現+xml實現+事務的隔離等級SpringXML
- struts 框架使用,出現的事務控制問題,請高手做答框架
- 為什麼在 Redis 實現 Lua 指令碼事務?Redis指令碼
- 【原創】Mysql中事務ACID實現原理MySql
- WebForm中C#事務回滾的例子WebORMC#
- MySQL事務實現原理MySql
- Kafka事務實現原理Kafka
- 使用Spring Boot實現Redis事務 | VinsguruSpring BootRedis
- 使用Apache Ignite實現無死鎖事務Apache
- 在vim中實現批次加密(轉)加密
- 事務使用中如何避免誤用分散式事務分散式
- 不要在儲存過程中控制事務儲存過程
- Golang在整潔架構基礎上實現事務Golang架構
- C#中實現DataGrid雙向排序(轉)C#排序
- 在CGI中實現session的想法和實現 (轉)Session