免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
在C#中使用COM+實現(xiàn)事務(wù)控制
.NET技術(shù)是微軟大力推廣的下一代平臺技術(shù),自從.NET技術(shù)架構(gòu)Beta2版本的正式發(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(‘a(chǎn)u_lname‘,‘a(chǎn)u_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ù)期目標)



四:給程序添加強名(strong name)

1:創(chuàng)建一對密鑰

用來創(chuàng)建密鑰的工具是稱為sn.exe的共享工具。通常通過命令提示運行它,該工具可執(zhí)行各種任務(wù)以生成并提取密鑰。我們需要用以下方式來運行sn.exe。

sn –k key.snk

其中key.snk 代表將保存密鑰的文件的名稱。它的名稱可以是任意的,不過習慣上帶有.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ù)庫


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=90972

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C# 連接MySQL實現(xiàn)增刪改查(詳細步驟)
c# mysql數(shù)據(jù)庫連接(我碰到的問題)
分布式緩存系統(tǒng)Memcached簡介與實踐
ADO.NET
EF6 用Database.BeginTransaction管理事務(wù)
C#連接MySQL,并完成對數(shù)據(jù)庫的增刪查改
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服