Как получить одну строку / запись из запроса SQL с помощью command.ExecuteScalar в VB.NET - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь получить одну строку, выполнив инструкцию 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_name от reader('first_name'), но я получаю NullReferenceException исключение

1 Ответ

1 голос
/ 12 апреля 2019

ExecuteScalar возвращает одну строку с одним столбцом, но не возвращает DataReader, из которого вы получаете данные.Вместо этого он возвращает непосредственно это единственное значение как объект.Этот объект может быть Nothing, если запрос не найдет ни одной строки, соответствующей оператору Where

Если вы хотите получить только первое имя, вам следует изменить текст запроса на

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
...