如果基础数据发生变化,数据读取器会改变吗?

时间:2014-11-11 20:19:30

标签: sql-server vb.net

请参阅以下代码:

Public Class Form1
    Private _ConString As String
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim objDR As SqlDataReader
        Dim objCommand As SqlCommand
        Dim objCon As SqlConnection
        Dim id As Integer
        Try
            _ConString = ConfigurationManager.ConnectionStrings("TestConnection").ToString
            objCon = New SqlConnection(_ConString)
            objCommand = New SqlCommand("SELECT * FROM Person")
            objCommand.Connection = objCon
            objCon.Open()
            objDR = objCommand.ExecuteReader(ConnectionState.Closed)
            Do While objDR.Read
                ProcessPerson(objDR("URN"))
            Loop
            objDR.Close() 'line 16
        Catch ex As Exception
            throw
        Finally

        End Try

    End Sub
End Class

假设Person表中有一百万条记录,运行需要24小时。假设我删除了Person表或显着更新了表中的数据。它会继续处理一百万条记录吗?请假设ProcessPerson不使用Person表。

我花了一些时间谷歌搜索,但我没有找到答案。

1 个答案:

答案 0 :(得分:0)

找出在某种情况下是否会发生某事的最佳方法就是测试它。这打败了所有文档,因为偶尔文档(无论是“官方”MSDN和/或TechNet页面,博客文章等)是不正确的。您已经编写了应用程序代码,因此在[Person]表中输入1-2百万行是一件相当简单的事情。如果PK字段之外的所有字段都与您测试简单效果的字段相同,那么应该没问题。或者,也许确保至少有一个字段具有唯一值,以便更容易查看是否缺少某些内容。然后只需运行您在此处发布的代码并删除一些目标行,看看它们是否存在于您的集合中。

完成该测试后,请查看启用Snapshot Isolation,因为它旨在帮助解决此问题。如果这个过程可能需要24小时,那么你可能不应该将它包装在一个交易中(好吧,如果你想保住你的工作;-))。

另一种选择是创建执行以下操作的存储过程:

  1. 创建临时表
  2. INSERT到临时表SELECT查询
  3. SELECT * FROM temp table
  4. 只要应用程序读取它,它就会分离并保留您的结果集。但它也会复制[tempdb]中的完整结果集,而快照隔离:

    • 只使用它所需的空间,如果行没有那么多变化,那么空间将比完整结果集少得多,

    • 在初始查询运行时阻止阻塞,这在填充临时表时可能仍会发生