【问题标题】:VB.net update SQL commandVB.net更新SQL命令
【发布时间】:2018-05-05 16:18:16
【问题描述】:

由于某种原因,我无法更新我的记录。如下:

我有一个 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这一行。

【问题讨论】:

  • 哪一行产生错误?我想知道您是否希望 cboServ.SelectedValue 解析为字符串,而它却给您一个 DataRowView
  • @halfer 我的道歉,这是包含 [code]cboServ.SelectedValue[/code] 的行
  • 好的,所以使用您的自动完成功能从该对象中获取一个值。也许是cboServ.SelectedValue.Something,其中Something 是您必须使用自动完成来解决的问题。
  • (如您所见,BBCode 在这里不起作用。在 cmets 中使用反引号来渲染小段代码)。
  • 您指定的行上的错误 (updateCmd.Parameters.ADD.....) 看起来确实很奇怪。但是,忽略您在此处显示的代码设置了更新行的命令,但从未实际执行它。如果这里显示的代码曾经对数据库做过任何事情,我会感到非常惊讶。

标签: sql vb.net sql-update


【解决方案1】:

显示的代码不止一个问题。

首先,您应该使用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

(您需要使 Size(对于字符串数据)和 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”的用途。

【讨论】:

  • 非常感谢您提供以上内容,让我的代码更加整洁!!不幸的是,我现在遇到了另一个错误(我以前没有遇到过)The UPDATE statement conflicted with the FOREIGN KEY constraint "condition1". The conflict occurred in database "status", table "dbo.status", column 'condition'. 我认为这可能与我将 FK 更改为的 On Update Cascade 有关,但这似乎没有任何效果。
  • @gherkin12 至少它是进步 :) 这是一个不同的问题,但也许Sql error on update : The UPDATE statement conflicted with the FOREIGN KEY constraint 中的答案或 cmets 之一会有所帮助。
  • @gherkin12 - 该错误是数据库问题,而不是 vb
【解决方案2】:

换行:

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())

【讨论】:

猜你喜欢
  • 2014-08-17
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
相关资源
最近更新 更多