2013-04-12 119 views
1

在啓動ODBC/OLEDB爭議的風險中,是否有任何人有任何關於將Access前端鏈接到SQL Server後端的最佳實踐建議?最佳實踐SQL Server/Access連接

我已經閱讀了有關.ADP和.MDB的文章,並且也通過了無DNS的連接信息並且認同了這個想法。

我的主要問題是圍繞鏈接數據和性能。在過去,我發現表單在直接連接到SQL數據庫時速度很慢,我已經測試了基於ODBC鏈接表與「OnOpen」事件中的OLEDB連接的表單,並發現OLEDB方法雖然速度不快,但速度更快。因此,我已經實現了在打開表單時在本地複製數據的例程,修改完成後將其寫回數據庫,但這有其自身的問題。

有沒有人有關於這種設置的最佳實踐方法的建議?我是否錯過了一些可以改善直接鏈接到SQL Server的表單的東西?

任何意見或提示表示讚賞。

回答

2

您必須將網絡流量降至最低,特別是確認交換。通過儘可能在SQL服務器上專門運行SQL,將完整的行集只傳輸回客戶端。不惜任何代價避免將服務器上的數據連接到Access數據庫中的數據。這應該讓你開始。

2

基本的方法是簡單地使用鏈接表。

使用ODBC時,您不應該在這裏看到任何真正的區別。 ODBC是首選方法,微軟已經宣佈oleDB支持的結束(並且大約10年前,.net社區留下了oleDB和ADO)。

您可以將表單綁定到這些鏈接表並實現良好的性能。簡單的訣竅是減少和限制記錄。這種限制可以通過在啓動這些綁定表單時使用SIMPLE where子句來實現。

因此,如果您啓動一個綁定發票窗體並在標準打開窗體命令上提供where子句,那麼只會拉出一條記錄。如果你有一個綁定的子表單,那麼只有正確的記錄纔會從服務器上被取出。因此,在99%的案例中,使用oleDB或ADO在這裏沒有任何優勢。

因此,作爲一般的開發方法,您可以在大多數情況下使用綁定表單。

需要注意的是,對於某些連接和任何具有聚合查詢的任何事情,則希望使用鏈接表來訪問sql視圖。您也可以考慮使用傳遞來報告,但傳遞往往是更多的工作,並且鏈接視圖意味着您可以保留現有的VBA代碼,可能(希望)使用「where」子句打開這些報告並再次限制記錄拉下網絡管道。

而對於動態傳遞到執行服務器端的命令,我用這個代碼:

Dim qdfPass  As DAO.QueryDef 

Set qdfPass = CurrentDb.QueryDefs("MyPass") 
qdfPass.SQL = "exec sp_myProc " & "p1" 
qdfPass.Execute 

如果你需要以上返回的記錄,然後只是去:

Dim qdfPass  As DAO.QueryDef 
Dim rstData  As DAO.recordSet 
Set qdfPass = CurrentDb.QueryDefs("MyPass") 
qdfPass.SQL = "exec sp_myProc " & "p1" 
set rstData = qdfPass.OpenRecordSet 

所以你可以即時更改/修改上面的SQL,以便使用非常少的代碼進行傳遞查詢。在一天結束時,您可以實現一流的性能,並且只需對現有應用程序進行很少的編碼更改即可實現。

所以目前推薦的方法是使用DAO。請記住,對於sql server的oleDB(和ADO)的生命支持現在已經公佈了。看到這裏:

http://blogs.msdn.com/b/sqlnativeclient/archive/2011/08/29/microsoft-is-aligning-with-odbc-for-native-relational-data-access.aspx

+0

感謝這個信息,我沒有考慮傳遞查詢。將實施這些想法並希望獲得性能提升。 – Corey