我无法从 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 & "'" 根据错误消息,PatientID
是DataGridView
中的一列。这意味着你不仅使用了糟糕的、误导性的名称,而且使用了错误的东西。如果您想要的实际值在网格中一行的单元格中,那么您需要从网格行的单元格中获取该值,而不是使用列。此外,停止使用字符串连接将值插入 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 中,数据类型是“数字”,所以我假设整数。我尝试使用tryparse
和convert.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 访问数据库中删除一行的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 vb.net 从 MS Access DB 表单中找出 Activex 控件
ASP.NET - VB.NET - 从 MS-Access 数据库中检索记录