首页 > 解决方案 > 如何在 VB.NET 中使用 command.ExecuteScalar 从 SQL 查询中获取单行/记录

问题描述

我试图通过使用主键执行 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

我期望从中获得列中的值,first_namereader('first_name')我遇到了一个NullReferenceException例外

标签: vb.netsqliteado.netexecutescalar

解决方案


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

推荐阅读