Hello 2 everyone ^ _ ^ ...
我有一个连接到服务器数据库的VB代码,并使用虚拟机作为客户端(抱歉,我只有一台计算机:P)。
1点击选择查询工作,但第二次它不再工作... 这是我的代码:
来自模块
Imports System.Data.OleDb
Module oledb
Public conn As OleDbConnection = New OleDbConnection()
Public comm As OleDbCommand
Public reader As OleDbDataReader
Public query As String
Sub connection()
Try
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\\vboxsvr\Documents\sampleDB.mdb;User Id=Admin;Password="
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
End Module
从表格
Imports System.Data.OleDb
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Call connection()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
conn.Open()
query = "select * from sample_tbl"
comm = New OleDbCommand(query, conn)
reader = comm.ExecuteReader
While reader.Read
ListBox1.Items.Add("Number: " + reader("number").ToString + "Letter: " + reader("letter").ToString)
End While
conn.Close()
Catch ex As Exception
MsgBox(ex.ToString)
Finally
conn.Dispose()
End Try
End Sub
End Class
错误是
connectionstring属性尚未初始化
错误行在表单代码
上conn.open
感谢您的帮助: - )
答案 0 :(得分:0)
每次单击按钮时都会处理conn
对象。你应该做类似以下的事情。评论代码的变化。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
conn.Open()
query = "select * from sample_tbl"
comm = New OleDbCommand(query, conn)
reader = comm.ExecuteReader
While reader.Read
ListBox1.Items.Add("Number: " + reader("number").ToString + "Letter: " + reader("letter").ToString)
End While
Catch ex As Exception
MsgBox(ex.ToString)
Finally
'Close the connection
'Better to close the connection in Finally block
conn.Close()
'but don't dispose the conn object
'conn.Dispose()
End Try
End Sub
答案 1 :(得分:0)
来自MSDN:
我们建议您在完成连接后始终关闭或处置连接,以便将连接返回到池中。
这意味着应该为每次使用创建,打开和关闭数据库连接。这对Access来说有点不那么重要,但这样做可以避免遇到的问题:
Module oledb
Public conn As OleDbConnection = New OleDbConnection()
Public comm As OleDbCommand
Public reader As OleDbDataReader
创建一个全局OleDbCommand
对象也会遇到麻烦。与所有设置和属性 通常相同的连接对象不同,DBCommand
对象特定于查询。重用它们可以导致最后一次使用的东西继续存在。发布的代码不太可能遇到此问题,因为 每次都会创建一个新代码:
comm = New OleDbCommand(query, conn)
然而,旧的没有关闭或处置。 In this question代码在一段时间后无法创建新的DbCommand
对象,因为系统资源已耗尽。
最后,使用全局命令对象保存的仅事物只是:Dim
。重用DataReader
对象可能会导致其他问题。
如果没有其他原因,除非必须复制遍布代码的连接字符串,否则 在每次需要时都可以创建新连接。答案不是全局连接,而是辅助方法:
Public Function GetConnection(Optional usr As String = "admin",
Optional pw As String = "") As OleDb.OleDbConnection
Return New OleDb.OleDbConnection( _
String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};User Id={1};Password={2};",
dbFile, usr, pw))
End Function
注意:你也可以在这里使用ConnectionStringBuilder
,我认为OleDb版本显然不太容易使用(例如与MySQL版本相比)。
Using
个块。例如:
Using dbCon As OleDbConnection = GetConnection()
...
End Using
Using
创建一个新的block scope - 目标变量在块的开头声明并创建,并且仅存在于该块中。物体关闭并放置在末端,以便清理所有物品。
由于OleDbCommand
对象在使用后也应该被丢弃,因此这些对象也可以使用Using
块。尝试重复使用全局OleDbDataReader
可能会产生InvalidOperationException
:
已经有一个与此命令关联的打开DataReader,必须先关闭它。
由于您没有关闭和处置DataReader
,因此可能只是时间问题。这些也可以使用Using
块。 您修改的代码:
Dim SQL = "select * from sample_tbl"
Using dbCon As OleDbConnection = GetConnection()
Using cmd As New OleDbCommand(SQL, dbCon)
dbCon.Open()
Using rdr As OleDbDataReader = cmd.ExecuteReader
If rdr.HasRows Then
While rdr.Read
ListBox1.Items.Add("Number: " & rdr("number").ToString
& "Letter: " + rdr("letter").ToString)
End While
End If
End Using
End Using
End Using
需要关闭和处理的所有东西都将是。应该重新创造的一切都是。请注意,您可以通过堆叠或包含多个对象来减少Using
块的缩进/数量:
Using dbCon As OleDbConnection = GetConnection(),
cmd As New OleDbCommand(SQL, dbCon)
' ...
End Using ' close and dispose of both the dbCon and cmd objects