最近接手了一個WPF項目,資料庫使用的MySQL,為了簡化生產環境部署流程,果斷選擇遷移到SQLite,由於原項目未使用ORM框架,導致很多SQL語法也得改。 SQLite基礎語法請參考該頁面 1.依賴包的更改 有兩個Nuget包可選: Microsoft.Data.Sqlite.Core / Sy ...
最近接手了一個WPF項目,資料庫使用的MySQL,為了簡化生產環境部署流程,果斷選擇遷移到SQLite,由於原項目未使用ORM框架,導致很多SQL語法也得改。
SQLite基礎語法請參考該頁面
1.依賴包的更改
有兩個Nuget包可選: Microsoft.Data.Sqlite.Core / System.Data.SQLite,我都安裝試了下,除了類型大小寫不一致之外,功能幾乎一樣,由於老項目是.Net Framework 4.x,穩妥起見還是使用了後者,至於各種引用類型的更改,幾乎只需要將MySql開頭的類型名全局替換成SQLite的則可(記得刪掉MySQL的引用,確保只調用了SQLite相關類庫)
2.資料庫連接
SQLite本身是一個基於文件的資料庫系統,每個資料庫就是一個文件,若文件不存在它會自動創建,下麵的示例代碼就是建立與運行目錄下test.sqlite文件的連接
private const string connStr = "Data Source = {0}";
...
string dbName = "test.sqlite"; SQLiteConnection Connection = new SQLiteConnection(string.Format(connStr, dbName));
Connection.Open();
3.資料庫切換
雖然SQLiteConnection也提供了ChangeDatabase方法,但是不管用 o(╥﹏╥)o 得先手動釋放原來的連接資源,再建立新的連接
Connection?.Dispose(); Connection = new SQLiteConnection(string.Format(connStr, dbName)); Connection.Open();
4.建表差異
編碼集和數據引擎的部分肯定是不能要了,主鍵要將關鍵字放到對應欄位後面,自增則是去掉下劃線(大小寫依然不敏感),但是有一個需要註意的地方是:自增欄位得用integer,用int也行,但它不會自增
private const string SQL_CreateTable = @" create table if not exists `TestTable` ( id int not null auto_increment, name varchar(64) not null, primary key(id),
unique key(name) ) collate='utf8_general_ci' engine=InnoDB;";
//上面是MySQL建表語句
//下麵是SQLite建表語句
private const string SQL_CreateTable = @" create table if not exists `TestTable` ( id integer PRIMARY KEY AUTOINCREMENT NOT NULL, name varchar(64) not null );";
5.刪表差異 - truncate 語句
SQLite不支持 truncate ,清空一張表需要先delete,然後再去sqlite_sequence表裡刪除對應表名的自增鍵
new SQLiteCommand(@"delete from tablename;", Connection).ExecuteNonQuery();
new SQLiteCommand(@"DELETE FROM sqlite_sequence WHERE name = 'tablename';", Connection).ExecuteNonQuery();
6.數據類型差異
MySqlDbType要更改為DbType,後者位於System.Data命名空間下,具體對照關係參考這個鏈接,圖中的Key值為MySqlDbType類型,Value為對應的DbType類型
7.邏輯操作符差異 -- &&符號
若不是接手這個項目,我都不知道MySQL居然能用 && 操作符,SQLite當然是不支持的,得改成 and 關鍵字
8.待補充,以後遇到其他問題再補充
翻譯
搜索
複製