2013-04-03 27 views
5

私はssisパッケージを構築しています。スクリプトコンポーネント内に既存のOleDbConnectionを使用したいと考えています。ここに私のコードです:スクリプトコンポーネントでOleDbConnectionsを使用することは可能ですか?

public override void AcquireConnections(object Transaction) 
{ 
    base.AcquireConnections(Transaction); 
    cm = this.Connections.Connection; 
    con = (OleDbConnection)cm.AcquireConnection(Transaction); 
    MessageBox.Show(con.ToString()); 

} 

私はBIDSを閉じると、私は次のメッセージを取得: 「System.InvalidCastExceptionの:のSystem.Data.OleDbクラスタイプに 『システム.__ ComObject』「タイプのCOMオブジェクトをキャストすることができませんが.OleDbConnection '。COMコンポーネントを表す型のインスタンスは、COMコンポーネントを表さない型にキャストできませんが、基本COMコンポーネントがインターフェイスのIIDのQueryInterface呼び出しをサポートしている限り、インターフェイスにキャストできます。

同じコードがAdo.Net接続で正常に動作します。ここでOleDbConnectionを使用できますか?Script ComponentはAdo.Netのみをサポートしていますか?

ありがとうございます。あなたはAquire Connectionメソッドを使用したい場合はADO.NET接続マネージャを使用する必要がMSDN

You cannot call the AcquireConnection method of connection managers that return 
unmanaged objects, such as the OLE DB connection manager and the Excel 
connection manager, in the managed code of a Script task. 

で述べたように

+0

これがお手伝いします:[リンク](http://akshaya-m.blogspot.com/2017/02/ssis-script-task-connectionstring -for.html) – Akxaya

答えて

3

ありがとうpraveen。

私はあなたのリンクの関連する部分を見つけました:

「あなたが管理されていないオブジェクトを返す接続マネージャのAcquireConnectionメソッドを呼び出す必要がある場合は、は、ADO.NET接続マネージャを使用しますが、ADOを設定するとき。 OLE DBプロバイダを使用するために.NET接続マネージャを使用するには、OLE DB用の.NET Frameworkデータプロバイダを使用して接続します。この場合、AcquireConnectionメソッドはアンマネージオブジェクトではなくSystem.Data.OleDb.OleDbConnectionを返します。 Excelデータソースで使用するADO.NET接続マネージャーを選択し、Jet用にMicrosoft OLE DBプロバイダーを選択し、Excelファイルを指定して、Excel 8.0(Excel 97以降用)を拡張プロパティーの値としてコンマネージャマネージャ]ダイアログボックスを表示します。

ありがとうございます!

+0

たくさんお手伝いしました。 OLEDBからADO.NETへの接続を変更したところ、問題なく動作しました。 – renanlf

7

Microsoft.SqlServer.DTSRuntimeWrapへの参照を追加OLEDB接続を使用し、以下のコードを試すために、

ConnectionManager cm = Dts.Connections["oledb"]; 
IDTSConnectionManagerDatabaseParameters100 cmParams = 
cm.InnerObject as IDTSConnectionManagerDatabaseParameters100; 
OleDbConnection conn = cmParams.GetConnectionForSchema() as OleDbConnection; 

MSDNLink

+0

スクリプトコンポーネントにはこのようなDtsプロパティはありません。これはスクリプトタスクプロパティです。しかし、あなたが提供したリンクに答えが見つかりました。ありがとうございました。 – Oscar

3

誰かがこれを見つけて実際の解決策を見つけることができない場合は、OleDbConnectionを使用するために、AcquireConnections、PreExceute、およびReleaseConnectionsメソッドをオーバーライドする必要があります。トリックは、ConnectionStringプロパティです:

OleDbConnection con; 
OleDbCommand cmd; 
IDTSConnectionManager100 connMgr; 

/*Here you prepare the connection*/ 
public override void AcquireConnections(object Transaction) 
{ 
    base.AcquireConnections(Transaction); 
    connMgr = this.Connections.YourConnName; 
    con = new OleDbConnection(connMgr.ConnectionString); 
} 

/*Here you prepare the sql command and open the connection*/ 
public override void PreExecute() 
{ 
    base.PreExecute(); 
    cmd = new OleDbCommand("Some Select", con); 
    cmd.CommandType = CommandType.Text; 
    con.Open(); 
} 

/*Here you execute your query for each input row*/ 
public override void Entrada0_ProcessInputRow(Entrada0Buffer Row) 
{ 
    OleDbDataReader dr = cmd.ExecuteReader(); 

    while (dr.Read()) 
    { 
     /*Do your stuff*/ 
    } 
} 

/*And here you release the connection*/ 
public override void ReleaseConnections() 
{ 
    base.ReleaseConnections(); 
    connMgr.ReleaseConnection(con); 
} 

HTH

+2

私はこれが統合されたセキュリティなしで接続で動作するとは思わない。私が知る限り、connMgr.ConnectionStringは接続パスワードを保持していない。 – Oscar

関連する問題