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會導致部署失敗,懷疑就是我踩到的地雷),故整理筆記備忘。

  1. 複製相關檔案:
    * 將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兩個子目錄)
  2. 加入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部署】成就囉~

【參考資料】


Comments

# by 阿吉

看到上述都已 C:\Program Files (x86)\ 為來源路徑,是否因為 Server 是 32bit 的關係,還是不管 Server 是否為 32/64 皆一樣處理方式?

# by Jeffrey

to 阿吉, SQL CE都是安裝在C:\Program Files (x86)\下,但它Unmanaged程式庫有區分32跟64兩種版本,分別放在Private下的x86及amd兩個子目錄下,把兩個子目錄都複製到bin下就能同時支援32及64。

Post a comment