Вопрос:

Свойство подключения ExecuteScalar не было инициализировано

sql-server vb.net

418 просмотра

1 ответ

13 Репутация автора

Когда я запускаю этот кусок кода, я получаю сообщение об ошибке:

Свойство подключения ExecuteScalar не было инициализировано

Я не могу понять, почему не работает соединение.

Код:

Protected Sub btnTrackRepair_Click(sender As Object, e As EventArgs) Handles btnTrackRepair.Click

    Using conn As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\ITrepair.mdf;Integrated Security=True")
        conn.Open()
        Dim cmd As New SqlCommand(conn.ToString)
        Dim txtTracking As String
        cmd.CommandText = "SELECT Repair_Status FROM Repair WHERE Tracking_Number =" & txtTrack.Text
        txtTracking = If(IsDBNull(cmd.ExecuteScalar), "", cmd.ExecuteScalar)
        If txtTracking <> "" Then
            MsgBox("Record Found!", MsgBoxStyle.Information, "Update")
            txtStatus.Text = ""
            txtStatus.Text = txtTracking
        Else
            MsgBox("No Record Found!", MsgBoxStyle.Information, "INFO.")
        End If
    End Using

End Sub

Код ломается в txtTracking = If(IsDBNull(cmd.ExecuteScalar), "", cmd.ExecuteScalar)

Я посмотрел на другие вопросы, касающиеся этой ошибки, однако большинство из них C #, и я использую VB.NET, поэтому мне было трудно найти решение.

Автор: CormacD Источник Размещён: 12.04.2017 12:15

Ответы (1)


1 плюс

376403 Репутация автора

Вы используете SqlCommandконструктор, который принимает только строку. Но это не строка подключения, а текст запроса. Итак, вы сделали это неправильно.

Dim cmd As New SqlCommand("SELECT Repair_Status FROM Repair WHERE Tracking_Number = @Tracking_Number", conn)

Кроме того, вы должны действительно ознакомиться с параметризованными запросами. Не используйте конкатенацию строк для построения ваших запросов, чтобы избежать (среди прочих проблем) атак SQL-инъекций.

Вот полный метод:

Protected Sub btnTrackRepair_Click(sender As Object, e As EventArgs)
    Dim sqlQuery = "SELECT Repair_Status FROM Repair WHERE Tracking_Number = @Tracking_Number"

    Using conn As New SqlConnection("Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\ITrepair.mdf;Integrated Security=True")
        conn.Open()
        Dim cmd As New SqlCommand(sqlQuery, conn)
        cmd.Parameters.Add("@Tracking_Number", SqlDbType.NVarChar).Value = txtTrack.Text

        Dim statusObj = cmd.ExecuteScalar()
        Dim status = If(statusObj is DBNull.Value, Nothing, DirectCast(statusObj, string))

        If not String.IsNullOrEmpty(status) Then
            MsgBox("Record Found!", MsgBoxStyle.Information, "Update")
            ' ... '
        Else
            MsgBox("No Record Found!", MsgBoxStyle.Information, "INFO.")
        End If
    End Using
End Sub

Если Tracking_Numberэто не varchar / nvarchar, а int(например) в базе данных, вы должны проанализировать его уже здесь и использовать правильный SqlDbType.

Автор: Tim Schmelter Размещён: 12.04.2017 12:18
Вопросы из категории :
32x32