我收到错误:"ExecuteReader 需要打开的连接",我知道解决方法是添加连接。打开()/连接。关闭()。我关于这个错误的问题更多的是让我确切地了解引擎盖下发生的事情。
我目前正在使用"USING"语句,我希望它能为我打开和关闭/处置连接。所以我想我不明白为什么它没有按预期工作,我需要显式编码连接。打开()/连接。自己关闭()来解决问题。我做了一些研究,发现人们遇到了类似的问题,因为他们使用的是静态连接。就我而言,我正在创建连接的新实例...因此,它困扰着我,希望能深入了解这个问题,而不仅仅是修复它并继续前进。提前谢谢你。
这是代码:
try
{
using (SqlConnection connection = new SqlConnection(myConnStr))
using (SqlCommand command = new SqlCommand("mySPname", connection))
{
command.CommandType = CommandType.StoredProcedure;
//add some parameters
SqlParameter retParam = command.Parameters.Add("@RetVal", SqlDbType.VarChar);
retParam.Direction = ParameterDirection.ReturnValue;
/////////////////////////////////////////////////
// fix - add this line of code: connection.Open();
/////////////////////////////////////////////////
using(SqlDataReader dr = command.ExecuteReader())
{
int success = (int)retParam.Value;
// manually close the connection here if manually open it. Code: connection.Close();
return Convert.ToBoolean(success);
}
}
}
catch (Exception ex)
{
throw;
}
不会打开任何连接,它只会在调用 End Using 后释放任何分配的内存。
对于 SqlConnection,您必须在 using 块中显式打开它,只是不需要关闭它。
我还注意到您在使用 SqlConnection 时缺少一组括号 {}。也许这就是问题所在?它应该是这样的:
try
{
using (SqlConnection connection = new SqlConnection(myConnStr))
{
connection.Open();
using (SqlCommand command = new SqlCommand("InsertProcessedPnLFile", connection))
{
command.CommandType = CommandType.StoredProcedure;
//add some parameters
SqlParameter retParam = command.Parameters.Add("@RetVal", SqlDbType.VarChar);
retParam.Direction = ParameterDirection.ReturnValue;
/////////////////////////////////////////////////
// fix - add this line of code: connection.Open();
/////////////////////////////////////////////////
using(SqlDataReader dr = command.ExecuteReader())
{
int success = (int)retParam.Value;
// manually close the connection here if manually open it. Code: connection.Close();
return Convert.ToBoolean(success);
}
}
}
}