Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssis 是否可以将OLEDB连接与脚本组件一起使用?_Ssis_Script Component - Fatal编程技术网

Ssis 是否可以将OLEDB连接与脚本组件一起使用?

Ssis 是否可以将OLEDB连接与脚本组件一起使用?,ssis,script-component,Ssis,Script Component,我正在构建ssis包,希望在脚本组件中使用现有的OLEDBC连接。这是我的密码: public override void AcquireConnections(object Transaction) { base.AcquireConnections(Transaction); cm = this.Connections.Connection; con = (OleDbConnection)cm.AcquireConnection(Transaction); M

我正在构建ssis包,希望在脚本组件中使用现有的OLEDBC连接。这是我的密码:

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

同样的代码也适用于Ado.Net连接。我可以在这里使用OleDbConnection还是脚本组件只支持Ado.Net

提前感谢。

如MSDN中所述

如果要使用Aquire连接方法,则需要使用ADO.NET连接管理器

要使用OLEDB连接,请添加对Microsoft.SqlServer.DTSRuntimeWrap的引用,然后尝试以下代码

ConnectionManager cm = Dts.Connections["oledb"];
IDTSConnectionManagerDatabaseParameters100 cmParams =
cm.InnerObject as IDTSConnectionManagerDatabaseParameters100;
OleDbConnection conn = cmParams.GetConnectionForSchema() as OleDbConnection;
谢谢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文件,然后在“连接管理器”对话框的“所有”页面上输入Excel 8.0 for Excel 97及更高版本作为扩展属性的值


谢谢

为了防止有人在谷歌上搜索到这个问题而找不到真正的解决方案,您必须重写AcquireConnections、PreExcute和ReleaseConnections方法才能使用OLEDB连接。诀窍在于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

脚本组件中没有这样的Dts属性,它是一个脚本任务属性。不过,我在您提供的链接中找到了答案,谢谢。@praveen-正确的链接是-您的链接不再有效。而且我的脚本任务不知道我使用中的任何Microsoft.SqlServer.DTSRuntimeWrap。它不能编译。这是从哪里来的?我认为如果没有集成的安全性,这种连接是无法工作的。。就我所记得的,connMgr.ConnectionString没有保存连接密码。@Oscar是的,我也看到了。来自ConnectionManager的ConnectionString将丢失密码。所以它只适用于Windows Auth。对我帮助很大。我将我的连接从OLEDB更改为ADO.NET,工作正常。这将帮助您:[link]@Akxaya感谢您的建议。一个缺点是.ConnectionString方法只有在使用Windows身份验证时才有效。这是因为访问ConnManager.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);
}