【发布时间】:2018-10-29 20:21:53
【问题描述】:
我得到这个错误:
已经有一个打开的 DataReader 与此命令关联,必须先关闭
这是我的代码:
String sql_get_completed_tasks = "select * from tasks where Ending_date is not null order by Ending_date asc";
SqlCommand command_get_completed_tasks_ = new SqlCommand(sql_get_completed_tasks, cn);
SqlDataReader reader = command_get_completed_tasks_.ExecuteReader();
while (reader.Read())
{
String sql_insert_completed_tasks_toTheNewTable = "insert into history_of_tasks_achievements values ("+
reader[1] +" , N'"+ reader[2]+"' , @image , N'"+ reader[4] +"' , N'"+reader[5]+"' , N'"+ reader[6]+"' , "+
reader[7] +" , N'"+reader[8]+"' , N'"+reader[9] +"' , "+reader[10]+" , @start_date , @end_date , "+reader[13]+
")";
SqlCommand com_insert_completed_tasks_toTheNewTable = new SqlCommand(sql_insert_completed_tasks_toTheNewTable, cn);
com_insert_completed_tasks_toTheNewTable.Parameters.Add(new SqlParameter("@image", reader[3]));
com_insert_completed_tasks_toTheNewTable.Parameters.Add(new SqlParameter("@start_date", reader[11]));
com_insert_completed_tasks_toTheNewTable.Parameters.Add(new SqlParameter("@end_date", reader[12]));
com_insert_completed_tasks_toTheNewTable.ExecuteNonQuery();
} // end of while loop
reader.Close();
MessageBox.Show("Done");
要跳过此错误,我可以为SqlDataReader 创建暂停或关闭,然后从中断值重新打开吗?最好的解决方案是什么?
【问题讨论】:
-
您知道您可以在同一个连接上使用 MARS 进行多个查询吗? docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/… - 实际上它打开了多个连接,所以要注意这一点。您还可以读取所有数据,然后执行插入语句。
-
首先我必须激活 MARS 指令,然后执行插入指令,然后是非活动 MARS?
-
我要让你大吃一惊。 Verbatim strings.
-
@Na'ilLaith 请不要连接值来创建 SQL。这是一个巨大的安全漏洞,而且它会导致多个值的错误。你应该使用 parameters.
-
@Shadetheartist 我对逐字字符串发表了评论-但我是个白痴-我误读了您建议使用
$"..."字符串-我的错,对不起;@"..."字符串很好!
标签: c# sql-server sqldatareader