打开 DataReader,必须关闭:在本地工作,部署失败。网页 API
Open DataReader, Must be Closed: Works Locally, Fails Deployed. WEB API
以下代码在本地调试时工作正常。每当我将它推送到我的开发服务器时,它就不再工作了。我找到了导致问题的代码,我可以通过添加下面有注释的行来修复,但我不确定为什么我必须添加该行。在 Web.Config 中,我有 MultipleActiveResultSets=true;
应该不会发生这种情况。所以,我不确定为什么我必须添加这一行。
public bool PersistStuff(string Account, List<Acknowledgement> acks)
{
string sql = "my.sp.AccountProcedure";
bool retVal = true;
using (SqlConnection conn = new SqlConnection(_accountConnection))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@Account", System.Data.SqlDbType.VarChar, 50)).Value = Account;
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
int id = int.Parse(reader[0].ToString());
//*************************
// This is the line I added
reader.Close();
//*************************
sql = "my.sp.AccountAcknowledgementProcedure";
using (SqlCommand cmd2 = new SqlCommand(sql, conn))
{
cmd2.CommandType = System.Data.CommandType.StoredProcedure;
foreach (Acknowledgement item in acks)
{
cmd2.Parameters.Clear();
cmd2.Parameters.Add(new SqlParameter("@severity", System.Data.SqlDbType.VarChar, 25)).Value = item.Severity.ToString();
if (!string.IsNullOrEmpty(item.ErrorData))
cmd2.Parameters.Add(new SqlParameter("@errorData", System.Data.SqlDbType.VarChar, 500)).Value = item.ErrorData;
else
cmd2.Parameters.Add(new SqlParameter("@errorData", System.Data.SqlDbType.VarChar, 500)).Value = DBNull.Value;
cmd2.ExecuteNonQuery();
}
}
}
else
{
retVal = false;
}
}
}
}
return retVal;
}
在我写问题的时候,我忘记了我的 Web.Debug.Config 和 Web.Release.Config 中有 xdt:Transform
。查看我的调试和发布配置后,在使用的连接字符串中都没有 MultipleActiveResultSets=true;
。我更改了每个配置中的连接字符串以拥有它并重新部署,一切正常。
以下代码在本地调试时工作正常。每当我将它推送到我的开发服务器时,它就不再工作了。我找到了导致问题的代码,我可以通过添加下面有注释的行来修复,但我不确定为什么我必须添加该行。在 Web.Config 中,我有 MultipleActiveResultSets=true;
应该不会发生这种情况。所以,我不确定为什么我必须添加这一行。
public bool PersistStuff(string Account, List<Acknowledgement> acks)
{
string sql = "my.sp.AccountProcedure";
bool retVal = true;
using (SqlConnection conn = new SqlConnection(_accountConnection))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@Account", System.Data.SqlDbType.VarChar, 50)).Value = Account;
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
int id = int.Parse(reader[0].ToString());
//*************************
// This is the line I added
reader.Close();
//*************************
sql = "my.sp.AccountAcknowledgementProcedure";
using (SqlCommand cmd2 = new SqlCommand(sql, conn))
{
cmd2.CommandType = System.Data.CommandType.StoredProcedure;
foreach (Acknowledgement item in acks)
{
cmd2.Parameters.Clear();
cmd2.Parameters.Add(new SqlParameter("@severity", System.Data.SqlDbType.VarChar, 25)).Value = item.Severity.ToString();
if (!string.IsNullOrEmpty(item.ErrorData))
cmd2.Parameters.Add(new SqlParameter("@errorData", System.Data.SqlDbType.VarChar, 500)).Value = item.ErrorData;
else
cmd2.Parameters.Add(new SqlParameter("@errorData", System.Data.SqlDbType.VarChar, 500)).Value = DBNull.Value;
cmd2.ExecuteNonQuery();
}
}
}
else
{
retVal = false;
}
}
}
}
return retVal;
}
在我写问题的时候,我忘记了我的 Web.Debug.Config 和 Web.Release.Config 中有 xdt:Transform
。查看我的调试和发布配置后,在使用的连接字符串中都没有 MultipleActiveResultSets=true;
。我更改了每个配置中的连接字符串以拥有它并重新部署,一切正常。