是否可以将 OleDbConnections 与脚本组件一起使用?

问题描述 投票:0回答:3

我正在构建一个 ssis 包,并且希望在脚本组件内使用现有的 OleDbConnection。这是我的代码:

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

当我关闭投标时,我收到以下消息: “System.InvalidCastException:无法将类型“System.__ComObject”的 COM 对象转换为类类型“System.Data.OleDb.OleDbConnection”。表示 COM 组件的类型的实例无法转换为不表示 COM 组件的类型;但是只要底层 COM 组件支持针对接口 IID 的 QueryInterface 调用,它们就可以转换为接口。”

相同的代码在 Ado.Net 连接上运行良好。我可以在这里使用 OleDbConnection 还是脚本组件仅支持 Ado.Net?

sql-server ssis etl script-component
3个回答
14
投票

正如

MSDN

中提到的

您无法在脚本任务的托管代码中调用返回非托管对象的连接管理器(例如 OLE DB 连接管理器和 Excel 连接管理器)的 AcquireConnection 方法。

如果你想使用

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 链接


5
投票

以防万一有人用 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


5
投票

谢谢普拉文。

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

“如果必须调用返回非托管对象的连接管理器的 AcquireConnection 方法,请使用 ADO.NET 连接管理器。当您将 ADO.NET 连接管理器配置为使用 OLE DB 提供程序时,它会使用 . NET Framework Data Provider for OLE DB。 在这种情况下,AcquireConnection 方法返回 System.Data.OleDb.OleDbConnection,而不是非托管对象。要配置 ADO.NET 连接管理器以与 Excel 数据源一起使用,请选择 Microsoft OLE DB Provider for Jet,指定一个 Excel 文件,然后输入 Excel 8.0(对于 Excel 97 及更高版本)作为“连接管理器”对话框的“全部”页面上的“扩展属性”值。”

谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.