System.InvalidOperationException: 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 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

Ошибка выдается здесь:

Dim Acc = AccessAccnt.ReadData("SELECT * FROM " & ZoneNo & " WHERE AcctNo3=@1", txtSeq.Text)

Это говорит:

System.InvalidOperationException: ExecuteReader requires an open and available connection. The connection's current state is closed.

Другие части подпрограммы Хорошо работает, часть, где я получаю данные из моей базы данных MSSQL Server. Проблема заключается в коде получения данных Access.

Я пытался использовать код в другом проекте (только код, из которого я получаю данные доступа), я работал над другими решениями. Но я копирую и вставляю свой код в любую форму в этом решении, которое я постоянно выдаю.

Я подумал, может быть, я где-то закрыл соединение, но это единственный случай, когда я использовал этот код во всем этом проекте. (Просто чтобы получить последнюю запись чтения.)

База данных находится в правильном месте (C:\BILLSERV)

Я пробовал искать его здесь на SE, но все, что я могу видеть, где предложения о том, что, возможно, забыл открыть соединение. Я использовал этот код раньше, и этот код работает на других моих решениях. Я просто не могу заставить его работать над этим конкретным проектом. Интересно, почему..

Я попытался запустить другой проект с использованием этого кода, и он работает нормально.

Есть ли ошибка в соединении Access на VB.net 2012, я использую этот код (класс DBConnForAccess) уже около года, и я впервые столкнулся с этой ошибкой. Кстати, я использую Access 2003, потому что эта база данных была для старой системы, созданной в VB6.

Наконец, это может быть связано с тем, что решение пришло с другого компьютера, использующего программу VB.Net, аналогичную моей. Потому что мы работаем как команда здесь. Надеюсь, что кто-то с лучшими знаниями в этих системах может помочь. Заранее спасибо.

РЕДАКТИРОВАТЬ

Если соединение установлено, должен быть файл.ldb, который должен появиться. (Я проверил это в другом проекте, и после установления соединения появляется файл ldb, поскольку все мы знаем, что файл ldb содержит данные пользователя, использующего файл db.) Я попытался перезапустить систему, и пока я с использованием системы файл ldb не был создан.

Кроме того, я подумал: "Может быть, я где-то закрыл соединение, но это единственный случай, когда я открыл соединение при доступе и использовал код во всем этом проекте". (Просто чтобы получить последнюю запись чтения.)

Так что это НЕ дубликат "Уже есть открытый DataReader…". Повторное использование или удаление подключений к БД? Просто для уточнения

1 ответ

Решение

После недели отладки и чтения статей в сети. Мы нашли виновника ошибки.

Похоже, что параметр Target CPU в расширенных настройках компилятора был изменен на AnuCPU.

Мы заметили это после того, как проверили другие проекты приложений, которые использовали.

Изменение его обратно на x86 решает проблему с подключением.

Настройки целевого процессора

Интересно, почему это повлияло на соединение с доступом.

Теперь все работает нормально. спасибо Plutonix и Steve за все ваши предложения, мы Plutonix изменения в наши коды.

Другие вопросы по тегам