Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SqlDataReader-缓存结果集?_C#_Sql Server_Sqldatareader - Fatal编程技术网

C# SqlDataReader-缓存结果集?

C# SqlDataReader-缓存结果集?,c#,sql-server,sqldatareader,C#,Sql Server,Sqldatareader,使用SqlDataReader时,返回集是完全由ExecuteReader步骤决定的,还是在读取时通过写入源表来影响得到的结果?下面是一个非常粗略的伪代码示例 sc = new SqlCommand("select * from people order by last, first",db) ; sdr = sc.ExecuteReader() ; while (sdr.read()) { l = (string) sdr["last"] ; k = (string) sdr

使用SqlDataReader时,返回集是完全由ExecuteReader步骤决定的,还是在读取时通过写入源表来影响得到的结果?下面是一个非常粗略的伪代码示例

sc = new SqlCommand("select * from people order by last, first",db) ;
sdr = sc.ExecuteReader() ;

while (sdr.read())
{
    l = (string) sdr["last"] ;
    k = (string) sdr["key"] ;
    if (l.Equals("Adams")) 
    {
       sc2 = new SqlCommand("update people set last = @nm where key = @key") ;
       sc2.Parameters.Add(new SqlParameter("@nm", "Ziegler"));
       sc2.Parameters.Add(new SqlParameter("@key", k));
       sc2.ExecuteNonQuery() ;
    }
}

我在其他环境中看到了很多由于写入正在读取的表而导致的错误。这里记录k从列表的顶部(亚当斯)跳到底部(齐格勒)。我假设(哈!)SqlDataReader是免疫的。是吗?False?

这取决于您的锁定提示或其他锁定提示,但默认情况下,iirc从sql server中的表中读取会锁定这些记录,因此您发布的代码要么会死锁(sc2最终将超时),要么更新会进入事务日志,在读取器完成之前不会写入任何内容。我不记得我脑子里想的是哪个。

我看到的一个问题是,当读卡器打开时,它拥有数据库连接,当读卡器打开时,其他任何东西都不能使用它。因此,唯一可行的方法是使用不同的数据库连接,这仍然取决于事务级别。如果您想假设读取的数据不会因这些更新而改变,是否可以将数据读取到临时对象容器中,然后在所有读取完成后再进行更新?这将使这个问题变得毫无意义


当然,从“这到底是如何工作的”的角度来看,我确实觉得这个问题很有趣。

如果您想在迭代查询结果时进行更新,您可以将其全部读取到数据集中


我知道你没有问过这件事,我也知道这是伪代码,但一定要用()语句包装你的sc、sdr和sc2变量,以确保它们被正确处理。

我确实使用了单独的数据库连接。我的实际实现工作得很好。它确实更新了记录,因此表没有被锁定,但我没有更改会影响排序顺序的字段。听起来像是第二个:更新保存在事务日志中的位置。或者你正在某处设置一个较弱的隔离级别。