【问题标题】:How to get single row/record from a SQL query using command.ExecuteScalar in VB.NET如何在 VB.NET 中使用 command.ExecuteScalar 从 SQL 查询中获取单行/记录
【发布时间】:2019-04-12 09:55:53
【问题描述】:

我正在尝试通过使用主键执行 SELECT 语句来获取单行

我尝试将command.ExecuteScalar() 的输出分配给Object 变量,然后尝试通过键访问值,例如obj('column_name')

Using conn As New SQLiteConnection(connectionString:=connection.get_connection_string())
                    conn.Open()
    Dim sql_string As String = "SELECT * FROM employees WHERE id = @id"
    Using cmd As New SQLiteCommand(connection:=conn, commandText:=sql_string)
        cmd.Parameters.AddWithValue("@id", employee_id)
        Dim reader As Object = cmd.ExecuteScalar()
        If reader <> Nothing Then
            Me.user_details(2) = reader("first_name")
        End If
    End Using
End Using

我希望从 reader('first_name') 获得 first_name 列中的值,但我得到了 NullReferenceException 异常

【问题讨论】:

    标签: vb.net sqlite ado.net executescalar


    【解决方案1】:

    ExecuteScalar 返回单行和单列,但不返回从中获取数据的 DataReader。相反,它直接将单个值作为对象返回。如果查询未找到与 Where 语句匹配的任何行,则此对象可能为 Nothing

    如果您只想获取名字,则应将查询文本更改为

    Dim sql_string As String = "SELECT first_name FROM employees WHERE id = @id"
    Using cmd As New SQLiteCommand(connection:=conn, commandText:=sql_string)
        cmd.Parameters.AddWithValue("@id", employee_id)
        Dim result As Object = cmd.ExecuteScalar()
        If result <> Nothing Then
            Me.user_details(2) = result.ToString()
        End If
    End Using
    

    如果您想从该记录中检索所有字段(或多个字段),请使用 ExecuteReader,然后开始读取结果

    Dim sql_string As String = "SELECT first_name, last_name, city FROM employees WHERE id = @id"
    Using cmd As New SQLiteCommand(connection:=conn, commandText:=sql_string)
        cmd.Parameters.AddWithValue("@id", employee_id)
        Dim reader = cmd.ExecuteReader()
        ' Try to position the reader on the first record returned by the query
        ' if there isn't records the Read returns false. 
        ' You can also test this with reader.HasRows
        While reader.Read()
            Me.user_details(1) = reader("last_name").ToString()
            Me.user_details(2) = reader("first_name").ToString()
            Me.user_details(3) = reader("city").ToString()
        End While
    End Using
    

    【讨论】:

    • 我可以同时从多个列中获取值吗?
    • 是的,但是你使用 ExecuteReader 而不是 ExecuteScalar
    • 我收到Object reference not set to an instance of an object.
    • 那一行只是一个例子。但是,如果您确实有一个 last_name 字段并且该字段可能为空,那么您应该检查它是否包含一个值(在调用 ToString 之前使用 IsDBNull
    猜你喜欢
    • 2018-01-25
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多