2

我将鼠标悬停在Sub

我是 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
4

1 回答 1

2

SubVB.NET 2012+ 支持语句 lambda ( s)。

VB.NET 2010 仅支持函数 lambdas ( Functions)。

请参阅下面 Ric 的评论以获取答案。

如果无法更改固件版本的解决方法:以普通的非 lambda 形式编写小助手 subs,然后将它们作为委托传递给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)
于 2012-11-23T11:20:35.477 回答