2013-07-28 76 views
0

是否有可能做這樣的事情:的TransactionScope混亂

Imports System.Data.SqlClient 
Imports System.Configuration 
Imports System.Transactions 

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, objCommand2 As SqlCommand 
     Dim objCon As SqlConnection 
     Dim objCon2 As SqlConnection 
     Dim id As Integer 
     Try 
      _ConString = "Data Source=IANSCOMPUTER;Initial Catalog=AdventureWorks2008R2;Integrated Security=True;MultipleActiveResultSets=true" 
       objCon = New SqlConnection(_ConString) 
       objCommand = New SqlCommand("SELECT * FROM PERSON.PERSON WHERE BusinessEntityID<=10") 
       objCommand2 = New SqlCommand() 
       objCommand.Connection = objCon 
       objCommand2.Connection = objCon 
       objCon.Open() 
       objDR = objCommand.ExecuteReader(ConnectionState.Closed) 
      Do While objDR.Read 
       Using scope As New TransactionScope 
        objCon2 = New SqlConnection(_ConString) 
        objCon2.Open() 
        Using objCon2 
         objCommand2.CommandText = "UPDATE Person.Person SET middlename = @middlename WHERE " & _ 
          " Person.BusinessEntityID = @ID " 
         objCommand2.Parameters.AddWithValue("@middlename", objDR("BusinessEntityID") + 1) 
         objCommand2.Parameters.AddWithValue("@ID", objDR("BusinessEntityID")) 
         objCommand2.ExecuteNonQuery() 
         objCommand2.Parameters.Clear() 
        End Using 
       End Using 
      Loop 
      objDR.Close() 'line 16 
     Catch ex As Exception 
      Throw 
     Finally 

     End Try 

    End Sub 
End Class 

在上面的代碼,爲每個循環創建事務。我想這樣做的原因是因爲表被鎖定,直到while循環結束。上述代碼的問題是忽略了事務的創建。

+1

你不提交事務,使用(''scope.Complete()'](http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.complete.aspx)(就在TransactionScope的'End Using'之前) 。 – Styxxy

回答

0

1您不需要使用2個不同的SqlCommands變量。 第二嘗試使用範圍while循環之前,改變「objDR = objCommand.ExecuteReader(ConnectionState.Closed)」這個「objDR = objCommand.ExecuteReader()」 3試

+0

如果我把範圍放在開頭(在while循環之外),那麼它就起作用了。關鍵是我想在while循環中挖掘範圍。 – w0051977