C#中使用SQLite數(shù)據(jù)庫的方法介紹
推薦以下2款:
Navicat for SQLite:功能非常強(qiáng)大,幾乎包含了數(shù)據(jù)庫管理工具的所有必需功能,操作簡(jiǎn)單,容易上手。唯一的缺點(diǎn)是不能打開由System.Data.SQLite.dll加密過的數(shù)據(jù)庫。
Database.Net:臺(tái)灣人用.net開發(fā)的全能數(shù)據(jù)庫管理工具,可以管理多種數(shù)據(jù)庫,包括MSSQL、MYSQL、IBM DB2、Oracle、Access、Excel、OleDb、Odbc等十多種數(shù)據(jù)庫(或數(shù)據(jù)接口),功能沒有Navicat那么多,只包含最基本功能。對(duì)SQLite而言,Database.Net最大的優(yōu)點(diǎn)是支持打開由System.Data.SQLite.dll加密過的數(shù)據(jù)庫,且可以隨時(shí)對(duì)數(shù)據(jù)庫設(shè)置密碼,是.net下開發(fā)SQLite必備的小工具。下載地址:http://fishcodelib.com/Database.htm 腳本之家下載地址 http://www.dbjr.com.cn/database/41238.html
建議以Navicat for SQLite為主,Database.Net為輔,只要涉及到數(shù)據(jù)庫加密時(shí)才用后者。
【操作SQLite實(shí)例】
操作SQlite的方法基本同其他數(shù)據(jù)庫相同,但有一些區(qū)別:
『例1』整數(shù)似乎都是Int64的。
查詢出網(wǎng)站App_Data目錄下“省市.db”數(shù)據(jù)庫中city表的總記錄數(shù)
SQLiteConnection cn = new SQLiteConnection("Data Source=|DataDirectory|省市.db;Version=3");
SQLiteCommand cmd = new SQLiteCommand("select count(*) from city", cn);
cn.Open();
int recordCount = (int)(Int64)cmd.ExecuteScalar();
cn.Close();
Response.Write(recordCount);
SQLite中count函數(shù)返回的是一個(gè)Int64的整數(shù),這一點(diǎn)同MSSQL、Access等不同。實(shí)際上,經(jīng)過有限的使用發(fā)現(xiàn),似乎所有INTEGER字段的返回值都是Int64,這一點(diǎn)未經(jīng)過有效證實(shí)。ExecuteScalar方法返回一個(gè)object實(shí)例,按照C#規(guī)定,拆箱時(shí)進(jìn)行標(biāo)準(zhǔn)轉(zhuǎn)換,必須轉(zhuǎn)換成該object實(shí)例實(shí)際存儲(chǔ)的格式,因此分兩步,先轉(zhuǎn)換成Int64,再轉(zhuǎn)換成int。當(dāng)然用.net中某些高級(jí)轉(zhuǎn)換器如Convert.ToInt32方法只要一步就可以了。
『例2』批量增刪改時(shí)需要用事務(wù),否則效率很低。
批量插入1000條記錄,每條記錄只有簡(jiǎn)單的id、name、password三個(gè)字段:
SQLiteConnection cn = new SQLiteConnection("Data Source=c:\\測(cè)試.db3;Version=3;password=12345");
SQLiteCommand cmd = new SQLiteCommand("select count(*) from test", cn);
cn.Open();
int recordCount = (int)(Int64)cmd.ExecuteScalar();
Response.Write("當(dāng)前的總記錄數(shù):" + recordCount + "<br/>");
for (int i = 0; i < 1000; i++)
{
cmd.CommandText = "insert into test values(@id,@name,@password)";
cmd.Parameters.AddWithValue("@id", i);
cmd.Parameters.AddWithValue("@name", "姓名" + i);
cmd.Parameters.AddWithValue("@password", (i * 2).ToString());
cmd.ExecuteNonQuery();
}
cmd.CommandText = "select count(*) from test";
recordCount = (int)(Int64)cmd.ExecuteScalar();
cn.Close();
Response.Write("當(dāng)前的總記錄數(shù):" + recordCount + "<br/>");
經(jīng)過測(cè)試,這段代碼中的for循環(huán)花費(fèi)了70000~90000毫秒,一分鐘多!
改用事務(wù)執(zhí)行:
SQLiteConnection cn = new SQLiteConnection("Data Source=c:\\測(cè)試.db3;Version=3;password=12345");
SQLiteCommand cmd = new SQLiteCommand("select count(*) from test", cn);
cn.Open();
int recordCount = (int)(Int64)cmd.ExecuteScalar();
Response.Write("當(dāng)前的總記錄數(shù):" + recordCount + "<br/>");
SQLiteTransaction tran = cn.BeginTransaction();
cmd.Transaction = tran;
try
{
for (int i = 0; i < 1000; i++)
{
cmd.CommandText = "insert into test values(@id,@name,@password)";
cmd.Parameters.AddWithValue("@id", i);
cmd.Parameters.AddWithValue("@name", "姓名" + i);
cmd.Parameters.AddWithValue("@password", (i * 2).ToString());
cmd.ExecuteNonQuery();
}
tran.Commit();
}
catch
{
tran.Rollback();
Response.Write("執(zhí)行出錯(cuò)!");
}
finally
{
cmd.CommandText = "select count(*) from test";
recordCount = (int)(Int64)cmd.ExecuteScalar();
cn.Close();
Response.Write("當(dāng)前的總記錄數(shù):" + recordCount + "<br/>");
}
經(jīng)過測(cè)試,這段代碼中的try部分只用了100~150毫秒!開啟事務(wù)后,效率非常高!
『例3』一般開發(fā)中可以編寫自己的數(shù)據(jù)庫通用操作類,進(jìn)一步封裝ADO.NET。
如上面用事務(wù)操作的代碼,改用數(shù)據(jù)庫通用操作類后:
SQLiteData md = new SQLiteData("Data Source=c:\\測(cè)試.db3;Version=3;password=12345");
int recordCount = (int)(Int64)md.ExecuteScalar("select count(*) from test");
Response.Write("當(dāng)前的總記錄數(shù):" + recordCount + "<br/>");
md.CreateTransaction();
try
{
for (int i = 0; i < 1000; i++)
md.ExecuteNonQuery("insert into test values(@id,@name,@password)", "@id", i, "@name", "姓名" + i, "@password", (i * 2).ToString());
md.CommitTransaction();
}
catch
{
md.RollBack();
Response.Write("執(zhí)行出錯(cuò)!");
}
finally
{
recordCount = (int)(Int64)md.ExecuteScalar("select count(*) from test");
md.Close();
Response.Write("當(dāng)前的總記錄數(shù):" + recordCount + "<br/>");
}
可以看到代碼精簡(jiǎn)了很多。
【SQLite相關(guān)有用的鏈接地址】
SQLite官方網(wǎng)站:http://www.sqlite.org/
SQLite內(nèi)置核心函數(shù)參考文檔:http://www.sqlite.org/lang_corefunc.html
SQLite日期時(shí)間函數(shù)參考文檔:http://www.sqlite.org/lang_datefunc.html
SQLite數(shù)學(xué)函數(shù)參考文檔:http://www.sqlite.org/lang_aggfunc.html
SQLite相關(guān)SQL語法參考文檔:http://www.sqlite.org/lang.html
System.Data.SQLite.dll數(shù)據(jù)訪問驅(qū)動(dòng)下載地址:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki
- C#操作SQLite方法實(shí)例詳解
- C#簡(jiǎn)單訪問SQLite數(shù)據(jù)庫的方法(安裝,連接,查詢等)
- C#操作SQLite數(shù)據(jù)庫方法小結(jié)(創(chuàng)建,連接,插入,查詢,刪除等)
- C#操作SQLite數(shù)據(jù)庫之讀寫數(shù)據(jù)庫的方法
- C#操作SQLite數(shù)據(jù)庫幫助類詳解
- C#連接加密的Sqlite數(shù)據(jù)庫的方法
- C#操作SQLite實(shí)現(xiàn)數(shù)據(jù)的增刪改查
- C#操作SQLite數(shù)據(jù)庫方法小結(jié)
- C#調(diào)用SQLite的詳細(xì)代碼舉例
相關(guān)文章
.NET實(shí)現(xiàn)可交互的WINDOWS服務(wù)的實(shí)例代碼
那么來看一下如何才能實(shí)現(xiàn)一個(gè)可交互的服務(wù)呢。步驟與實(shí)現(xiàn)基本的服務(wù)一樣2013-03-03asp.net 獲取目錄下的文件數(shù)和文件夾數(shù)
遍歷一個(gè)文件夾中的文件,需要用到DirectoryInfo類中的一個(gè)重要的方法GetFileSystemInfos(),此方法返回指定的是與搜索條件相匹配的文件和子目錄的強(qiáng)類型 FileSystemInfo對(duì)象的數(shù)組。2010-07-07NET Core 3.0 AutoFac內(nèi)置DI替換的新姿勢(shì)分享
這篇文章主要給大家介紹了關(guān)于NET Core 3.0 AutoFac內(nèi)置DI替換的新姿勢(shì),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用NET Core 3.0具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09用WebClient.UploadData方法上載文件數(shù)據(jù)的方法
用WebClient.UploadData方法上載文件數(shù)據(jù)的方法...2007-04-04.NET 6開發(fā)TodoList應(yīng)用引入數(shù)據(jù)存儲(chǔ)
這篇文章主要介紹了.NET 6開發(fā)TodoList應(yīng)用引入數(shù)據(jù)存儲(chǔ),本篇文章僅完成了數(shù)據(jù)存儲(chǔ)服務(wù)的配置工作,目前還沒有添加任何實(shí)體對(duì)象和數(shù)據(jù)庫表定義,所以暫時(shí)沒有可視化的驗(yàn)證,僅我們可以運(yùn)行程序看我們的配置是否成功:下面來看詳細(xì)內(nèi)容吧2021-12-12asp.net core集成kindeditor實(shí)現(xiàn)圖片上傳功能
這篇文章主要為大家詳細(xì)介紹了asp.net core集成kindeditor實(shí)現(xiàn)圖片上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11asp.net結(jié)合Ajax驗(yàn)證用戶名是否存在的代碼
關(guān)于Ajax的操作簡(jiǎn)單總結(jié),結(jié)合Ajax驗(yàn)證用戶名是否存在的代碼2010-06-06