0

私の .Net Win-Form アプリケーションで説明するには長すぎる理由により、単一のグローバル OleDbConnection を使用して Access DB に接続します。必要に応じて接続を開いたり閉じたりしますが、通常、接続は開いたままです。問題は、データの読み取りが更新されたデータを返さない場合があることです。

Using cm As New OleDb.OleDbCommand(sQuery, cn)
    Using rd As OleDb.OleDbDataReader = cm.ExecuteReader()
        If rd.HasRows Then
            If rd.Read() Then
                Me.txtBrand.Text = rd.Item("MA_BRAND")
            End If
        End If
        rd.Close()
    End Using
End Using

一方、新しい接続を使用すると、正しいデータが得られます:

Using cn As New OleDb.OleDbConnection(sConnectionString)
    cn.Open()
    Using cm As New OleDb.OleDbCommand(sQuery, cn)
        Using rd As OleDb.OleDbDataReader = cm.ExecuteReader()
            If rd.HasRows Then
                If rd.Read() Then
                    Me.txtBrand.Text = rd.Item("MA_BRAND")
                End If
            End If
            rd.Close()
        End Using
    End Using
    cn.Close()
End Using

グローバル接続を使用する必要がある場合、私の解決策はこれです

cn.Close()
cn.Open()
Using cm As New OleDb.OleDbCommand(sQuery, cn)

しかし、私は尋ねます: OledbConnection を更新するためのより良い解決策はありますか?

ありがとうございました!ピレッジ

4

2 に答える 2

1

いいえ、接続を開いたままにしないでください。接続プールは高速再接続を提供します。

データの読み書きで直面している問題は、Jetの実装方法によるものです。

Microsoft Jet には、PageTimeout ミリ秒 (デフォルトは 5000ms = 5 秒) ごとに更新される読み取りキャッシュがあります。また、メイン処理とは別のスレッドで動作する遅延書き込みメカニズムも備えているため、ディスクへの変更を非同期的に書き込みます。

また、rd.HasRows()は必要If rd.Read() Thenありません。行がない場合、 は false を返します。

続行するには、宣言rd.Close()を使用しているため、どちらも必要ありません。が閉じて破棄しますUsing...End UsingEnd Using

于 2011-12-12T19:28:03.797 に答える
1

Jet Access エンジンはデータをキャッシュします。これがおそらく問題です。

ここに良いリンクがあります:

于 2011-12-12T19:28:13.687 に答える