熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

在C#中使用COM+實現事務控制

2013-11-13 10:56:27  來源: .NET編程 

  NET技術是微軟大力推廣的下一代平台技術自從NET技術架構的正式發布此項技術也逐漸走向成熟和穩定按照微軟的平台系統占有率我們不難想象得到在未來的一兩年內NET技術必定會勢如破竹一般的登上主流的技術平台而一個新的技術平台得以快速發展的最重要的前提是他不會徹底的摒棄以前的技術這一點對於NET技術來說指的就是COM/COM+技術了

  一般來說在IT技術界以及硬件產業技術的更新換代速度非常得驚人而慣例是所有的新技術都會遵循向下兼容的原則但是NET技術不僅僅做到了這一點NET甚至實現了相互之間的各自調用這一點是非常難能可貴的也就是說不但我們可以在NET組件中調用COM組件同時也可以在COM組件中正常的調用NET組件這點帶來的好處是顯而易見的一方面我們可以保持現有的技術資源另一方面在現有資源中可以利用NET所帶來的各種新技術

  一般的數據庫事務控制要求事務裡所做的操作必須在同一個數據庫內這樣在出現錯誤的時候才能回滾(RllBack)到初始狀態這就存在一個問題在分布式應用程序中我們往往需要同時操作多個數據庫使用數據庫本身的事務處理很難滿足程序對事務控制的要求在COM+中提供了完整的事務服務我們可以利用它來完成在分布式應用程序中的事務控制

  具體過程如下

  一用VSNET生成一個類庫

  二添加對SystemEnterpristServices的引用具體步驟

  菜單(項目-添加引用-在NET選項卡選擇SystemEnterpristServices-確定)

  三構建類

  源程序

  using System;
  using SystemEnterpriseServices;
  using SystemDataSqlClient;
  using SystemReflection;
  namespace COMPlusSamples
  {
   //表明需要事務支持
   [ Transaction(TransactionOptionRequired) ]
   //聲明為服務器應用程序還可以選擇Library表示為庫應用程序
   [assembly: ApplicationActivation(ActivationOptionServer)]
   //描述信息
   [assembly: Description(sample)]
   public class TxCfgClass : ServicedComponent
   {
    private static string init = user id=sa;password=;initial catalog=pubs;data source=(local);
    private static string init = user id=sa;password=;initial catalog=NorthWind;data source=(local);
    private static string add = insert into authors(au_lnameau_fname) values(test test);
    private static string add = insert into sample values(test);
    //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 = connCreateCommand();
     cmdCommandText = sql;
     connOpen();
     cmdExecuteNonQuery();
     connClose();
    }
    //添加一條記錄到數據庫
    public void Add()
    {
     try
     {
      //在一數據庫中插入一條記錄
      ExecSQL(init add);
      ConsoleWriteLine(the operation in the same database completely);
      //在另外一個數據庫中插入兩條記錄
      //這次執行的是一個錯誤的SQL語句
      ExecSQL(init add);
      ConsoleWriteLine(the operation in the other databasecompletely);
      ConsoleWriteLine(Record(s) added press enter);
      ConsoleRead();
     }
     catch(Exception e)
     {
      //事務回滾
      ContextUtilSetAbort();
      ConsoleWriteLine(Because there are some errors in the operation so transcation abort);
      ConsoleWriteLine(The error is + eMessage);
      ConsoleWriteLine(abort successfully);
      ConsoleRead();
     }
    }
   }
  }

  程序說明

  添加命名空間 using SystemEnterpriseServices;因為本程序使用了其中的ContextUtil類

  [ Transaction(TransactionOptionRequired) ] 說明DLL需要事務支持

  本程序的TxCfgClass 類從ServicedComponent類中繼承這樣並不會影響該類而只是在該類中添加了兩個額外的方法這兩個方法可以使代碼共享變得更加容易

  程序使用的sql server數據庫在本機運行init 和 init是兩個連接數據庫的連接字符串init連接pubs數據庫inin連接northwind數據庫這是sql中自帶的示例數據庫add和add是兩條sql語句作用是分別向兩個數據庫的表裡添加一條記錄注意add是一條錯誤的語句因為根本沒有sample表這樣會在執行時引起異常(這正是我們所期望的)

  在執行到add語句時由於它是錯誤的所以會引發異常轉到錯誤處理語句裡來執行

  ContextUtilSetAbort();該語句使所有的數據庫操作回滾這樣add語句所插入的記錄也將不存在(達到預期目標)

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

  創建一對密鑰

  用來創建密鑰的工具是稱為snexe的共享工具通常通過命令提示運行它該工具可執行各種任務以生成並提取密鑰我們需要用以下方式來運行snexe

  sn –k keysnk

  其中keysnk 代表將保存密鑰的文件的名稱它的名稱可以是任意的不過習慣上帶有snk後綴名

  簽名

  簽名通常是在編譯時進行的簽名時用戶可利用C#屬性通知編譯器應該使用正確的密鑰文件對DLL進行簽名要做到這一點用戶需要打開工程中的AssemblyInfocs文件並進行修改

  [assembly:AssemblyKeyFile(\\\\keysnk)]

  注keysnk文件和項目文件在同一個文件夾

  五編譯成DLL (具體步驟)

  菜單(生成-生成)

  如果一切正常就會生成DLL文件

  六使用regsvcsexe將Dll注冊到COM+ Services裡面

  我們需要用以下方式運行regsvcsexe

  regsvcs dll文件名

  如果一切正常的話regsvcsexe就會把dll輸入到COM+ Services中

  至此我們已經生成並注冊了這個可以由其它程序使用的類現在我們來寫一個控制台程序來檢驗這個類是否正常運行

  七構建客戶機

  新建控制台應用程序項目

  菜單(文件-新建-項目)

  選擇控制台應用程序 並選擇 添入解決方案 確定

  同上面的第二步一樣添加對SystemEnterpriseServices的引用

  添加對自己剛才做好的類的引用

  菜單(項目-添加引用-浏覽)選擇剛才生成的DLL確定

  輸入以下程序

  using System;
  using COMPlusSamples;
  using SystemEnterpriseServices;
  public class Client
  {
   public static void Main()
   {
    TxCfgClass cfg = new TxCfgClass();
    cfgAdd();
   }
  }

  將控制台程序設置為啟動項然後編譯運行就會看到結果

  正如我們希望的第一條記錄沒有插入數據庫


From:http://tw.wingwit.com/Article/program/net/201311/14821.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.