OLEDB:第二次打开连接不起作用

时间:2016-02-06 05:06:15

标签: vb.net oledb

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

感谢您的帮助: - )

2 个答案:

答案 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