2016-12-16 72 views
1

我收到错误消息“连接未关闭,连接的当前状态为打开。当在我的SSIS包的C#脚本任务中执行下面块中的conn.Open();命令时。在谷歌搜索,我看到其他人说这可能是由于尝试/捕获不导致conn.Close();,但不应该“using”处理完成后的连接?在C#脚本中使用SSIS ADO.NET连接时出错任务

bool fileRecordExists; 
using (SqlConnection conn = (SqlConnection)Dts.Connections["connectionName"].AcquireConnection(Dts.Transaction)) 
{ 
    SqlCommand sqlCmd = new SqlCommand(queryString, conn); 
    conn.Open(); 
    fileRecordExists = (int)sqlCmd.ExecuteScalar() > 0 ? true : false; 
} 

回答

1

SSIS为您打开连接。我通常做的,无论是对还是错,都是使用连接字符串创建一个新连接,该连接字符串可以非常类似于获取活动连接的方式获取。

我也有时会使用AcquireConnection方法,但不要打开或关闭脚本中的连接。

+0

谢谢,这让我失去了第一个错误。但是我们使用的帐户的密码并未存储在连接字符串中 - 因此,尝试打开连接时身份验证失败。我会尝试获取活动连接。 – Gerald

1

这会有所帮助。 连接对象是ADO.NET数据提供者的一部分,它是与数据源的唯一会话。连接对象正在处理C#应用程序(任务)和数据源之间的物理通信部分。

连接对象连接到指定的数据源并打开C#应用程序和数据源之间的连接,取决于连接字符串中指定的参数。建立连接时,SQL命令将在连接对象的帮助下执行,并检索或操作数据源中的数据。

数据库活动结束后,应关闭连接并释放数据源资源。

+0

感谢您的信息!关于你的最后一行,我需要手动释放/关闭连接吗?我的代码目前很简单: '''''''查询字符串=“选择COUNT(*)从表格WHERE文件名='”+ filenametoprocess +“'”; SqlConnection conn =(SqlConnection)Dts.Connections [“SSISDataConnection”]。AcquireConnection(null); SqlCommand sqlCmd = new SqlCommand(queryString,conn); bool fileRecordExists =(int)sqlCmd.ExecuteScalar()> 0? true:false;' 我应该添加'conn.Close()'吗?我需要释放任何东西吗? – Gerald

+0

是的..这是任何数据库连接的最佳做法。 关闭连接将释放资源,每个DB都有最大连接数。 https://msdn.microsoft.com/en-us/library/ms187030.aspx –