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 Using声明。将End Using关闭并为您处理它。

于 2011-12-12T19:28:03.797 回答
1

Jet Access 引擎缓存东西——这可能是问题所在。

这是一个很好的链接:

于 2011-12-12T19:28:13.687 回答