VB.NET使用OleDb操作Access报Fill相关InvalidOperationException错误问询
错误触发原因
- 核心问题是
OleDbCommand构造函数的传参语法错误:你将连接对象conn写在了SQL语句的字符串引号内部,导致构造函数只接收到了一个包含错误后缀的SQL字符串,没有给命令对象关联对应的数据库连接,执行Fill方法时无法找到有效连接就抛出该异常。 - 附加问题:代码没有对数据库连接、命令对象做资源释放管理,存在资源泄漏的潜在风险。
修复后完整代码
Imports System.Data Imports System.Data.OleDb Public Class Form1 Private Sub btnlogin_Click(sender As Object, e As EventArgs) Handles btnlogin.Click ' 使用Using包裹连接对象,执行完自动释放资源 Using conn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Katlego\Documents\LoginDb.accdb") ' 修正构造函数参数,将conn移出SQL字符串引号,正确关联连接 Using cmd As New OleDbCommand("select * from logintable where username1=@username1 and password1=@password1", conn) cmd.Parameters.Add("@username1", OleDbType.VarChar).Value = txtusername.Text cmd.Parameters.Add("@password1", OleDbType.VarChar).Value = txtpassword.Text Dim adapter1 As New OleDbDataAdapter(cmd) Using logintable As New DataTable adapter1.Fill(logintable) If logintable.Rows.Count <= 0 Then MsgBox("error username or password") Else MsgBox("login successful") End If End Using End Using End Using End Sub End Class
调整说明
- 修正了
OleDbCommand构造函数的参数错误,把conn移出SQL字符串引号,成功给命令对象关联数据库连接。 - 用
Using语句包裹连接、命令、数据表对象,执行结束后自动释放资源,无需手动调用Close或Dispose方法,避免资源泄漏。 - 移除了无意义的
unused变量声明,Fill方法的返回值无需额外变量接收。 - 修正了提示文本中
sucessfull的拼写错误为successful,如果需要中文提示可直接替换引号内的文本即可。
内容的提问来源于stack exchange,提问作者Katlego Lebese
相关产品推荐
相关产品推荐

