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

时间:2011-12-12 19:22:38

标签: winforms ms-access refresh oledb oledbconnection

由于我的.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吗?

谢谢! Pileggi

2 个答案:

答案 0 :(得分:1)

不,不要打开连接。连接池提供快速重新连接。

您在阅读和编写数据时遇到的问题取决于Jet的实施方式:

  

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

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

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

答案 1 :(得分:1)

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

这是一个很好的链接: