3

私はあちこちを検索しました、そして私は今SOに尋ねなければなりません。EzAPIを使用して単純なデータフローを構築しようとしています。簡単なことではありませんが、私はこれを理解することを約束します。私が理解できないのは、どのように機能させるかEzOleDBDestinationです。これが私の完全なコードです

var a = new Application();
// using a template since it's impossible to set up an ADO.NET connection to MySQL
//  using EzAPI and potentially even with the raw SSIS API...
var pkg = new EzPackage(a.LoadPackage(@"C:\...\Package.dtsx", null));
pkg.Name = "Star";

var df = new EzDataFlow(pkg);
df.Name = "My DataFlow";

var src = new EzAdoNetSource(df);
src.Name = "Source Database";
src.SqlCommand = "SELECT * FROM enum_institution";
src.AccessMode = AccessMode.AM_SQLCOMMAND;
src.Connection = new EzConnectionManager(pkg, pkg.Connections["SourceDB"]);
src.ReinitializeMetaData();

var derived = new EzDerivedColumn(df);
derived.AttachTo(src);
derived.Name = "Prepare Dimension Attributes";
derived.LinkAllInputsToOutputs();
derived.Expression["SourceNumber"] = "id"; 
derived.Expression["Name"] = "(DT_STR,255,1252)description";

// EDIT: reordered the operation here and I no longer get an error, but 
//  I'm not getting any mappings or any input columns when I open the package in the designer
var dest = new EzOleDbDestination(df);
dest.AttachTo(derived, 0, 0);
dest.Name = "Target Database";
dest.AccessMode = 0;
dest.Table = "[dbo].[DimInstitution]";
dest.Connection = new EzConnectionManager(pkg, pkg.Connections["TargetDB"]);

// this comes from Yahia's link
var destInput = dest.Meta.InputCollection[0];
var destVirInput = destInput.GetVirtualInput();
var destInputCols = destInput.InputColumnCollection;
var destExtCols = destInput.ExternalMetadataColumnCollection;
var sourceColumns = derived.Meta.OutputCollection[0].OutputColumnCollection;

foreach(IDTSOutputColumn100 outputCol in sourceColumns) {
    // Now getting COM Exception here...
    var extCol = destExtCols[outputCol.Name];
    if(extCol != null) {
        // Create an input column from an output col of previous component.
        destVirInput.SetUsageType(outputCol.ID, DTSUsageType.UT_READONLY);
        var inputCol = destInputCols.GetInputColumnByLineageID(outputCol.ID);
        if(inputCol != null) {
            // map the input column with an external metadata column
            dest.Comp.MapInputColumn(destInput.ID, inputCol.ID, extCol.ID);
        }
    }
}

基本的に、呼び出しを伴うReinitializeMetadata()ものはすべて0xC0090001になります。これは、そのメソッドがエラーが発生する場所であるためです。私を助けるための実際の文書がないので、私はここでどんな教祖にも頼らなければなりません。

ソースDBはMySQLであり、ターゲットDBはSQLServerであることに注意してください。SSISデザイナを使用してこのようなパッケージを構築することは問題なく機能するので、それが可能であることを私は知っています。

他に何か間違ったことをしている場合は、遠慮なく教えてください。

編集:テンプレートとして使用している基本パッケージへのリンクは次のとおりです:http ://www.filedropper.com/package_1 。接続の詳細を編集しましたが、MySQLおよびSQLServerデータベースであれば問題ありません。パッケージはMySQLから読み取り(MySQL ADO.NETコネクタを使用)、SQLServerに書き込みます。

データベーススキーマはほとんど無関係です。テストのために、id(int)とdescription(varchar)の2つの列を持ち、idが主キーであるテーブルをMySQLで作成するだけです。SQLServerで同等の列を作成します。ここでの目標は、単に一方から他方にコピーすることです。ある時点でもっと複雑になるかもしれませんが、私は最初にこのハードルを乗り越えなければなりません。

4

2 に答える 2

2

私は今これをテストすることはできませんが、次のことがあなたがそれを機能させるのに役立つと確信しています:

更新-コメントによると、これのデバッグに関するいくつかの詳細情報と、ソースを含む完全なエンドツーエンドのサンプルへのリンク:

于 2012-05-10T18:21:49.640 に答える
1

私はこれとまったく同じ問題を抱えており、多くの実験でそれを解決することができました。つまり、送信元と宛先の両方の接続を設定し、両方の接続が設定された後でattachToを呼び出す必要があります。すべてのコンポーネントに対してattachToを呼び出す必要があります。

SSISパッケージをテンプレートとして開始し、それをプログラムで操作して一連の新しいパッケージを作成することについてのブログを作成しました。

この記事では、この問題について詳しく説明しています。

于 2015-01-19T06:46:43.780 に答える