別のソリューションにあるカスタマー サービス モジュールに問題があります。私が思う問題は、電話をかけたり、接続を取得したりする方法にあります
ここに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 接続を再利用または破棄しますか? 説明のためだけに