Существует несколько проблем с кодом, как показано.
Во-первых, вы должны использовать 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".