1

あるリモート SQL サーバー インスタンスから別のリモート SQL サーバー インスタンスにテーブルをコピーできるコンソール アプリケーションを作成する必要があります。

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));
        }

このコードの問題は次のとおりです。

  • 宛先サーバーにテーブルを作成しないため、自分で手動で作成する必要があります。
  • このコードは localhost で正常に実行されますが、サーバー名をリモート サーバーに変更しようとすると、次のエラーが発生します。

未処理の例外: System.Runtime.InteropServices.COMException (0xC020801C): HRESULT からの例外: 0xC020801C

Web で検索したところ、このエラーは、このエラーが統合サービスの AcquireConnections 例外であることを意味していることがわかりました。

では、このコードをリモートの SQL Server インスタンスで実行し、データを転送する前にパッケージで宛先サーバーにテーブルを作成するにはどうすればよいでしょうか。

前もって感謝します。

4

1 に答える 1

1

SSIS は、テーブル内の各列のメタデータ全体を取得する必要があるため、パッケージの生成時に両方のテーブルを作成する必要があります。ValidateMetadata プロパティを false に設定できます。この場合、検証は行われませんが、すべてのデータを自分で入力する必要があります。これは簡単ではありません。

あなたができる最も簡単なことは次のとおりだと思います:1)ローカル接続でパッケージを生成し、宛先コンポーネントの検証をオフにします2)新しい接続文字列をソースおよび宛先コンポーネントに設定します3)パッケージを実行します

これはあまりクリーンな回避策ではありません。これは通常、構成で行う必要がありますが、パッケージを保存しないので、これも試すことができます。

SSISなしでSqlBuldCopyを使用してタスクを実装する方が簡単だと思います

于 2012-01-27T11:45:38.437 に答える