c# - 必须关闭 asp.net datareader

标签 c# asp.net datareader

我的代码:

SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString);
SqlCommand cmd = new SqlCommand();
//..........
cmd.CommandText = "SELECT * FROM TempQn WHERE creatorId=  '" +
Session["administratorID"].ToString() + "'";  
dr = cmd.ExecuteReader();  
while (dr.Read())
{
    int ids = Int32.Parse(dr["QuestionID"].ToString());
    cmd.CommandText = " INSERT INTO Answers (QuestionId,Answer) Select c.QnId, c.Answer From TempAns c Where c.Id = " + ids + " ";
    cmd.ExecuteNonQuery(); //this line
}
dr.Close();

错误是:

There is already an open DataReader associated with this Command which must be closed first.

什么样的命令应该替换 cmd.ExecuteNonQuery();

最佳答案

只要 DataReader 处于“事件状态”,您就不能执行任何进一步的 SQL 语句。

为了克服这个问题,存储 SQL 语句的列表,然后在阅读后执行它们:

cmd.CommandText = "SELECT * FROM Question WHERE SurveyID= '" + sID + "'";    
dr = cmd.ExecuteReader();  
List<string> arrSQL = new List<string>();
while (dr.Read())
{
    int ids = Int32.Parse(dr["QuestionID"].ToString());
    arrSQL.Add("INSERT INTO Answers (QuestionId,Answer) Select c.QnId, c.Answer From TempAns c Where c.Id = " + ids + " ");
}
dr.Close();

arrSQL.ForEach(strSQL =>
{
    cmd.CommandText = strSQL;
    cmd.ExecuteNonQuery();
});

您当前的代码很容易受到 SQL 注入(inject)攻击,这不是好的做法 - 您最好使用参数而不是向原始 SQL 注入(inject)值 - 以下是如何实现这一点:

cmd.CommandText = "SELECT * FROM Question WHERE SurveyID=@id";
cmd.Parameters.AddWithValue("@id", sID);
dr = cmd.ExecuteReader();  
List<int> arrQuestions = new List<int>();
while (dr.Read())
{
    int ids = Int32.Parse(dr["QuestionID"].ToString());
    arrQuestions.Add(ids);
}
dr.Close();

cmd.CommandText =  "INSERT INTO Answers (QuestionId, Answer) Select c.QnId, c.Answer From TempAns c Where c.Id = @id";
arrQuestions.ForEach(id =>
{
    cmd.Parameters["@id"].Value = id;
    cmd.ExecuteNonQuery();
});

关于c# - 必须关闭 asp.net datareader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8501965/

相关文章:

c# - Windows 应用商店应用程序 (.NET) 上的 SSDP (UDP)

C# JsonSerializer.Serialize 返回一个空对象

c# - 数据读取器中的 while 和 IF

c# - 如何修复过时的 ILoggerFactory 方法?

c# - MVC 4 - 包含两个模型的详细信息页面

c# - 从 ASP.NET 网站下载动态生成的图像

asp.net - Windows Azure 访问控制和 WPF?

c# - 从 web.config 重定向到根登录页面

c# - 无法使用 IDataReader 读取临时表

c# - C# 中的 MySQL 转换