2

Subにカーソルを合わせると、「Visual Basic 9.0 はこの種のラムダ式をサポートしていません」というエラーが表示されます

私はラムダ式が初めてです。どんな助けでも感謝します。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

ステートメント ラムダ ( Subs) は VB.NET 2012+ でサポートされています。

VB.NET 2010 は関数ラムダ ( Functions) のみをサポートします。

答えについては、以下の Ric のコメントを参照してください。

FW バージョンを変更できない場合の回避策: 通常の非ラムダ形式で小さなヘルパー サブルーチンを記述し、デリゲートとして に渡します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 に答える