Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net System.InvalidOperationException:ExecuteReader需要打开且可用的连接。连接';当前状态为关闭_Vb.net_Ms Access_Executereader - Fatal编程技术网

Vb.net System.InvalidOperationException:ExecuteReader需要打开且可用的连接。连接';当前状态为关闭

Vb.net System.InvalidOperationException:ExecuteReader需要打开且可用的连接。连接';当前状态为关闭,vb.net,ms-access,executereader,Vb.net,Ms Access,Executereader,我在另一个解决方案中遇到客户服务模块问题。我认为问题在于我打电话或接通电话的方法 这是我的类,名为DBConnForAccess Imports System.Data.OleDb Imports System.Data.Odbc Public Class DBConnForAccess Dim Conn As New OleDbConnection Dim cmd As New OleDbCommand Dim Trans As OleDbTransaction Public Funct

我在另一个解决方案中遇到客户服务模块问题。我认为问题在于我打电话或接通电话的方法

这是我的类,名为DBConnForAccess

Imports System.Data.OleDb
Imports System.Data.Odbc

Public Class DBConnForAccess

Dim Conn As New OleDbConnection
Dim cmd As New OleDbCommand
Dim Trans As OleDbTransaction

Public Function DBConnect(ByVal filePath As String, pass As String)
    Try
        ' open Database

        'Conn = New SqlConnection("Data Source=" + ServerName + "\" + DBName + ";User ID=" + DBUsername + ";Password=" + DBPassword + ";Initial Catalog= '" + TB + "'")
        Conn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Jet OLEDB:Database Password=" + pass + ";")
        '                          "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\mydatabase.mdb;Jet OLEDB:Database Password=MyDbPassword;"

        If Conn.State = ConnectionState.Closed Then
            Conn.Open()
        End If

        ' create transaction
        Trans = Conn.BeginTransaction
        Return "Ok"

    Catch ex As Exception
        Return ex.Message
    End Try

End Function

Public Sub ExecuteSQL(ByVal sql As String, ByVal ParamArray Obj() As Object)
    ' command Object
    Dim CMD As New OleDbCommand(sql, Me.Conn, Me.Trans)

    'add the parameters to the sql command
    Dim I As Integer
    For I = 0 To Obj.Length - 1
        CMD.Parameters.AddWithValue("@" & I, Obj(I))
    Next

    'execute the sql
    CMD.ExecuteNonQuery()
End Sub

Public Sub commit()
    Me.Trans.Commit()
    Me.Trans = Me.Conn.BeginTransaction
End Sub

Public Sub rollback()
    Me.Trans.Rollback()
    Me.Trans = Me.Conn.BeginTransaction
End Sub

Public Sub CloseDB()
    Me.Conn.Close()
    Me.Conn.Dispose()
    Me.Trans.Dispose()
End Sub

Public Function ReadData(ByVal sql As String, ByVal ParamArray Obj() As Object)
    ' command Object
    Dim CMD As New OleDbCommand(sql, Me.Conn, Me.Trans)

    'add the parameters to the sql command
    Dim I As Integer
    For I = 0 To Obj.Length - 1
        CMD.Parameters.AddWithValue("@" & I, Obj(I))
    Next

    Dim R = CMD.ExecuteReader()
    'Do While R.Read

    'Loop
    Return R

End Function
End Class
下面是我用来获取数据的Sub

Dim connection As String = txt_util.readFromTextFile("ConnStr_2.txt", 0) + "Billing.mdb"
 'connection string is in a text file with text at line 0 as "C:\BILLSERV\"

 Private Sub searchAccnt(ByVal SIN As String)
    'clear other fields
    Clear("Acct")
    Try
        AccntDetail.DBConnect("ConcessionairesAccnt")
        'Dim RS = AccntDetail.ReadData("Select * From AllAccounts Where SIN=@0", txtSIN.Text.Trim)
        Dim RS = AccntDetail.ReadData("Select * From viewCSFAccnt Where SIN=@0", SIN)

        RS.Read()
        If RS.Hasrows = 0 Then
            MsgBox("Accounts not found. Check the SIN you Enter.", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "Records not found.")
            'txtAppNo.Focus()
            Exit Sub
        Else
            'MsgBox("Accounts correct.", MsgBoxStyle.Information + MsgBoxStyle.OkOnly, "Records found.")
            txtZoneNo.Text = RS.Item("Zone").ToString
            txtSeq.Text = RS.Item("SeqNo").ToString
            txtAccntName.Text = RS.Item("AccountName").ToString
            txtAccntAddress.Text = RS.Item("HouseNo").ToString + " " + RS.Item("BLDGName").ToString + " " + RS.Item("Street").ToString + _
                                   " " + RS.Item("BRGY").ToString
            txtMeterNo.Text = RS.Item("MeterNo").ToString
            txtAccntStatus.Text = varA.AccntStatus(RS.Item("Status").ToString)


            'Dim con = AccessAccnt.DBConnect(connection, "")
            'If con <> "Ok" Then
            '    MsgBox("Cannot establish a Connection to the server.", MsgBoxStyle.Critical, "Connection Lost...")
            'End If

            Dim ZoneNo = "Z" + GetChar(txtZoneNo.Text, 1) + GetChar(txtZoneNo.Text, 2) + "B" + GetChar(txtZoneNo.Text, 3) + GetChar(txtZoneNo.Text, 4)
            AccessAccnt.DBConnect(connection, "")
            Dim Acc = AccessAccnt.ReadData("SELECT * FROM " & ZoneNo & " WHERE AcctNo3=@1", txtSeq.Text)
            Acc.Read()
            txtLastReading.Text = Acc.Item("LastReading").ToString
            Acc.close()
            AccessAccnt.CloseDB()

        End If
        RS.Dispose()
        AccntDetail.CloseDB()

        dbCounter.DBConnect("ConcessionairesAccnt")
        Dim result = dbCounter.ReadData("Select Top 1 CSFNo From CSFMaster WHERE (CSFNo LIKE '%" & ctrDate() & "%') order by CSFNo Desc")
        result.read()
        If result.hasrows = 0 Then
            txtTrackingNo.Text = ctrDate() & "-" & "000001"
        Else
            txtTrackingNo.Text = counter.CtrLastItemWithChar("ConcessionairesAccnt", "CSFNo", "CSFMaster", "WHERE (CSFNo LIKE '%" & ctrDate() & "%') ORDER BY CSFNo DESC", 5)
        End If
        dbCounter.CloseDB()

    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try

