在SSIS中,我使用以下连接字符串定义了连接:
ConnectionManager connectionManager = this.Dts.Connections["Spears"];
object acquireConnection = connectionManager.AcquireConnection(this.Dts.Transaction);
SqlConnection con = acquireConnection as SqlConnection;
con.Open();
我正在尝试从脚本任务中使用此连接:
{{1}}
执行时
作为OleDbConnection或OdbcConnection进行转换也会返回null。
我做错了什么?
答案 0 :(得分:2)
出现此问题的原因是您在SSIS包中使用 OLEDB 连接而不是 ADO.NET 连接。
更改后,代码应该可以正常工作,即使Dts.Transaction
为空。
答案 1 :(得分:1)
有几个问题。首先,您没有像在SqlConnection con = new 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();
中了解详情
答案 3 :(得分:0)
您正在使用带有SqlConnection对象的SQLNCLI11.1 Provider。更改您的DTS连接,使用“ADO.NET Connection”并尝试它。