2011-12-12 23 views
0

由於在我的.Net Win-Form應用程序中解釋太長時間的原因,我使用單個全局OleDbConnection來連接Access數據庫。當我需要時,我打開並關閉連接,但通常連接仍處於打開狀態。 的問題是,數據有時讀不返回更新DATAS:將OleDbConnection刷新到Access數據庫 - 最佳實踐

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

回答

1

Jet Access引擎緩存的東西 - 這可能是問題。

這裏有一個很好的鏈接:

+1

非常感謝!這非常有趣,但要使用這些說明,我必須引用com對象「Microsoft Jet和複製對象2.1庫」。有沒有辦法在ADO.Net中做同樣的事情? – lamarmora

1

不,請不要打開連接。連接池提供了快速重新連接。

你正面臨着與讀取和寫入數據的問題是由於如何Jet實現:

的Microsoft Jet有一個讀緩存每隔將PageTimeout毫秒(默認爲5000毫秒= 5秒)更新。它還具有懶惰的寫入機制,可以在單獨的線程上對主要處理進行操作,從而將更改異步寫入磁盤。

此外,rd.HasRows()是沒有必要的,If rd.Read() Then將返回false,如果沒有任何行。

要繼續,rd.Close()不是必需的,因爲您使用的是Using...End Using聲明。 End Using將關閉併爲您處置。

+0

非常感謝您!然後我有兩個問題:有沒有辦法解決異步更新的問題?指令rd.HasRows和rd.close是多餘的,但它們不應該產生性能問題,不是嗎? – lamarmora

+0

@pileggi取決於你在做什麼。你不明白爲什麼你需要全局連接,但我懷疑如果你的應用程序在任何地方都有開放的連接,你就沒有遵循最佳實踐。在開放和關閉之後,我從來沒有遇到性能問題,也沒有數據問題。如果Jet數據庫位於緩慢的網絡驅動器或連接上,*可能*會影響性能,但是您可以在自己的帖子中自己說:打開和關閉連接可以獲得正確的數據。我會繼續這樣做,但如果可以的話,請將代碼重構爲**而不是**保持連接打開。 – LarsTech

+0

非常感謝! – lamarmora