SSIS脚本任务AcquireConnection返回Null

时间:2017-03-01 11:37:30

标签: c# ssis sqlconnection oledbconnection

在SSIS中,我使用以下连接字符串定义了连接:

ConnectionManager connectionManager = this.Dts.Connections["Spears"];
object acquireConnection = connectionManager.AcquireConnection(this.Dts.Transaction);
SqlConnection con = acquireConnection as SqlConnection;
con.Open();

我正在尝试从脚本任务中使用此连接:

{{1}}

执行时

  • connectionManager 以完全填充的ConnectionManager的形式返回 对象
  • acquireConnection 是一个System._ComObject
  • con 为空
  • 显然开放失败

作为OleDbConnection或OdbcConnection进行转换也会返回null。

我做错了什么?

4 个答案:

答案 0 :(得分:2)

出现此问题的原因是您在SSIS包中使用 OLEDB 连接而不是 ADO.NET 连接。

更改后,代码应该可以正常工作,即使Dts.Transaction为空。

答案 1 :(得分:1)

有几个问题。首先,您没有像在SqlConnection con = new SqlConnection();

中那样实例化新的SqlConnection对象

其次,除非将容器设置为参与事务,否则Dts.Transaction将为null,因此对SqlConnection的强制转换将为null。默认情况下支持事务,但除非父容器启动它,否则将不会有共享事务。这使得来自MS的示例有点误导。

我建议使用以下内容。假设您的连接管理器是OleDb连接,请将System.Data.Oledb添加到usings:

    OleDbConnection conn = new OleDbConnection(Dts.Connections[".\\sql2016.SSISAuditDB"].ConnectionString);
    using (conn)
    {
        conn.Open();
        OleDbCommand cmd = new OleDbCommand("SELECT 1", conn);
        int val = (int)cmd.ExecuteScalar();
        MessageBox.Show(val.ToString());
    }

在上面的代码中,我们只是从连接管理器中获取连接字符串,然后从中创建一个新连接。请注意,OleDbConnection实现了IDisposable,因此它可以包装在using()块中,并且不需要显式关闭。这是一个很好的做法,因为这意味着您不需要额外处理来关闭连接,例如,如果您添加了一个catch块。

答案 2 :(得分:0)

尝试以这种方式编码:

SqlConnection con;  
con = (SqlConnection)(Dts.Connections["Spears"].AcquireConnection(Dts.Transaction)as SqlConnection);  
con.Open();

Connecting to Data Sources in the Script Task MSDN article

中了解详情

答案 3 :(得分:0)

您正在使用带有SqlConnection对象的SQLNCLI11.1 Provider。更改您的DTS连接,使用“ADO.NET Connection”并尝试它。