如何更正代码,以使异常不会再次出现?
SqlConnection
sqlCnn = new SqlConnection("Connection String");
SqlCommand
sqlCmdSelect = new SqlCommand("SQL SELECT statement;", sqlCnn),
sqlCmdUpdate = new SqlCommand("SQL UPDATE statement;", sqlCnn);
Thread
t1 = new Thread(()=>{
SqlDataReader sdr;
while(true)
{
sdr = sqlCmdSelect.ExecuteReader();
// Do some works
sdr.Close();
}
}),
t2 = new Thread(()=>{
SqlDataAdapter sda;
while(true)
{
using(sda = new SqlDataAdapter())
{
// Do some works
sda.UpdateCommand = sqlCmdUpdate;
if(!sdr.IsClosed) sdr.Close();
sda.UpdateCommand.ExecuteNonQuery();
}
}
});
t1.Start();
t2.Start();
System.InvalidOperationException:“已经有与此命令关联的打开的DataReader,必须首先关闭它。”
答案 0 :(得分:0)
正如例外所述,您不能在同一连接上执行两项操作。
我只创建两个SqlConnection
类的对象,然后在线程中分别使用它们。
或者,您可以在执行SQL语句(lock
,Semaphore
)上使用一些同步,但这与您想要执行的操作完全相反。
答案 1 :(得分:0)
实际上,您可以使用MARS对单个连接进行多项操作:
多个活动结果集(MARS)是可与SQL一起使用的功能 服务器允许一次执行多个批处理 连接。启用MARS与SQL Server一起使用时,每个命令 使用的对象将会话添加到连接中。
要启用它,只需添加MultipleActiveResultSets=True
即可修改您的连接字符串,如下所示:
Data Source=MSSQL1;Initial Catalog=AdventureWorks;Integrated Security=SSPI;MultipleActiveResultSets=True
不需要其他代码更改,但请记住,它是配置更改,因此,如果您有一些环境设置(例如测试),则还需要将该更改传播到那些环境。