出于某种原因,我无法更新我的记录。这是:
我有一个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
的行。
答案 0 :(得分:0)
如图所示,代码存在多个问题。
首先,您应该使用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,而不是String。这让我想知道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"是为了。
答案 1 :(得分:-1)
更改行:
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())