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

Osc*_*car 6 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());

}
Run Code Online (Sandbox Code Playgroud)

当我关闭BIDS时,我收到以下消息:"System.InvalidCastException:无法将类型为'System .__ ComObject'的COM对象强制转换为类类型'System.Data.OleDb.OleDbConnection'.表示COM组件的类型的实例不能是转换为不代表COM组件的类型;但只要底层COM组件支持对接口的IID的QueryInterface调用,它们就可以转换为接口.

使用Ado.Net连接时,相同的代码可以正常工作.我可以在这里使用OleDbConnection,或者Script Component仅支持Ado.Net吗?

提前致谢.

pra*_*een 10

正如在提到的那样 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.
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

MSDN 链接


小智 5

以防万一有人用谷歌搜索并找不到真正的解决方案,您必须覆盖 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);
}
Run Code Online (Sandbox Code Playgroud)

HTH

  • 我不认为这可以与没有集成安全性的连接一起使用。据我所知, connMgr.ConnectionString 不保存连接密码。 (4认同)

Osc*_*car 4

谢谢普拉文。

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

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

谢谢!