之所以要做這個筆記,是因為在.NET中使用System.Data.SQLite的時候,遇到了些問題,這些問題是相對於引用其他dll沒有遇到過的,所以作個筆記,記錄一下。
簡單起見,首先建立一個控制台項目,這肯定是.NET4.5以上的版本了,我用的是vs2017,其他版本的vs在引用System.Data.SQLite的時候有沒有問題,這個就不得而知了。
首先還是按照以往使用第三方dll文件(指是在引用管理器中搜索不到的dll)的思路,在項目文件夾下面建立一個文件夾dll,將System.Data.SQLite.dll放進去(前提是保證下載的dll是正確的版本),然后
在項目中添加這個dll的引用。然后在項目的main函數中粘貼以下代碼,這里只是為了能正常使用SQLite,所以代碼設計的比較簡單,當然代碼也是網上找的
SQLiteConnection conn = null; string dbPath = "Data Source =" + Environment.CurrentDirectory + "/test.db"; conn = new SQLiteConnection(dbPath);//創建數據庫實例,指定文件位置 conn.Open();//打開數據庫,若文件不存在會自動創建 string sql = "CREATE TABLE IF NOT EXISTS student(id integer, name varchar(20), sex varchar(2));";//建表語句 SQLiteCommand cmdCreateTable = new SQLiteCommand(sql, conn); cmdCreateTable.ExecuteNonQuery();//如果表不存在,創建數據表 SQLiteCommand cmdInsert = new SQLiteCommand(conn); cmdInsert.CommandText = "INSERT INTO student VALUES(1, '小紅', '男')";//插入幾條數據 cmdInsert.ExecuteNonQuery(); cmdInsert.CommandText = "INSERT INTO student VALUES(2, '小李', '女')"; cmdInsert.ExecuteNonQuery(); cmdInsert.CommandText = "INSERT INTO student VALUES(3, '小明', '男')"; cmdInsert.ExecuteNonQuery(); conn.Close();
然后開始跑程序,出現了第一個問題:異常來自 HRESULT:0x8007000B
網上搜索了一下解決方案,都說的是將項目屬性里面的生成里面的平台目標改成x86或x64。再啰嗦一句,我的電腦系統是Windows server 2012 r2 標准版,妥妥的64位操作系統。
這里我選擇的是x86,然后繼續跑程序,結果還是出現剛才的問題。然后選擇x64,跑程序。好了,這回出現新問題了:異常來自 HRESULT:0x8007007E
根據提示,說是沒有SQLite.Interop.dll文件,於是將這個文件復制到剛才建立的dll文件夾中,並引進項目,結果又出問題了。不就是引用個第三方的dll文件嗎,有必要出現那么多問題嗎,內心已經很崩潰。
這個問題,我確實沒辦法了,網上也找不到合適的解決方案(主要是有些解決辦法太麻煩,看都懶得看了)。怎么辦呢,遇到問題總要解決吧,作為一個專業的程序員,碼農,遇到問題必須有探索的精神,
不能指望領導,不能指望同事,想想自己還沒賺到足夠的錢,娶到白富美,走上人生的巔峰,想想家里的父母.......開始胡思亂想了。想着想着,無意中打開了項目的bin文件夾里面的Debug文件夾,哎喲我
去,發現了新大陸了,這個dll怎么出現在這里,我明明是放在dll文件夾里面的。再想到剛才的錯誤不是說沒有SQLite.Interop.dll文件嗎,那我把SQLite.Interop.dll文件也放到這里看看
再跑程序,哎喲我去,奇跡出現了,程序跑起來了,成功了,debug文件夾下,出現了test.db文件了,這不就是夢中情人白富美嗎,總算出現了。
為了驗證一下是否真的把數據寫進去了,我簡單些了個查詢函數看了一下,果然沒問題
總結:1、下載正確版本的SQLite,主要是32位還是64位
2、將SQLite.Interop.dll和System.Data.SQLite.dll放到bin文件夾的debug文件夾下,然后只需引用System.Data.SQLite.dll就好
3、將項目屬性里面的生成里面的平台目標改成x64,當然這是因為我電腦是64位的,如果是32位電腦也許不用這步操作了。
一般來說,這樣的對數據庫的操作的代碼,都是寫在類庫里面的,這里就有個地方需要注意了,在編寫對SQLite使用的類庫的時候,在類庫中只需引用System.Data.SQLite.dll,文件放在什么地方無所謂,
只要能引用就行,然后編譯通過后,在引用這個類庫的項目里面,記得將SQLite.Interop.dll放到bin文件夾下面的debug文件夾,而且引用的項目的屬性里面的平台目標記得改成x64。而類庫沒有這個要求。