SQL Server Compact 4.0是輕量級的內嵌式資料庫,不需要安裝成系統服務,只需引用相關DLL,載入DB檔案,用起來跟SQL Server幾乎一樣,也支援Entity Framework,很適合小量資料、少數使用者的小型應用。手邊有個Web Site專案,第一次試用了SQL CE,本機測試一切正常,部署到正式伺服器卻彈出找不到System.Data.SqlServerCe的錯誤訊息:
Could not load file or assembly 'System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' or one of its dependencies. The system cannot find the file specified.
由錯誤訊息不難看出是少了相關組件,猜想在伺服器上安裝SQL CE就可解決,但我就是想挑戰只靠複製檔案完成部署,才不愧SQL CE輕巧可攜本色。網路上找到不少文章,但資訊有些零散,MSDN雖提到私下部署及集中部署,但並沒有Web Site部署的完整攻略,加上還有些小眉角(後來在天空垃圾場撿到一篇文章,提及EF放在Class Library會導致部署失敗,懷疑就是我踩到的地雷),故整理筆記備忘。
- 複製相關檔案:
* 將C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0\Desktop\System.Data.SqlServerCe.dll 複製到~\bin
* 將C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0\Desktop\System.Data.SqlServerCe.Entity\System.Data.SqlServerCe.Entity.dll 複製到~\bin
* 將C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0\Private\x86\*
複製到~bin\x86
* 將C:\Program Files (x86)\Microsoft SQL Server Compact Edition\v4.0\Private\amd64\*複製到~bin\amd64
注意: System.Data.SqlServerCe.dll 及 System.Data.SqlServerCe.Entity.dll 要用Desktop目錄的版本而不能直接用Private目錄的版本;Private目錄下的x86與amd64內容Unmanaged程式庫記得也要一併複製到bin目錄下(所以bin下應該要有x86及amd64兩個子目錄) - 加入DbProvider設定:
伺服器未安裝SQL CE,.NET會不認得Microsoft SQL Server Compact Data Provider(癥狀為出現The specified store provider cannot be found in the configuration, or is not valid訊息),如果不想更動machine.config,在web.config加以下設定即可:
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SqlServerCe.4.0" />
<add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
</DbProviderFactories>
</system.data>
完成以上兩項設定,應該就能解除【使用Copy檔案完成SQL CE部署】成就囉~
【參考資料】