6

我正在构建一个 ssis 包,我希望在脚本组件中使用现有的 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 还是脚本组件只支持 Ado.Net?

提前致谢。

4

3 回答 3

12

正如文中提到的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 链接

于 2013-04-03T16:22:46.220 回答
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);
}

高温高压

于 2013-11-14T14:47:54.427 回答
3

谢谢普雷文。

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

“如果您必须调用返回非托管对象的连接管理器的 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 和更高版本)作为扩展属性的值。”

谢谢!

于 2013-04-03T18:35:38.603 回答