NuGet程序包安裝SQLite后完全抽離出SQLite之入門介紹及注意事項,你真的懂了嗎?


前言

近幾天的幾篇文章講的內容非前面內容如系列的講解,這幾天文章都是我在項目中遇到的問題以及重新學習的知識,所以和大家分享一下,關於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而需要注意的地方,而非這種情況請另尋他法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM