2017-03-01 137 views
1

在SSIS中我有以下连接字符串中定义的连接:SSIS脚本任务AcquireConnection返回Null

Data Source=myserver;Initial Catalog=Spears;Provider=SQLNCLI11.1;Integrated Security=SSPI;Auto Translate=False; 

我试图使用从脚本任务这方面:

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

在执行

  • connectionManager作为完全填充的ConnectionManager 对象
  • acquireConnection是System._ComObject
  • CON为null
  • 明显打开CON失败

铸造作为OleDbConnection的或OdbcConnection返回null为好。

我在做什么错?

+0

检查'acquireConnection'变量是否为空。如果不是,那么将其转换为** SqlConnection **失败,因为您正在执行'作为SqlConnection'操作。 也检查这[来自MS的示例](https://msdn.microsoft.com/en-us/library/ms136018.aspx),根据它,你必须先创建SQLConnection然后分配。 – Ferdipux

回答

1

有几个问题。首先,您没有实例化新的SqlConnection对象,如SqlConnection con = new SqlConnection();

其次,除非将容器设置为参与事务,否则Dts.Transaction将为空,因此对SqlConnection的强制转换将为空。事务是默认支持的,但除非父容器启动它,否则不会有共享事务。这使得来自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块。

m

+0

谢谢,这个解决方案让我获得了一个工作解决方案的一半。当我尝试打开连接时,出现以下提示:“登录用户'usernameHere'失败。”这很奇怪,因为连接管理器中的同一连接在此脚本任务外工作。任何想法或帮助? – Vippy

+0

那是_is_奇!您正在使用集成安全性我的例子。这可能是密码被ssis消灭了。您可以尝试将连接字符串存储在一个变量中,并将其参数化,如果它有效。 –

0

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