0

別のソリューションにあるカスタマー サービス モジュールに問題があります。私が思う問題は、電話をかけたり、接続を取得したりする方法にあります

ここに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で検索してみましたが、接続を開くのを忘れている可能性についての提案がどこにあるかを見ることができます。以前にこのコードを使用しましたが、このコードは他のソリューションで機能します。この特定のプロジェクトでは、ここで機能するようには思えません。なぜだろう..

このコードを使用して別のプロジェクトを実行してみましたが、正常に動作します。

VB.net 2012 の Access 接続に関するバグはありますか。このコード (DBConnForAccess クラス) を約 1 年間使用していますが、このエラーに遭遇したのはこれが初めてです。ところで、このデータベースはVB6で作成された古いシステム用であったため、Access 2003を使用しています。

最後に、私のものと同じ VB.Net プログラムを使用して別のコンピューターからソリューションが提供されたことが原因である可能性があります。私たちはここでチームとして働いているからです。これらのシステムについてより詳しい知識を持つ人が助けてくれることを願っています。前もって感謝します。

編集

接続が確立されている場合は、アクセスに .ldb ファイルが表示されるはずです。(私はこれを別のプロジェクトでテストし、ldb ファイルには db ファイルを使用しているユーザーのデータが含まれていることを知っているので、接続が確立されると ldb ファイルが表示されます。) システムを再実行しようとしましたが、システムを使用すると、ldb ファイルは作成されませんでした。

また、どこかで接続を閉じたのではないかと思いましたが、アクセスで接続を開き、このプロジェクト全体でコードを使用したのはこれだけです。(最後の読書記録を取得するためだけに。)

したがって、これは「開いている DataReader が既に存在します...」の複製ではありません。DB 接続を再利用または破棄しますか? 説明のためだけに

4

1 に答える 1

0

デバッグと Web での記事の読み取りの 1 週間後。エラーの原因を突き止めました。

Advance compiler SettingsTarget CPU OptionAnuCPUに変更されたようです。

これは、使用した他のアプリケーション プロジェクトを確認した後でわかりました。

x86に戻すと、接続の問題が解決します。

ターゲット CPU の設定

なぜこれがアクセスへの接続に影響したのだろうか。

現在、すべて正常に動作しています。PlutonixSteveに、コードを変更するためのすべての提案に感謝します。

于 2016-02-11T01:08:27.747 に答える