VB.net обновить команду SQL - PullRequest
0 голосов
/ 05 мая 2018

По какой-то причине я не могу обновить свою запись. Здесь идет:

У меня есть форма Windows, которая при загрузке отображает текущее состояние самолета. Если этот статус изменяется, я могу выбрать значение из выпадающего списка (cboServ). Когда я нажимаю кнопку «Выход» из этой формы, статус должен обновиться, поэтому после загрузки формы снова появляется новое значение. Однако это не так.

Это то, что я сейчас использую как код:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim updateQuery As String = "UPDATE dbo.aircraft SET dbo.aircraft.condition = @OE_status WHERE aircraft.avNum = 'ab201'"

    Dim updateCmd As New SqlCommand(updateQuery, con)
    updateCmd.Parameters.Add("@OE_status", cboServ.SelectedValue)
    MessageBox.Show("it worked")
    con.Close()
    Me.Close()
    Form1.Show()
End Sub

Ошибка, которую я получаю, - которую я не до конца понимаю:

System.InvalidCastException: 'Преобразование из типа' DataRowView 'в тип' String 'недопустимо.'

Это происходит из строки, читающей cboServ.SelectedValue.

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Существует несколько проблем с кодом, как показано.

Во-первых, вы должны использовать Option Strict On, чтобы убедиться, что типы всех используемых переменных соответствуют друг другу.

Вы можете легче изолировать проблему, разделив действия, выполняемые в обработчике нажатия кнопки, на другие методы. Например, мы можем поместить взаимодействие с базой данных в собственный метод:

Sub UpdateAircraftCondition(avNum As String, condition As String)
    Dim connStr = "YOUR CONNECTION STRING HERE"
    Dim updateQuery As String = "UPDATE dbo.aircraft SET dbo.aircraft.condition = @OE_status WHERE aircraft.avNum = @AvNum"

    Using conn As New SqlConnection(connStr)
        Using cmd As New SqlCommand(updateQuery, conn)
            cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@AvNum", .SqlDbType = SqlDbType.NVarChar, .Size = 16, .Value = avNum})
            cmd.Parameters.Add(New SqlParameter With {.ParameterName = "@OE_Status", .SqlDbType = SqlDbType.NVarChar, .Size = 16, .Value = condition})
            conn.Open()
            cmd.ExecuteNonQuery()
            conn.Close()

        End Using
    End Using

End Sub

(Вам нужно, чтобы размер (для строковых данных) и SqlDbType соответствовали столбцам в базе данных.)

Обратите внимание, что соединение существует только там, где оно необходимо - конструкция Using заботится об удалении неуправляемых ресурсов (таких как SqlConnection), чтобы поддерживать память в чистоте и не просачиваться.

Вместо того, чтобы вставлять фактическую строку соединения везде, что создает большие трудности с ее изменением, обычно помещать ее в некоторые файлы настроек, например, используя My.Settings.

Согласно сообщению об ошибке, cboServ.SelectedValue - это DataRowView, а не строка. Что заставляет меня задуматься, не является ли cboServ ComboBox. Но мы можем получить полезное сообщение об ошибке, попробовав следующий код для обработчика события нажатия кнопки:

Private Sub bnUpdateCondition_Click(sender As Object, e As EventArgs) Handles bnUpdateCondition.Click

    If cboServ.SelectedIndex >= 0 Then
        Dim aircraftCondition = cboServ.SelectedItem.ToString()
        Dim avNum = "ab201"
        UpdateAircraftCondition(avNum, aircraftCondition)

        ' more code may go here

    End If

End Sub

Обратите внимание, что я попытался дать кнопке осмысленное имя: в будущем вам будет намного легче, чем пытаться выяснить, для чего "Button337".

0 голосов
/ 05 мая 2018

Изменить строку:

updateCmd.Parameters.Add("@OE_status", cboServ.SelectedValue)

до:

updateCmd.Parameters.AddWithValue("@OE_status", cboServ.SelectedValue.ToString())

или вы можете использовать явное приведение:

var dataRowView = cboServ.SelectedValue as DataRowView;
var row = dataRowView.row As MyDataTableDefinition;
updateCmd.Parameters.AddWithValue("@OE_status", row[“OE_status”].ToString())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...