【问题标题】:Select with condition from a datatable in VB.net从 VB.net 中的数据表中选择条件
【发布时间】:2013-09-28 11:43:24
【问题描述】:

我想根据同一行中另一个字段的值从VB中的数据表中选择某个字段。

在 SQL 中,可以通过编写以下查询轻松完成:

select error_message from table_errors where error_case="condition"

如果我在 VB 中将我的 SQL 表填充到数据表中,我该怎么做? 如何根据 item("error_Case") 字段在数据表中选择item("error_message")?

任何帮助将不胜感激

【问题讨论】:

    标签: sql vb.net datatable


    【解决方案1】:

    你可以使用Linq-To-DataSet:

    Dim matchingRows As IEnumerable(Of DataRow) = 
        From row In table
        Where row.Field(Of String)("error_case") = "condition"
    

    如果您只想要一列(当然也可以一步完成):

    Dim errorMessages As IEnumerable(Of String) = 
        From row In matchingRows 
        Select row.Field(Of String)("error_message")
    
    For Each error In errorMessages 
        Console.WriteLine(error)
    Next 
    

    如果您希望它只是一行,请使用FirstSingle(如果多行则抛出异常):

    Dim error As String = errorMessages.First()
    

    由于First 会在序列为空时引发异常,因此您可以使用FirstOrDefault

    Dim error As String = errorMessages.FirstOrDefault() ' is null/Nothing in case of an empty sequence 
    

    全部在一行(注意Linq和DataTable.Select都需要使用循环):

    Dim ErrMessage As String = errorTable.AsEnumerable().
        Where(Function(r) r.Field(Of String)("Error_Case") = TextCase.Text).
        Select(Function(r) r.Field(Of String)("Error_Message")).
        FirstOrDefault()
    

    【讨论】:

    • 我实际上是在尝试避免循环。我在我的代码中多次需要这个,我正在寻找最短的方法来做到这一点。试过这个urlpaste.com/PlKudP5a,但没用。
    • @HelpASisterOut:你认为DataTable.Select不需要循环吗?当然它也必须循环所有行,里面没有魔法。
    【解决方案2】:

    这里是粗略代码的工人版本

        Dim connString As String = "select error_message from table_errors where error_case='condition'"
        Dim conn As SqlClient.SqlConnection = New SqlClient.SqlConnection(connString)
        conn.Open()
        Dim cmd As SqlClient.SqlCommand = New SqlClient.SqlCommand(connString, conn)
        Dim dTable As DataTable = New DataTable()
        Dim dAdapter As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(cmd)
        dAdapter.Fill(dTable)
        conn.Close()
        Dim text As String
        Dim dReader As DataTableReader = dTable.CreateDataReader()
        While dReader.Read()
            text = dReader.GetValue(0)
        End While
        dReader.Close()
    

    【讨论】:

    • 我试图避免每次都将其链接到数据库。我想加载一次并能够根据不同的条件遍历行。试过这个urlpaste.com/PlKudP5a,但没用。
    • 为选择命令使用一个参数,如果这是您需要的,这将更容易更改过滤器值,或者从命令文本中一起排除条件并将值存储在DataTable 连同 error_case 字段,但您需要在阅读器中循环遍历它并在 error_case 列上设置条件。
    猜你喜欢
    • 2020-01-16
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    • 2014-03-08
    • 1970-01-01
    • 2014-11-26
    相关资源
    最近更新 更多