[英]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 & "]"
但这给出了一个错误:“没有为一个或多个必需参数提供值”。 当我用单引号替换括号时,我也收到此错误。
我尝试了 this , this和this ,但仍然出现错误。
不知道该怎么办。
编辑:
我做了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.