標籤:
今天花了一天的時間研究了一下SQLite,以取代一些輕量級項目中使用的Access資料庫。原因一方面是想嘗試一下這個收到追捧的輕量級檔案資料庫,另一方面是想使用對象關係映射(ORM),SQLite的支援比Access更好一些。
先做了Demo,做了簡單的select操作,不過根據經驗,.Net應用程式在部署時總會遇到這個那個的問題,果然部署到伺服器上時,出現了一系列的問題。至於SQLite如何使用,不在本文的討論範圍內。
我們本次討論的是在本機開發和調試全部完成後,部署到伺服器上(Windows Server 2008 R2)時的時候出現的問題。
SQLite應用的部署步驟和普通應用是一樣的(本應該是如此,否則如何輕便呢?),但可能會遇到一系列的問題,以下問題都是我在部署時親身經曆的問題,測試用伺服器是一台全新部署的Windows Server 2008 R2。
1、命名空間“System.Data”中不存在類型或命名空間名稱“SQLite”(是否缺少程式集引用?)
請檢查是否把System.Data.SQLite.dll放到了bin目錄下。本機因為添加了SQLite安裝目錄下的dll引用因此可以正常調試。> SQLite.NET下載頁面
2、未能負載檔案或程式集“System.Data.SQLite.Linq”或它的某一個依賴項。產生此程式集的運行時比當前載入的運行時新,無法載入此程式集。
以上問題是由於伺服器未安裝.Net Framework 4.0(或許應用程式集區選擇了低版本也會出現,未經測試) ,而.Net Framework版本也是比較重要的細節,可以發現在下載SQLite.NET時候,分的比較嚴格,for .Net Framework 3.5SP1和4.0是分開的,因此必須選用和目標框架版本一致的版本。安裝完.Net 4.0後,記得切換IIS中應用程式集區的版本。
3、未能負載檔案或程式集“System.Data.SQLite.dll”或它的某一個依賴項。找不到指定的模組。
該問題出現的原因是沒有安裝Microsoft Visual C++ 2010 SP1 Redistributable Package (x64)(當然如果你不是64位系統請安裝for x86)。
4、Attempt to write a read-only database
請檢查資料庫所在目錄的許可權,加入IIS_IUSRS組的完全控制許可權(理論上寫入即可)。網上查到說添加Users組,事實上正確的做法是添加IIS_IUSRS組,這個才是IIS背景工作處理序所使用的組,應該與Users是子集的關係,所以使用IIS_IUSRS肯定會更安全一些。
5、未能負載檔案或程式集“System.Data.SQLite”或它的某一個依賴項。試圖載入格式不正確的程式。
這個問題長的和第3個問題很像,只是離勝利更進一步了。產生這個問題的原因是使用了錯誤版本的System.Data.SQLite.dll,即在x64的伺服器上使用了x86的dll(反之亦然),這個問題倒是有2個解決方案。第一個也是我所推薦的,使用正確版本的dll;第二個方法是在IIS應用程式集區的進階設定中,“啟用32位應用程式”一項設定為True。可能你再這麼做之後,又回到了第三個問題,別擔心,x86 Visual C++ Runtime裝上了就好了。
注意:如果選擇了啟用32位應用程式,那麼就只能使用32位的dll,一個應用程式集區中是不能32位和64位混用的。
6、沒有報任何錯,但是訪問SQLite的速度很慢,哪怕是簡單的Select操作。
測試資料是只有2個欄位,10條資料的SQLite3資料庫。很明顯這不是應有的表現,經過一系列的測試和排查,發現該問題是由於目錄許可權造成的。當你只進行查詢之類的唯讀操作時,是不會報錯的。解決方案參照以上第4條即可。
至於產生的原因,看到網上說SQLite在操作時是需要建立臨時檔案的,可能是許可權受限後出現了些許問題了吧。
以上6個問題是我部署時遇到的問題,一步步循序漸進,最終贏得了勝利。更加深入的問題後續遇到了繼續補充吧。相信很多人都會遇到相同的問題,也相信這篇文章能夠解決大部分人的問題。
我也是新人,我的職業也不是程式員,如有不足指出,希望高人指教,謝謝。
IIS64位相容32位Sqlite設定方法