End Sub
它说:

System.InvalidOperationException: ExecuteReader requires an open and available connection. The connection's current state is closed.
子系统的其他部分工作正常,即在MSSQL服务器数据库中获取数据的部分。问题在于Access数据获取代码

我尝试在另一个项目中使用该代码(只是我获取访问数据的代码),我在其他解决方案中工作。但是我复制并粘贴我的代码在这个解决方案中的任何形式上,我总是给出错误

我想我可能在某个地方关闭了连接,但这是我在整个项目中使用此代码的唯一实例。(只是为了得到最后的读数记录。)

数据库位于正确的位置(C:\BILLSERV)

我试着在SE上搜索它,但我能看到的是关于可能忘记打开连接的建议。我以前使用过这段代码,这段代码适用于我的其他解决方案。我就是不能让它在这个特殊的项目上工作。我想知道为什么

我试着用这段代码运行另一个项目,效果很好

关于VB.net 2012上的Access连接是否存在错误,我已经使用此代码(DBConnForAccess类)大约一年了,这是我第一次遇到此错误。顺便说一句,我使用Access 2003,因为该数据库用于VB6中创建的旧系统

最后,这可能是因为解决方案来自另一台使用VB.Net程序的计算机,该程序与我的程序相同。因为我们在这里是一个团队。希望对这些系统有更好了解的人能帮上忙。提前谢谢

编辑

如果建立了连接,access中应该会出现一个.ldb文件。(我在另一个项目上对此进行了测试,连接完成后会出现一个ldb文件,因为我们都知道ldb文件包含使用db文件的用户的数据。)我尝试重新运行系统,但在使用系统时,没有创建ldb文件

另外,我想我可能在某个地方关闭了连接,但这是我在access中打开连接的唯一实例,我在整个项目中使用了该代码。(只是为了得到最后的读数记录。)


因此,在经过一周的调试和阅读网络上的文章后,这是一份仅供澄清的副本。 我们已经找到了错误的罪魁祸首

似乎高级编译器设置中的目标CPU选项已更改为AnuCPU

在检查了我们使用的其他应用程序项目之后,我们注意到了这一点

将其更改回x86可解决连接问题

我想知道为什么这会影响到接入的连接


现在一切正常。感谢您的建议,我们将对代码进行更改。

如果您的数据库连接失败并返回错误消息,该怎么办?你知道会发生什么吗?如果不使用异常,则不要捕获它们。@Steve我应该使用什么?我用这条线来检查我的DB是否连接,如果con“Ok”的话。它总是返回“无法建立到服务器的连接”。可能是什么问题?我尝试了其他方法,更改目标框架,下载AccessDatabaseEngine并安装它。仍然没有luckWell,启动对DBConnect的第一个调用似乎没有传递access数据库的有效文件名(缺少扩展名),然后第二个connect使用一个变量,我们无法看到它是如何初始化的,或者它是否初始化的。如果你有调试器,是时候开始使用它了。@Steve抱歉,我在连接字符串中添加了我使用的行。它在一个文本文件中。正在被另一个类a textfileUtility读取。您需要启用Option Strict。
DBConnForAccess
似乎正在接近反模式。时间和代码似乎更适合用实际类型实现SQL参数,而不是使用所有
Object
块来关闭和处置应该关闭和处置的对象
System.InvalidOperationException: ExecuteReader requires an open and available connection. The connection's current state is closed.