2013-05-30 70 views
2

我通過DAO使用MS Access數據庫多年,但覺得我應該接受更新的技術。如何將共享數據庫從Access遷移到SQL Express

我主要的應用程序運行在最終用戶的PC(無服務器),並使用所創建和更新即時共享的數據庫。當應用程序第一次運行時,它會檢測到沒有數據庫並創建一個新的空的數據庫。

任何運行應用程序的本地用戶都可以在此共享數據庫中添加或更新記錄。我們有幾個其他共享數據庫,包含模板,區域信息等,但這些數據庫不會直接由應用程序更新。應用程序的

更新從時間釋放時間和每個新的更新檢查主數據庫版本,並在必要時執行代碼以使數據庫的最新規範。這可能涉及創建或刪除表格和/或列。作爲更新的一部分,還包括模板數據庫的新副本。

我們的用戶不會被要求是計算機知識,應該不需要運行任何種類超出了應用程序所提供的設施數據庫管理軟件。

這一切都工作得非常精美,DAO /訪問,但我在努力尋找如何使用SQL Express的做到這一點。數據庫似乎在特定於用戶的位置變得鬆動,數據庫創建和更新看起來似乎只能通過程序代碼來完成。

我碰到一些參考「Xcopy部署」,看起來像它可能是有前途的,但似乎是那些聽起來很像是不是共享的東西「用戶實例」的引用。我很感謝來自任何人的建議。

回答

2

這聽起來像你對我還沒有完全吸收Jet數據庫引擎(ACE /噴氣機)和SQL Server之間的根本區別:

當用戶啓動您的應用程序訪問它連接到訪問數據庫引擎已安裝在他們的機器上。他們的ACE/Jet副本在網絡文件夾中打開共享數據庫文件(.accdb或.mdb)。 ACE/Jet的各種實例一起工作來管理併發更新,記錄鎖定等等。這有時稱爲「點對點」或「共享文件」數據庫體系結構。

與使用SQL Server後端的應用程序,你的每一個用戶的計算機上的應用程序的副本在網絡上的SQL Server 相同實例連接(這就是爲什麼它被稱爲「SQL 服務器」) ,並且該SQL Server實例代表所有客戶端操作數據庫(存儲在其本地硬盤上)。這被稱爲「客戶端 - 服務器」或「基於服務器」的數據庫體系結構。

請注意,對於多用戶數據庫您在客戶機上安裝SQL 服務器,您只安裝SQL Server客戶端組件(OLEDB和ODBC驅動程序)。 SQL Server本身只安裝在一個地方:將充當SQL ...服務器的機器。

重:「數據庫的創建和更新,充其量似乎也尷尬的程序代碼做單」 - 完全不是,它只是「不同」。再次,您將所有命令傳遞給SQL Server,並且它會負責創建實際的數據庫文件。例如,一旦你連接到SQL Server,如果你告訴它

CREATE DATABASE NewDatabase 

任何本地文件夾是用來存儲這樣的事情,這通常是一些將在數據庫中創建文件(NewDatabase.mdfNewDatabase_log.LDF)像

C:\ Program Files文件\ Microsoft SQL Server的\ MSSQL10_50.SQLEXPRESS \ MSSQL \ DATA

在服務器計算機上。

請注意,您的應用程序從來沒有直接訪問這些文件。事實上,它幾乎可以肯定不能這樣做,實際上你的應用程序甚至不會保護這些文件駐留在哪裏或它們被稱爲什麼。您的應用程序只需與SQL Server進行通信(例如ServerName\SQLEXPRESS),服務器負責處理細節。

+0

謝謝戈登。我瞭解服務器,但是我一直在閱讀的關於SQL Server Express處理本地文件的文章似乎暗示每個用戶都有自己的實例,這些實例將存儲在用戶特定的位置。你的回答已經證明對我很好。我將構建一個小測試應用程序來創建和填充數據庫並從中取出。再次感謝。 – Barbarian

0

這個答案是太長了降權......但到微軟頁面,在那裏,他們解釋如何使它:http://office.microsoft.com/en-us/access-help/move-access-data-to-a-sql-server-database-by-using-the-upsizing-wizard-HA010275537.aspx

我希望這可以幫助您!

+0

有趣的文章和一些有用的信息,但我特別不想使用像奇才這樣的UI工具。所有這些都必須在沒有最終用戶干預的情況下完成,因此我必須編寫代碼來創建新數據庫,然後將數據從訪問表複製到SQL表中。這應該不會太困難,因爲我可以在轉換程序中使用DAO和ADO.NET的組合。 – Barbarian

1

只是爲了更新我的進度。受到這裏和本文代碼項目的建議的啓發: http://www.codeproject.com/Articles/63147/Handling-database-connections-more-easily, 我爲ADO.NET方法創建了一個包裝,它看起來與我熟悉的DAO相似。

我有一個類可以像DAO數據庫一樣使用。它將ExecuteReader,ExecuteNonQuery等ADO方法封裝爲可接受SQL參數的重載。這使我可以直接用讀取器替換DAO記錄集,用ExecuteReader將OpenRecordset和用ExecuteNonQuery執行。

每個方法從其父類實例獲取並釋放連接。這些依次根據交易狀態(如果有的話)根據需要打開或關閉底層連接。因此,對於作爲事務一部分的方法調用而言,連接保持開放,但對於單個調用立即關閉。

這大大簡化了我的程序的遷移,因爲許多驢子工作可以通過簡單的「查找和替換」來完成。剩下的問題則相對容易找到和理清。

再次感謝Gord和Maxwell的建議。

相關問題