1

パッケージを動的に作成するSSISスクリプトタスク(SQL 2008 R2)についてサポートが必要です。Sage Timberline(現在はSage 300にリブランドされています)PervasiveSQL環境からSQLサーバーデータウェアハウスにデータをコピーするパッケージを改良しています。Timberlineへの接続を開き、データをSQLServerのテーブルにコピーするパッケージを作成できます。問題は、timberlineの会社ごと、およびSQLのテーブルごとに、個別のデータフロータスクを作成する必要があることです。3つのTimberline会社フォルダーと各フォルダー内のテーブルの数を考えると、これは作成に多くの時間がかかり、保守とトラブルシューティングが面倒になります。

Foreachループを使用して、ADO / ODBCソース(Timberline)、OLEデスティネーション(SQL)を作成し、列マッピングを動的に処理するパッケージを作成しようとしています。ここで、必要なことをほぼ 実行するコードを見つけました。

私はこのコードをテストしましたが、OLESQLのソースと宛先を使用するとうまく機能します。このスクリプトを機能させるのは、列のマッピングを動的に処理することです。したがって、100個程度のテーブルのForeachループに配置すると、各ループでデータフローを動的に作成して列をマップし、新しいパッケージを実行できます。

私の問題は、ODBCを使用してのみTimberlineに接続できることです。そのため、スクリプトを変更して、OLEではなくADO NET(ODBC)を使用したソース接続を作成する必要があります。私はこれを理解しようとして多くの問題を抱えています。誰かがこれを手伝ってくれませんか?

このアプローチ以外に、私が最初に試した他のいくつかのことを次に示します。

解決策:リンクサーバーをTimberline Pervasive SQLにセットアップする
問題:SQLサーバーが64ビットで、Timberlineドライバーが32ビットです。リンクサーバーを使用すると、アーキテクチャの不一致エラーが返されます。私はSageに電話しましたが、64ビットドライブをリリースする予定はないと言われました。

解決策:SQL転送タスクの1つを使用してください
問題:SQLデータベースでのみ機能します。このソースはPervasiveSQLデータベースです

解決策:「INSERT…INTO…」タイプのスクリプトを使用してください
問題:これにはリンクサーバーが必要です。上記の問題を参照してください

これが私が助けを必要としている元のVB.NETコードのセクションです:

'To Create a package named [Sample Package]
Dim package As New Package()
package.Name = "Sample Package"
package.PackageType = DTSPackageType.DTSDesigner100
package.VersionBuild = 1

'To add Connection Manager to the package
'For source database (OLTP)
Dim OLTP As ConnectionManager = package.Connections.Add("OLEDB")
OLTP.ConnectionString = "Data Source=.;Initial Catalog=OLTP;Provider=SQLNCLI10;Integrated Security=SSPI;Auto Translate=False;"
OLTP.Name = "LocalHost.OLTP"

'To add Load Employee Dim to the package [Data Flow Task]
Dim dataFlowTaskHost As TaskHost = DirectCast(package.Executables.Add("SSIS.Pipeline.2"), TaskHost)
dataFlowTaskHost.Name = "Load Employee Dim"
dataFlowTaskHost.FailPackageOnFailure = True
dataFlowTaskHost.FailParentOnFailure = True
dataFlowTaskHost.DelayValidation = False
dataFlowTaskHost.Description = "Data Flow Task"

'-----------Data Flow Inner component starts----------------
Dim dataFlowTask As MainPipe = TryCast(dataFlowTaskHost.InnerObject, MainPipe)
' Source OLE DB connection manager to the package.
Dim SconMgr As ConnectionManager = package.Connections("LocalHost.OLTP")

' Create and configure an OLE DB source component.
Dim source As IDTSComponentMetaData100 = dataFlowTask.ComponentMetaDataCollection.[New]()
source.ComponentClassID = "DTSAdapter.OLEDBSource.2"

' Create the design-time instance of the source.
Dim srcDesignTime As CManagedComponentWrapper = source.Instantiate()
' The ProvideComponentProperties method creates a default output.
srcDesignTime.ProvideComponentProperties()
source.Name = "Employee Dim from OLTP"

' Assign the connection manager.
source.RuntimeConnectionCollection(0).ConnectionManagerID = SconMgr.ID
source.RuntimeConnectionCollection(0).ConnectionManager = DtsConvert.GetExtendedInterface(SconMgr)
' Set the custom properties of the source.
srcDesignTime.SetComponentProperty("AccessMode", 0)
' Mode 0 : OpenRowset / Table - View
srcDesignTime.SetComponentProperty("OpenRowset", "[dbo].[Employee_Dim]")
' Connect to the data source, and then update the metadata for the source.
srcDesignTime.AcquireConnections(Nothing)
srcDesignTime.ReinitializeMetaData()
srcDesignTime.ReleaseConnections()

