如何同时运行SqlDataReader和SqlDataAdapter?

时间:2019-07-02 09:25:39

标签: c# sql-server multithreading

如何更正代码,以使异常不会再次出现?

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,必须首先关闭它。”

2 个答案:

答案 0 :(得分:0)

正如例外所述,您不能在同一连接上执行两项操作。

我只创建两个SqlConnection类的对象,然后在线程中分别使用它们。

或者,您可以在执行SQL语句(lockSemaphore)上使用一些同步,但这与您想要执行的操作完全相反。

答案 1 :(得分:0)

实际上,您可以使用MARS对单个连接进行多项操作:

  

多个活动结果集(MARS)是可与SQL一起使用的功能   服务器允许一次执行多个批处理   连接。启用MARS与SQL Server一起使用时,每个命令   使用的对象将会话添加到连接中。

要启用它,只需添加MultipleActiveResultSets=True即可修改您的连接字符串,如下所示:

Data Source=MSSQL1;Initial Catalog=AdventureWorks;Integrated Security=SSPI;MultipleActiveResultSets=True

不需要其他代码更改,但请记住,它是配置更改,因此,如果您有一些环境设置(例如测试),则还需要将该更改传播到那些环境。