2011-07-20 41 views
1

我需要創建一個控制檯應用程序,該應用程序可以將表從一個遠程SQL Server實例複製到另一個遠程SQL Server實例。如何使用EzAPI在遠程SQL Server源和目標上創建和執行SSIS包

我使用了一個名爲EzAPI

兩個連接(來源和目的地)和表名,將提供作爲參數傳遞給控制檯應用程序庫。

這裏是我的嘗試:

public class OleDBToOleDB : EzSrcDestPackage<EzOleDbSource, EzSqlOleDbCM, EzOleDbDestination, EzSqlOleDbCM> 
    { 

     public OleDBToOleDB(Package p) : base(p) { } 

     public static implicit operator OleDBToOleDB(Package p) { return new OleDBToOleDB(p); }     

     public OleDBToOleDB(string SrcServer, string SrcDB, string SrcTable,string SrcUser,string SrcPassword, string DstServer, string DstDB, string DstTable,string DstUser,string DstPassword)    
     { 
      SrcConn.SetConnectionString(SrcServer, SrcDB); 
      SrcConn.ServerName = SrcServer; 
      SrcConn.InitialCatalog = SrcDB; 
      SrcConn.UserName = SrcUser; 
      SrcConn.Password = SrcPassword; 

      Source.Table = SrcTable; 

      DestConn.SetConnectionString(DstServer, DstDB); 
      DestConn.ServerName = DstServer; 
      DestConn.InitialCatalog = DstDB; 
      DestConn.UserName = DstUser; 
      DestConn.Password = DstPassword; 


      Dest.Table = DstTable;       
     }   
    } 

static void Main(string[] args) 
     {    
      OleDBToOleDB p = new OleDBToOleDB("localhost", "TestDB", "Address", "sa", "123", "localhost", "DestDB", "Address", "sa", "123"); 

      p.Execute(); 

      Console.Write(string.Format("Package2 executed with result {0}\n",p.ExecutionResult)); 
     } 

這段代碼的問題是:

  • 它不創建目標服務器上的表,所以我應該 通過自己手動創建它。
  • 這段代碼成功運行在本地主機,但是當我嘗試 更改服務器名稱到遠程服務器,它提出了這樣的錯誤:

Unhandled Exception: System.Runtime.InteropServices.COMException (0xC020801C): Exception from HRESULT: 0xC020801C

在網絡上搜索後,我發現這個錯誤的手段該錯誤是Integration services AcquireConnections異常。

那麼我怎麼能得到這個代碼在遠程sql服務器實例上運行,並讓包在傳輸數據之前在目標服務器上創建表。

預先感謝您。

回答

1

由於SSIS需要在表格中爲每個列獲取整個元數據,所以在生成包的過程中SSIS都需要提交。您可以將ValidateMetadata屬性設置爲false,在這種情況下,它不會對其進行驗證,但您需要自行填寫所有數據。這並不容易。

我認爲最容易的事情,你可以做的是: 1)生成包本地連接和關閉驗證你的目標組件 2)現在設置新的連接字符串源和目標compoennts 3 )運行包

這是一個不是很乾淨的解決方法。這通常應該使用配置完成,但由於您不保存包,因此您也可以嘗試此操作。

我認爲使用沒有SSIS的SqlBuldCopy實現你的任務也更容易