繁体   English   中英

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

[英]I can't delete a row from MS access database from VB.net

我正在尝试按照YT 教程从 MS 数据库中删除一行,但出现了两种错误。 当我尝试这个时:

    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 }'

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

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

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

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

不知道该怎么办。

编辑:

我做了PatientID.ToString是因为我想这样当用户点击一个 ID 单元格时,它会在用户无需输入任何内容的情况下获得 ID。 但显然那是错误的,所以我做了一个输入框并按照玛丽的回答。 但我在Execute...行收到此错误:“没有为一个或多个必需参数提供值”

我进行了搜索,他们中的大多数人都说要加上单引号才能正常工作。 我做了(^)但仍然出现错误:(我是否以错误的方式调用了子?

    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

需要处理连接和命令。 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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM