標籤:
前言
近幾天的幾篇文章講的內容非前面內容如系列的講解,這幾天文章都是我在項目中遇到的問題以及重新學習的知識,所以和大家分享一下,關於SQLite的文章多如牛毛,但是有些大多已經過時,為什麼說過時,之前都是在SQLite官網中下載dll或者exe來實現,現如今我們可以直接安裝SQLite程式包,又方便了我們,同時作者對於SQLite也沒用過,這也是項目需要才去學習SQLite的使用,歡迎和大家一起探討。
安裝SQLite
通過NUGet來安裝SQlite程式包,如下:
此時自然而然在包中會有如下SQLite、SQLiteCore、SQLiteEF等程式集
接著就是寫我們的SQLite語句了,簡直是so easy!在學習當中我們可以這樣玩玩,僅僅是玩玩而已,在實際項目中,難道我們把這些程式集就直接扔在pacakages中嗎,肯定不是這樣,我們僅僅只需要其中的程式集即可。關於使用SQLite必須要用【 System.Data.SQLite.dll 】和【 SQLite.Interop.dll 】就不再敘述了,其他EF和Linq的程式集都是為了配合EF而用,我們根據項目情況而定可要可不要,這裡我們沒有添加。我們刪除了包中這幾個程式集同時為了防止重建解決方案時NuGet在包配置 【packages.config】 檢測到缺少而重新安裝,我們在包配置中將這幾個進行刪除。此時我們再來產生解決方案則出錯如下:
根據經驗來看,一般來說如果是對項目進行命名或者進行其他修改產生解決方案而出錯,八九不離十是對其修改的內容修改成功但是在項目中以副檔名為【 csproj 】的項目主檔案未進行對應的修改而造成,我們去找找看。
我們看到當產生解決方案時會重新載入該檔案,該檔案會匯入SQLite但是此時我們已經刪除則會出現下面的錯誤,此時我們將其匯入和錯誤內容進行刪除即可產生解決方案成功。我們將程式集進行如下放置:
(1)非空MVC項目
我們來寫一個向SQLite資料庫中插入的語句,我們準備好插入的SQLite語句:
/// <summary> /// 對SQLite資料庫執行增刪改操作,返回受影響的行數。 /// </summary> /// <param name="sql">要執行的增刪改的SQL語句</param> /// <param name="parameters">執行增刪改語句所需要的參數,參數必須以它們在SQL語句中的順序為準</param> /// <returns></returns> public static int ExecuteNonQuery(string sql) { int affectedRows = 0; if (IsDBInitialized()) { try { using (SQLiteConnection connection = new SQLiteConnection(s_ConnectionString)) { connection.Open(); using (DbTransaction transaction = connection.BeginTransaction()) { using (SQLiteCommand command = new SQLiteCommand(connection)) { command.CommandText = sql; affectedRows = command.ExecuteNonQuery(); } transaction.Commit(); } } } catch (Exception ex) { } } return affectedRows; }
我們給出插入測試語句:
SQLiteHelper.ExecuteNonQuery("insert into Test(Id,TestValue) values(1,2)");
我們來看看示範結果:
結果如我們所期望那樣,請記住這樣示範的前提是我們建立的項目是【非空MVC項目即基礎MVC項目】,同時將【SQLite.Interop.dll】和【System.Data.SQLite.dll】程式集放在同一檔案夾中同樣好使。
(2)空MVC項目且SQLite位於同一項目中
此時我們來示範第二種情況,我們建立一個空的MVC項目將上述兩個SQLite程式集放在同一檔案夾下我們來插入資料試試。
結果出現如下錯誤:
此時我們將【SQLite.Interop.dll】放在x86或者x64檔案夾中根據自身作業系統來取這個程式集。看下示範結果:
此時如上存放【SQLite.Interop.dll】程式集則成功,我們再來看看能否將x64或者x86取名為任何其他名字:
如上我們將存放【SQLite.Interop.dll】程式集的名字修改為test此時則依然出錯找不到進入點。從這裡可以看出存放【SQLite.Interop.dll】組件檔夾名字要麼是x86或者x64。好了,到了這裡是不是就完了呢,還沒有,我們一直示範的是將SQLite放在一個項目中,要是將其作為另外的一個項目又是怎樣的情況呢?我們來看看。
(3)空MVC項目但SQLite位於另外一個項目中
關於將【SQLite.Interop.dll】和【System.Data.SQLite.dll】放在同一檔案夾中則不再示範,很明顯在同一項目中都不好使,何況是在另外一個項目中呢,我們來看看放在另外一個項目中的結構:
如上我們和上述空MVC項目正確情況一樣放置,我們來看看結果:
令我們大跌眼鏡,將SQLite單獨放在一個項目中則出錯了,此時我們將【SQLite.Interop.dll】程式集屬性【複製到輸出目錄】設定為【始終複製】看看,我們再來看看示範結果:
好了到了這裡才完全結束,這幾種情況你懵逼了還是弄懂了。
總結
(1)關於建立非空MVC項目在裡面建立SQLite你愛怎麼玩就怎麼玩,不過是學習而已,猜測大概是MVC內建做了處理。
(2)關於建立空MVC項目在裡面建立SQLite,不能將【SQLite.Interop.dll】和【System.Data.SQLite.dll】放在同一檔案夾中,需要將【SQLite.Interop.dll】程式集放在x86或者x64檔案夾中且檔案夾名字不能更改。
(3)關於建立的空MVC項目但將SQLite單獨建立成一個項目時,將【SQLite.Interop.dll】和【System.Data.SQLite.dll】不能放在同一檔案夾,需要將【SQLite.Interop.dll】放在x86或者x64檔案夾中且檔案夾名字不能更改的同時需要將【SQLite.Interop.dll】的屬性【複製到輸出目錄】設定為【始終複製】。
以上的種種注意都是通過NuGet安裝的最新SQLite而需要注意的地方,而非這種情況請另尋他法。
NuGet程式包安裝SQLite後完全抽離出SQLite之入門介紹及注意事項,你真的懂了嗎?