C# SqlDataReader-缓存结果集?
使用SqlDataReader时,返回集是完全由ExecuteReader步骤决定的,还是在读取时通过写入源表来影响得到的结果?下面是一个非常粗略的伪代码示例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
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变量,以确保它们被正确处理。我确实使用了单独的数据库连接。我的实际实现工作得很好。它确实更新了记录,因此表没有被锁定,但我没有更改会影响排序顺序的字段。听起来像是第二个:更新保存在事务日志中的位置。或者你正在某处设置一个较弱的隔离级别。