为什么在查询 Access 数据库时会出现此异常?
Why do I get this exception when querying an Access database?
我需要一点帮助,请帮帮我。我想用来自我的数据库的数据填充我的组合框。我正在使用 MS 访问。我想要做的是用我的数据库中的名称或单个列填充我的组合框。我很难做到这一点。
Private Sub Judges_Load(sender As Object, e As EventArgs) Handles MyBase.Load
With cmd
.Connection.Open()
.CommandText = "SELECT FullName FROM Judges"
rdr = cmd.ExecuteReader
While rdr.Read()
cmbJudges.Items.Add(rdr("FullName"))
End While
.ExecuteNonQuery()
.Connection.Close()
rdr.Close()
End With
End Sub
但是我遇到了这样的错误:
System.NullReferenceException: 'Object reference not set to an instance of an object.'
System.Data.OleDb.OleDbCommand.Connection.get returned Nothing
我不明白这个,它指向我的连接语句。
我已经找到解决方案
Dim rdr as OleDb.OleDbDataReader
Dim con As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\athan\Documents\PAGEANT.accdb")
Try
With cmd
.Connection = con
.Connection.Open()
.CommandText = "SELECT FullName from Judges"
rdr = cmd.ExecuteReader
While rdr.Read
cmbJudges.Items.Add(rdr.Item(0))
End While
rdr.Close()
.Connection.Close()
End With
Catch ex As Exception
Dim test = MsgBox(ex.Message)
End Try
感谢您的反馈。下次我 post 一个问题时,我会记住你们所说的。
人脉是宝贵的资源。它们需要在最后可能的时刻(就在 .Execute...
方法之前)打开,并尽快关闭和处理。
一些数据库对象,如 Connection
和 Command
在幕后使用非托管资源。他们将在他们的 .Dispose
方法中释放这些资源。为了避免我们不得不 .Close 和 .Dispose 这些对象,我们有 Using...End Using
块来为我们处理这些琐事,即使出现错误也是如此。在此代码中,连接和命令均由单个 Using
块处理。
我通过将连接字符串直接传递给连接的构造函数并将命令文本和连接直接传递给命令的构造函数来缩短代码。
只要 reader 处于活动状态,连接就必须保持打开状态。我使用了一个 DataTable
,我可以用 reader 快速加载它,然后用 End Using
关闭连接。然后我们通过将 .DisplayMember
设置为字段名称并将 DataSource
设置为 DataTable
.
来更新用户界面
Private Sub FillComboBox()
Dim dt As New DataTable
Using con As New OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\athan\Documents\PAGEANT.accdb"),
cmd As New OleDbCommand("SELECT FullName from Judges", con)
Try
con.Open()
dt.Load(cmd.ExecuteReader)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Using
ComboBox1.DisplayMember = "FullName"
ComboBox1.DataSource = dt
End Sub
我需要一点帮助,请帮帮我。我想用来自我的数据库的数据填充我的组合框。我正在使用 MS 访问。我想要做的是用我的数据库中的名称或单个列填充我的组合框。我很难做到这一点。
Private Sub Judges_Load(sender As Object, e As EventArgs) Handles MyBase.Load
With cmd
.Connection.Open()
.CommandText = "SELECT FullName FROM Judges"
rdr = cmd.ExecuteReader
While rdr.Read()
cmbJudges.Items.Add(rdr("FullName"))
End While
.ExecuteNonQuery()
.Connection.Close()
rdr.Close()
End With
End Sub
但是我遇到了这样的错误:
System.NullReferenceException: 'Object reference not set to an instance of an object.'
System.Data.OleDb.OleDbCommand.Connection.get returned Nothing
我不明白这个,它指向我的连接语句。
我已经找到解决方案
Dim rdr as OleDb.OleDbDataReader
Dim con As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\athan\Documents\PAGEANT.accdb")
Try
With cmd
.Connection = con
.Connection.Open()
.CommandText = "SELECT FullName from Judges"
rdr = cmd.ExecuteReader
While rdr.Read
cmbJudges.Items.Add(rdr.Item(0))
End While
rdr.Close()
.Connection.Close()
End With
Catch ex As Exception
Dim test = MsgBox(ex.Message)
End Try
感谢您的反馈。下次我 post 一个问题时,我会记住你们所说的。
人脉是宝贵的资源。它们需要在最后可能的时刻(就在 .Execute...
方法之前)打开,并尽快关闭和处理。
一些数据库对象,如 Connection
和 Command
在幕后使用非托管资源。他们将在他们的 .Dispose
方法中释放这些资源。为了避免我们不得不 .Close 和 .Dispose 这些对象,我们有 Using...End Using
块来为我们处理这些琐事,即使出现错误也是如此。在此代码中,连接和命令均由单个 Using
块处理。
我通过将连接字符串直接传递给连接的构造函数并将命令文本和连接直接传递给命令的构造函数来缩短代码。
只要 reader 处于活动状态,连接就必须保持打开状态。我使用了一个 DataTable
,我可以用 reader 快速加载它,然后用 End Using
关闭连接。然后我们通过将 .DisplayMember
设置为字段名称并将 DataSource
设置为 DataTable
.
Private Sub FillComboBox()
Dim dt As New DataTable
Using con As New OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\athan\Documents\PAGEANT.accdb"),
cmd As New OleDbCommand("SELECT FullName from Judges", con)
Try
con.Open()
dt.Load(cmd.ExecuteReader)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Using
ComboBox1.DisplayMember = "FullName"
ComboBox1.DataSource = dt
End Sub