幫助中心
這里有最新的使用文檔和教程
SQLite 在Windows Server 2008 R2 部署問題FAQ匯總
用了很長(zhǎng)一段時(shí)間SQLite,以取代一些輕量級(jí)項(xiàng)目中使用的Access數(shù)據(jù)庫(kù)。原因一方面是想嘗試一下這個(gè)收到追捧的輕量級(jí)文件數(shù)據(jù)庫(kù),另一方面是想使用對(duì)象關(guān)系映射(ORM),SQLite的支持比Access更好一些。
先做了Demo,做了簡(jiǎn)單的select操作,不過根據(jù)經(jīng)驗(yàn),.Net應(yīng)用程序在部署時(shí)總會(huì)遇到這個(gè)那個(gè)的問題,果然部署到服務(wù)器上時(shí),出現(xiàn)了一系列的問題。至于SQLite如何使用,不在本文的討論范圍內(nèi)。
我們本次討論的是在本機(jī)開發(fā)和調(diào)試全部完成后,部署到服務(wù)器上(Windows Server 2008 R2)時(shí)的時(shí)候出現(xiàn)的問題。
SQLite應(yīng)用的部署步驟和普通應(yīng)用是一樣的(本應(yīng)該是如此,否則如何輕便呢?),但可能會(huì)遇到一系列的問題,以下問題都是我在部署時(shí)親身經(jīng)歷的問題,測(cè)試用服務(wù)器是一臺(tái)全新部署的Windows Server 2008 R2。
1、命名空間“System.Data”中不存在類型或命名空間名稱“SQLite”(是否缺少程序集引用?)
請(qǐng)檢查是否把System.Data.SQLite.dll放到了bin目錄下。本機(jī)因?yàn)樘砑恿薙QLite安裝目錄下的dll引用因此可以正常調(diào)試。> SQLite.NET下載頁面
2、未能加載文件或程序集“System.Data.SQLite.Linq”或它的某一個(gè)依賴項(xiàng)。生成此程序集的運(yùn)行時(shí)比當(dāng)前加載的運(yùn)行時(shí)新,無法加載此程序集。
以上問題是由于服務(wù)器未安裝.Net Framework 4.0(或許應(yīng)用程序池選擇了低版本也會(huì)出現(xiàn),未經(jīng)測(cè)試) ,而.Net Framework版本也是比較重要的細(xì)節(jié),可以發(fā)現(xiàn)在下載SQLite.NET時(shí)候,分的比較嚴(yán)格,for .Net Framework 3.5SP1和4.0是分開的,因此必須選用和目標(biāo)框架版本一致的版本。安裝完.Net 4.0后,記得切換IIS中應(yīng)用程序池的版本。
3、未能加載文件或程序集“System.Data.SQLite.dll”或它的某一個(gè)依賴項(xiàng)。找不到指定的模塊。
該問題出現(xiàn)的原因是沒有安裝Microsoft Visual C++ 2010 SP1 Redistributable Package (x64)(當(dāng)然如果你不是64位系統(tǒng)請(qǐng)安裝for x86)。
4、Attempt to write a read-only database
請(qǐng)檢查數(shù)據(jù)庫(kù)所在目錄的權(quán)限,加入IIS_IUSRS組的完全控制權(quán)限(理論上寫入即可)。網(wǎng)上查到說添加Users組,事實(shí)上正確的做法是添加IIS_IUSRS組,這個(gè)才是IIS工作進(jìn)程所使用的組,應(yīng)該與Users是子集的關(guān)系,所以使用IIS_IUSRS肯定會(huì)更安全一些。
5、未能加載文件或程序集“System.Data.SQLite”或它的某一個(gè)依賴項(xiàng)。試圖加載格式不正確的程序。
這個(gè)問題長(zhǎng)的和第3個(gè)問題很像,只是離勝利更進(jìn)一步了。產(chǎn)生這個(gè)問題的原因是使用了錯(cuò)誤版本的System.Data.SQLite.dll,即在x64的服務(wù)器上使用了x86的dll(反之亦然),這個(gè)問題倒是有2個(gè)解決方法。第一個(gè)也是我所推薦的,使用正確版本的dll;第二個(gè)方法是在IIS應(yīng)用程序池的高級(jí)設(shè)置中,“啟用32位應(yīng)用程序”一項(xiàng)設(shè)置為True。可能你再這么做之后,又回到了第三個(gè)問題,別擔(dān)心,x86 Visual C++ Runtime裝上了就好了。
注意:如果選擇了啟用32位應(yīng)用程序,那么就只能使用32位的dll,一個(gè)應(yīng)用程序池中是不能32位和64位混用的。
6、沒有報(bào)任何錯(cuò),但是訪問SQLite的速度很慢,哪怕是簡(jiǎn)單的Select操作。
測(cè)試數(shù)據(jù)是只有2個(gè)字段,10條數(shù)據(jù)的SQLite3數(shù)據(jù)庫(kù)。很明顯這不是應(yīng)有的表現(xiàn),經(jīng)過一系列的測(cè)試和排查,發(fā)現(xiàn)該問題是由于目錄權(quán)限造成的。當(dāng)你只進(jìn)行查詢之類的只讀操作時(shí),是不會(huì)報(bào)錯(cuò)的。解決方法參照以上第4條即可。
至于產(chǎn)生的原因,看到網(wǎng)上說SQLite在操作時(shí)是需要?jiǎng)?chuàng)建臨時(shí)文件的,可能是權(quán)限受限后出現(xiàn)了些許問題了吧。