【问题标题】:Visual Basic 9.0 does not support this kind of lambda expressionVisual Basic 9.0 不支持这种 lambda 表达式
【发布时间】:2012-11-23 11:18:17
【问题描述】:

我收到此错误 “Visual Basic 9.0 不支持这种 lambda 表达式” 这里“ ExecuteWithinTransaction(Sub(con, trans) InsertA("Al", con, trans))" 当我将鼠标悬停在 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

【问题讨论】:

  • 为什么在 VS 2010 中使用 .NET 3.5?
  • @TimSchmelter 有不同的开发人员在同一个项目上工作,每个人都没有 VS 2010。

标签: vb.net lambda


【解决方案1】:

VB.NET 2012+ 支持语句 lambda (Subs)。

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

请参阅下面 Ric 的 cmets 以获得答案。

如果无法更改固件版本的解决方法:以普通的非 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)

【讨论】:

  • 能否请您根据上面的代码给出一个代码示例。我不知道如何编写助手子和传递委托。
  • 实际上 2010 确实支持这两种类型的 lambda 表达式:msdn.microsoft.com/en-us/library/bb531253(v=vs.100).aspx
  • @Ric 看起来我把 2010 年的功能误认为 2008 年的功能了。
  • @Ric 不,这不是原因。
  • @Monodeep 通过添加更多参数。您已经有contran,添加更多。
猜你喜欢
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 1970-01-01
  • 2011-06-23
  • 2021-10-30
  • 2010-10-03
相关资源
最近更新 更多