2012-11-23 28 views
2

我得到這個錯誤「的Visual Basic 9.0不支持這種lambda表達式的」這裏 「ExecuteWithinTransaction((CON,反式)INSERTA(」 基地」 ,con,trans))「當我將鼠標懸停在時Sub的Visual Basic 9.0不支持這種lambda表達式的

我是lambda表達式的新手。任何幫助讚賞。我正在使用VS 2010和.NET 3.5。

Sub Main() 
    ExecuteWithinTransaction(Sub(con, trans) InsertA("Al", con, trans)) 
    ExecuteWithinTransaction(Sub(con, trans) InsertB("Bert", con, trans)) 

    ExecuteWithinTransaction(Sub(con, trans) 
           InsertA("Albert", con, trans) 
           InsertB("Einstein", con, trans) 
          End Sub) 
End Sub 

''' <summary> 
''' Executes an action within a transaction. handles connection and transaction management 
''' </summary> 
''' <param name="action">The action to be executed</param> 
Sub ExecuteWithinTransaction(ByVal action As Action(Of SqlConnection, SqlTransaction)) 
    Dim connection As SqlConnection = New SqlConnection("CONNECTIONSTRING") 

    connection.Open() 
    Try 
     Dim transaction = connection.BeginTransaction() 

     Try 
      action(connection, transaction) 
      transaction.Commit() 
     Catch ex As Exception 
      transaction.Rollback() 
      Throw 'rethrow exception preserving original stacktrace 
     End Try 
    Finally 
     connection.Close() 
    End Try 
End Sub 

Sub InsertA(ByVal name As String, ByVal connection As SqlConnection, ByVal transaction As SqlTransaction) 
    Dim cmd As SqlCommand = New SqlCommand("INSERT INTO XXX (Name) VALUES (@NAME)", connection, transaction) 

    cmd.Parameters.AddWithValue("@Name", name) 

    cmd.ExecuteNonQuery() 
End Sub 

Sub InsertB(ByVal name As String, ByVal connection As SqlConnection, ByVal transaction As SqlTransaction) 
    Dim cmd As SqlCommand = New SqlCommand("INSERT INTO YYY (Name) VALUES (@NAME)", connection, transaction) 

    cmd.Parameters.AddWithValue("@Name", name) 

    cmd.ExecuteNonQuery() 
End Sub 
+1

爲什麼使用.NET 3.5 VS 2010中? –

+0

@TimSchmelter有不同的開發人員在同一個項目上工作,每個人都沒有VS 2010. – Monodeep

回答

2

聲明的lambda(Sub多個)VB.NET 2012+都支持。

VB.NET 2010只支持函數lambdas(Function s)。

查看Ric的回答下面的評論。

解決方法如果更改固件版本是不可能的:在普通的非lambda表格中寫入小助手,然後將它們作爲代理傳遞給ExecuteWithinTransaction

所以,你將不得不

private sub Lambda1 (con as SqlConnection, tran as SqlTransaction) 
    InsertA("Al", con, tran) 
end sub 

private sub Lambda2 (con as SqlConnection, tran as SqlTransaction) 
    InsertB("Bert", con, tran) 
end sub 

private sub Lambda3 (con as SqlConnection, tran as SqlTransaction) 
    InsertA("Albert", con, tran) 
    InsertB("Einstein", con, tran) 
end sub 

然後

ExecuteWithinTransaction (AddressOf Lambda1) 
ExecuteWithinTransaction (AddressOf Lambda2) 
ExecuteWithinTransaction (AddressOf Lambda3) 
+0

您可以根據上面的代碼給出一個代碼示例..我不知道如何編寫helper子代碼並傳遞代理。 – Monodeep

+2

實際上2010不支持這兩種lambda表達式:http://msdn.microsoft.com/en-us/library/bb531253(v=vs.100).aspx – Ric

+0

@Ric爲什麼它不適用於我? – Monodeep