错误'已经有一个与此命令关联的打开的datareader,必须先关闭'

Pra*_*eep 24 c# ado.net

运行时错误'已经有一个与此命令关联的打开的datareader,必须先关闭'

objCommand = new SqlCommand("SELECT field1, field2 FROM sourcetable", objConn);

objDataReader = objCommand.ExecuteReader();

while (objDataReader.Read())
{
objInsertCommand = new SqlCommand("INSERT INTO tablename (field1, field2) VALUES (3, '" + objDataReader[0] + "')", objConn);
objInsertCommand.ExecuteNonQuery();//Here is the error
}
objDataReader.Close();
Run Code Online (Sandbox Code Playgroud)

我不能在这里定义任何存储过程.任何帮助我们都会感激.

小智 80

不需要做所有这些,只需打开MARS,您的问题就会得到解决.在您的连接字符串中添加MultipleActiveResultSets=True;

  • 使用 SQL 2008 验证了这一点。http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataproviders/thread/78d3989a-8975-4930-998d-1eb907966f57 (2认同)
  • 对我有用。SQL Server 2008。 (2认同)

Joe*_*nos 7

当它仍然在读取数据读取器的内容时​​,您无法对该连接执行操作 - 该错误非常具有描述性.

您的替代方案是:

1)首先使用DataSet检索所有数据,或者使用阅读器填充其他一些集合,然后在初始选择完成后立即运行所有数据.

2)为insert语句使用不同的连接.


Bra*_*rad 6

如何通过Fill将数据拉入DataSet,然后遍历它以通过NonQuery执行插入?

IDbDataAdapter da;
IDbCommand selectCommand = connection.CreateCommand();
selectCommand.CommandType = CommandType.Text;
selectCommand.CommandText = "SELECT field1, field2 FROM sourcetable";
connection.Open();
DataSet selectResults= new DataSet();
da.Fill(selectResults); // get dataset
selectCommand.Dispose();
IDbCommand insertCommand;

foreach(DataRow row in selectResults.Tables[0].Rows)
{
    insertCommand = connection.CreateCommand();
    insertCommand.CommandType = CommandType.Text;
    insertCommand.CommandText = "INSERT INTO tablename (field1, field2) VALUES (3, '" + row["columnName"].ToString() + "'";   
}
insertCommand.Dispose();
connection.Close();
Run Code Online (Sandbox Code Playgroud)