【问题标题】:I can't delete a row from MS access database from VB.net我无法从 VB.net 的 MS 访问数据库中删除一行
【发布时间】:2020-12-06 13:27:36
【问题描述】:

我正在尝试按照YT tutorial 从 MS 数据库中删除一行,但我遇到了 2 种错误。当我尝试这个时:

    Dim provider As String
    Dim dataFile As String
    Dim connString As String
    Dim myConnection As OleDbConnection = New OleDbConnection

    provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
        dataFile = "C:\Users\user\Desktop\PU\SEMESTER 4\Visual Programming\Hospital Databases\Patient DB.accdb"
    connString = provider & dataFile
    myConnection.ConnectionString = connString
    myConnection.Open()
    Dim str As String
    str = "Delete * from [Patient] Where [PatientID] = " & PatientID.ToString & ""
    Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)

我收到此错误:“查询表达式中的格式错误的 GUID '[PatientID]=DataGridViewTextBoxColumn { Name=PatientID, index=0 }'

所以我使用了here 中的括号,所以现在是这样的:

str = "Delete * from [Patient] Where [PatientID] = [" & PatientID.ToString & "]"

但这给出了一个错误:“没有为一个或多个必需参数提供值”。当我用单引号替换括号时,我也会收到此错误。

我尝试了thisthisthis,但仍然出现错误。

想知道该怎么做。

编辑:

我之所以选择PatientID.ToString,是因为我想让它在用户单击 ID 单元格时,无需用户输入任何内容即可获得 ID。但显然那是错误的,所以我做了一个输入框并按照玛丽的回答。但我在Execute... 行收到此错误: "没有为一个或多个必需参数指定值"

我进行了搜索,其中大多数人都说要加上单引号才能使其正常工作。我做了 (^) 并且仍然得到那个错误:(我是否以错误的方式调用 sub?

    Private Sub DischargeToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles DischargeToolStripMenuItem1.Click
        Dim ID As Integer
        ID = InputBox("Enter the ID of the patient to be discharged", "Discharge")
        DeleteRecord(ID)
    End Sub

    Sub DeleteRecord(ID As Integer)
        Dim provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
        Dim dataFile = "C:\Users\user\Desktop\PU\SEMESTER 4\Visual Programming\Hospital Databases\Patient DB.accdb"
        Dim connString = provider & dataFile
        Using myConnection As New OleDbConnection(connString),
                cmd As New OleDbCommand("Delete * from Patient Where PatientID = @ID", myConnection)
            cmd.Parameters.Add("@ID", OleDbType.Integer).Value = ID
            myConnection.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Sub

【问题讨论】:

  • 当你 debug.print str 的值你得到什么?给您的提示是首先让 SQL 查询在 Access 中工作,然后将其用作构建所需的确切字符串的指南。从这个问题很可能你只需要这个: Where [PatientID] = '" & PatientID.ToString & "'"
  • 根据错误消息,PatientIDDataGridView 中的一列。这意味着你不仅使用了糟糕的、误导性的名称,而且使用了错误的东西。如果您想要的实际值在网格中一行的单元格中,那么您需要从网格行的单元格中获取该值,而不是使用列。此外,停止使用字符串连接将值插入 SQL 代码并学习如何使用参数。
  • 如果你能告诉我们PatientID来自哪里会很有帮助

标签: database vb.net ms-access


【解决方案1】:

需要处理连接和命令。 Using...End Using 块将负责关闭连接以及处理连接和命令。在此代码中,连接和命令都包含在同一块中。注意Using 第一行末尾的逗号。

直到最后一刻才打开连接,直接在.Execute... 行之前。之后立即关闭与End Using 的连接。

始终使用参数。对于 Access,我们使用参数名称以便于阅读代码。 Access 不注意名称。重要的是参数在 sql 查询中出现的顺序必须与参数添加到参数集合中的顺序相匹配。我不得不猜测参数的数据类型。检查数据库的实际类型。

Private Sub DeleteRecord(ID As Integer)
    Dim provider = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
    Dim dataFile = "C:\Users\user\Desktop\PU\SEMESTER 4\Visual Programming\Hospital Databases\Patient DB.accdb"
    Dim connString = provider & dataFile
    Using myConnection As New OleDbConnection(connString),
            cmd As New OleDbCommand("Delete * from Patient Where PatientID = @ID", myConnection)
        cmd.Parameters.Add("@ID", OleDbType.Integer).Value = ID
        myConnection.Open()
        cmd.ExecuteNonQuery()
    End Using
End Sub

编辑

应始终验证用户输入。用户可能会或可能不会输入可以转换为数字的内容。服务器数据类型有一个 .TryParse 方法来测试。 .TryParse 返回 Boolean,因此它正好适合 If 语句。您要测试的第一个参数字符串。第二个参数是您要转换为的类型的变量。 .TryParse 将用转换后的值填充第二个变量。

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    'An InputBox always returns a String, not a number
    Dim ID = InputBox("Enter the ID of the patient to be discharged", "Discharge")
    Dim intID As Integer
    If Integer.TryParse(ID, intID) Then
        DeleteRecord(intID)
    Else
        MessageBox.Show("Please enter a valid number")
    End If
End Sub

【讨论】:

  • 您好,谢谢您的回答,不幸的是,我在execute... 行中遇到了一个错误,当我搜索时,大多数人只建议使用单引号,但它仍然给出了错误。我编辑了我的问题,我是否以错误的方式调用 sub?
  • 请开启 Option Strict。这是一个两部分的过程。首先对于当前项目 - 在解决方案资源管理器中双击我的项目。选择左侧的编译。在 Option Strict 下拉列表中选择 ON。未来项目的第二个 - 转到工具菜单 -> 选项 -> 项目和解决方案 -> VB 默认值。在 Option Strict 下拉列表中选择 ON。这将使您避免在运行时出现错误。
  • 你检查数据库中PatientID的数据类型了吗?
  • 在 access2010 中,数据类型是“数字”,所以我假设整数。我尝试使用tryparseconvert.toInt32 对其进行验证,但它仍然在execute 行上给出了错误。
  • @ConfusedCoder 您是否尝试过在 Access 应用程序中运行查询?您可能会得到更好的错误解释。
【解决方案2】:

我认为您的问题出在数据文件的定义中,因为它没有正确读取文件名。虽然我同意其他人的观点,即使用参数是最好的方法,但在此期间,试试这个:

Dim MyFile as string = "Patient DB.accdb"
Dim dataFile = "C:\Users\user\Desktop\PU\SEMESTER 4\Visual Programming\Hospital Databases\" & MyFile

【讨论】:

  • 我试过了,但execute 行仍然有错误,所以我不这么认为。
猜你喜欢
  • 2021-05-04
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多