我无法从 VB.net 的 MS 访问数据库中删除一行

Posted

技术标签:

【中文标题】我无法从 VB.net 的 MS 访问数据库中删除一行【英文标题】:I can't delete a row from MS access database from VB.net 【发布时间】: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 & "]"

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

我尝试了this、this 和this,但仍然出现错误。

想知道该怎么做。

编辑:

我之所以选择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来自哪里会很有帮助 【参考方案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 行仍然有错误,所以我不这么认为。

以上是关于我无法从 VB.net 的 MS 访问数据库中删除一行的主要内容,如果未能解决你的问题,请参考以下文章

从 MS Access 中删除所有记录

根据数据绑定组合框中的选定项目从访问数据库中删除

如何使用 vb.net 从 MS Access DB 表单中找出 Activex 控件

ASP.NET - VB.NET - 从 MS-Access 数据库中检索记录

带有MS访问数据库作为后端的VB.NET如何通过将数据库文件放入AppData文件夹进行部署?

如何在 VB.net 中使用 ROWNUM 从 MS-Access 数据库中检索数据