前もって感謝します!

4

1 に答える 1

0

ここにある C# コードは、ソースと宛先の間で派生列の変換が必要な場合に必要なものです...

http://bifuture.blogspot.com/2011/01/ssis-adding-derived-column-to-ssis.html

ソースと宛先の接続を機能させるには、COM と .Net の間で機能させるための秘密のソースがいくつかあります... http://blogs.msdn.com/b/mattm/archive/2008/12/30/api -sample-ado-net-source.aspx OleDB 接続で何をすべきかを示す同様のページもあります。

ソース テーブルの作成は簡単です。アクセス可能な使用可能な ODBC メタデータ コレクションは、GetSchema("MetaDataCollections") で取得する必要があります。これにより、その特定の ODBC ドライバーで使用可能なスキーマ コレクションのリストが返されます。次に、GetSchema("DataTypes") から返されるデータ型を確認します。これにより、GetSchema("Columns") から取得した各列のデータ型を正しく解釈して、SQL Server にテーブル スクリプトを作成させることができます (これはあなたがやったと仮定しています)。少なくとも、主キーを持つテーブルを特定するには、GetSchema("Indexes") を操作するために、GetSchema("Tables") から返された各テーブルをループする必要があります。一度に 1 つのテーブルのインデックスをクエリする必要があるというバグがあります。

私がしたことは、親 SSIS パッケージのオブジェクト変数に Tables および Columns コレクションを取得することでした。Timberline は非常に高速であるため (そうではありません)、すべての列をプルダウンしてローカルでフィルター処理する方が効率的であると思われます。必要に応じて、SQL Server でテーブルを作成するためにこれを行います。

それが完了したら、再びテーブルのローカル コピーを使用して、"デザイン モード" のスクリプト タスクで SSIS パッケージを操作し (ソース テーブルとターゲット テーブルを変更し、列のマッピングをやり直します)、メモリ内の SSIS を実行します。パッケージ。

私にとっては、理解するのにしばらく時間がかかりました。上記の両方の URL が必要でした。.Net 2.0 Dts.PipelineWrap および Dts.RuntimeWrap .dll を見つけて Microsoft.Net\FrameworkV2.0xxxxx フォルダーにコピーし、「using DtsPW = Microsoft.SqlServer」を設定する前に、それらを使用する各スクリプト タスクでこれらを参照しました。 .Dts.Pipeline.Wrapper」など

なお、Timberline は 32 ビット ODBC であるため、"X86" を使用するように SSIS パッケージをビルドし、.Net 2.0 フレームワークを使用するようにスクリプト タスクをターゲットにする必要があると思います。

複数の Timberline DB を 1 つの SQL Server DB にコピーする必要があったため、派生列コードを使用しました。派生列は、"CompanyID" 値を SQL Server への出力パイプラインに追加します。

最後に、宛先がアタッチされているパイプラインに基づいて、宛先の仮想入力列を外部メタデータ列にマップします。

      foreach (DtsPW.IDTSVirtualInputColumn100 vColumn in destVirtInput.VirtualInputColumnCollection)
            {
                var vCol = destInst.SetUsageType(destInput.ID, destVirtInput, vColumn.LineageID, DtsPW.DTSUsageType.UT_READWRITE);
                destInst.MapInputColumn(destInput.ID, vCol.ID, destInput.ExternalMetadataColumnCollection[vColumn.Name].ID);

            }

とにかく、そのコードは、bifuture.blogspot.com ページのコンテキストでより意味のあるものになります。

EzApi ライブラリもこれに役立ちますが、そのための AdoNet 接続ソースは仮想クラスとしてコーディングされているため、使用する特定のクラスを実装する必要があります。私のC#カンフーは、私が持っている時間では十分に強くありません...

また、CozyRoc は、カスタム SSIS コントロール (データ フロー ソース コントロールと宛先コントロール...) を備えたツールセットを販売しています。

私のパッケージは今では十分に機能しているようです...ああ、もう1つ、TimberlineへのDSNなしのODBC接続を使用しようとして運がありませんでした.Dsn = dsnname; Uid = user; Pwd = pwd;

64 ビット ランドで実行されている SSIS パッケージは、64 ビット OS で 32 ビット DSN を認識できません。少なくとも、私には機能しませんでした (win7-64、32 ビット テキスト ODBC DSN)。

于 2013-07-12T23:07:38.820 に答える