将 OleDbConnection 刷新到 Access DB - 最佳实践

Posted

技术标签:

【中文标题】将 OleDbConnection 刷新到 Access DB - 最佳实践【英文标题】:Refresh a OleDbConnection to an Access DB - best practice 【发布时间】:2011-12-12 19:22:37 【问题描述】:

由于在我的 .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 有更好的解决方案吗?

谢谢! 皮莱吉

【问题讨论】:

【参考方案1】:

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

这是一个很好的链接:

How to Synchronize Writes and Reads with MS Access

【讨论】:

非常感谢!这很有趣,但要使用这些说明,我必须引用 com 对象“Microsoft Jet And Replication Objects 2.1 Library”。有没有办法在 ADO.Net 中做同样的事情?【参考方案2】:

不,不要让连接保持打开状态。连接池提供快速重新连接。

您在读取和写入数据时遇到的问题是由于Jet 的实现方式:

Microsoft Jet 具有每 PageTimeout 毫秒更新一次的读取缓存(默认为 5000 毫秒 = 5 秒)。它还具有惰性写入机制,该机制在主处理的单独线程上运行,从而将更改异步写入磁盘。

另外,rd.HasRows() 不是必需的,如果没有任何行,If rd.Read() Then 将返回 false。

要继续,rd.Close() 也不是必需的,因为您使用的是 Using...End Using 声明。 End Using 将关闭并为您处理它。

【讨论】:

非常感谢!然后我有两个问题:有没有办法解决异步更新的问题? rd.HasRows 和 rd.close 指令是多余的,但它们不应该造成性能问题,不是吗? @pileggi 取决于你在做什么。您没有说为什么需要全局连接,但我怀疑如果您的应用程序到处都有开放连接,那么您没有遵循最佳实践。在打开和关闭之后,我从来没有遇到过性能问题或数据问题。如果 Jet 数据库位于较慢的网络驱动器或连接上,也许会影响性能,但您在帖子中自己说:打开和关闭连接可以获得正确的数据。我会继续这样做,但如果可以的话,重构你的代码以保持连接打开。 我已经听从了你的建议,现在我的问题在这个帖子里:***.com/questions/8518996/…

以上是关于将 OleDbConnection 刷新到 Access DB - 最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

在内存中 OleDbConnection 到 Excel 文件

使用两个DataAdapter使用OleDbConnection Excel到DataGridView

JSON.net 直接从 oledbconnection 序列化

JSON.net 直接从 oledbconnection 序列化

MS Access OLEDBConnection 到 Excel 问题

OLEDBConnection 到 Excel 不喜欢网络共享路径