我正在构建一个 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?
正如
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;
以防万一有人用 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
谢谢普拉文。
我在您的链接中找到了相关部分:
“如果必须调用返回非托管对象的连接管理器的 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 及更高版本)作为“连接管理器”对话框的“全部”页面上的“扩展属性”值。”
谢谢!