可以将OleDbConnections与Script Component一起使用吗?

时间:2013-04-03 16:16:28

标签: ssis script-component

我正在构建一个ssis包,我希望在Script Component中使用现有的OleDbConnection。这是我的代码:

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 .__ ComObject'的COM对象强制转换为类类型'System.Data.OleDb.OleDbConnection'。表示COM组件的类型的实例不能转换为不代表COM组件的类型;但是只要底层的COM组件支持对接口的IID的QueryInterface调用,它们就可以转换为接口。“

相同的代码可以与Ado.Net连接一起使用。我可以在这里使用OleDbConnection,或者Script Component仅支持Ado.Net吗?

提前致谢。

3 个答案:

答案 0 :(得分:9)

正如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.

如果要使用ADO.NET方法

,则需要使用Aquire Connection连接管理器

为了使用OLEDB连接,请添加对Microsoft.SqlServer.DTSRuntimeWrap的引用并尝试以下代码

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

MSDN Link

答案 1 :(得分:3)

感谢praveen。

我在您的链接中找到了相关部分:

“如果必须调用返回非托管对象的连接管理器的AcquireConnection方法,使用ADO.NET连接管理器。当您将ADO.NET连接管理器配置为使用OLE DB提供程序时,它会连接通过使用OLE DB的.NET Framework数据提供程序。在这种情况下,AcquireConnection方法返回System.Data.OleDb.OleDbConnection而不是非托管对象。配置ADO.NET连接管理器以用于Excel数据源,选择Microsoft OLE DB Provider for Jet,指定Excel文件,并在Connection Manager对话框的All页面上输入Excel 8.0(对于Excel 97及更高版本)作为Extended Properties的值。“

谢谢!

答案 2 :(得分:3)

如果有人用Google搜索并找不到真正的解决方案,您必须覆盖AcquireConnections,PreExceute和ReleaseConnections方法才能使用OleDbConnection。技巧是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