C#操作SQLite方法實例詳解
本文實例講述了C#操作SQLite方法。分享給大家供大家參考。具體分析如下:
地址:
System.Data.Sqlite入手。。。
首先import/using:
Connection和Command:
private SQLiteConnection conn; private SQLiteCommand cmd;
連接db:
conn = new SQLiteConnection("Data Source=c:\\test.db"); conn.Open();
INSERT/UPDATE:
cmd = conn.CreateCommand(); cmd.CommandText = "INSERT INTO user(email,name) VALUES ('email','name')"; cmd.ExecuteNonQuery(); cmd.CommandText = "UPDATE userSET name = 'Codelicious' WHERE ID = 1"; cmd.ExecuteNonQuery();
SELECT:
cmd.CommandText = "SELECT ID, name FROM user"; SQLiteDataReader reader = cmd.ExecuteReader(); if (reader.HasRows) { while (reader.Read()) { Console.WriteLine("ID: " + reader.GetInt16(0)); Console.WriteLine("name: " + reader.GetString(1)); } }
模板程序:
using System; using System.Data; using System.Data.Common; using System.Data.SQLite; namespace SQLiteQueryBrowser { /// <summary> /// 說明:這是一個針對System.Data.SQLite的數(shù)據(jù)庫常規(guī)操作封裝的通用類。 /// </summary> public class SQLiteDBHelper { private string connectionString = string.Empty; /// <summary> /// 構(gòu)造函數(shù) /// </summary> /// <param name="dbPath">SQLite數(shù)據(jù)庫文件路徑</param> public SQLiteDBHelper(string dbPath) { this.connectionString = "Data Source=" + dbPath; } /// <summary> /// 創(chuàng)建SQLite數(shù)據(jù)庫文件 /// </summary> /// <param name="dbPath">要創(chuàng)建的SQLite數(shù)據(jù)庫文件路徑</param> public static void CreateDB(string dbPath) { using (SQLiteConnection connection = new SQLiteConnection("Data Source=" + dbPath)) { connection.Open(); using (SQLiteCommand command = new SQLiteCommand(connection)) { command.CommandText = "CREATE TABLE Demo(id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE)"; command.ExecuteNonQuery(); command.CommandText = "DROP TABLE Demo"; command.ExecuteNonQuery(); } } } /// <summary> /// 對SQLite數(shù)據(jù)庫執(zhí)行增刪改操作,返回受影響的行數(shù)。 /// </summary> /// <param name="sql">要執(zhí)行的增刪改的SQL語句</param> /// <param name="parameters">執(zhí)行增刪改語句所需要的參數(shù),參數(shù)必須以它們在SQL語句中的順序為準</param> /// <returns></returns> public int ExecuteNonQuery(string sql, SQLiteParameter[] parameters) { int affectedRows = 0; using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { connection.Open(); using (DbTransaction transaction = connection.BeginTransaction()) { using (SQLiteCommand command = new SQLiteCommand(connection)) { command.CommandText = sql; if (parameters != null) { command.Parameters.AddRange(parameters); } affectedRows = command.ExecuteNonQuery(); } transaction.Commit(); } } return affectedRows; } /// <summary> /// 執(zhí)行一個查詢語句,返回一個關聯(lián)的SQLiteDataReader實例 /// </summary> /// <param name="sql">要執(zhí)行的查詢語句</param> /// <param name="parameters">執(zhí)行SQL查詢語句所需要的參數(shù),參數(shù)必須以它們在SQL語句中的順序為準</param> /// <returns></returns> public SQLiteDataReader ExecuteReader(string sql, SQLiteParameter[] parameters) { SQLiteConnection connection = new SQLiteConnection(connectionString); SQLiteCommand command = new SQLiteCommand(sql, connection); if (parameters != null) { command.Parameters.AddRange(parameters); } connection.Open(); return command.ExecuteReader(CommandBehavior.CloseConnection); } /// <summary> /// 執(zhí)行一個查詢語句,返回一個包含查詢結(jié)果的DataTable /// </summary> /// <param name="sql">要執(zhí)行的查詢語句</param> /// <param name="parameters">執(zhí)行SQL查詢語句所需要的參數(shù),參數(shù)必須以它們在SQL語句中的順序為準</param> /// <returns></returns> public DataTable ExecuteDataTable(string sql, SQLiteParameter[] parameters) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { using (SQLiteCommand command = new SQLiteCommand(sql, connection)) { if (parameters != null) { command.Parameters.AddRange(parameters); } SQLiteDataAdapter adapter = new SQLiteDataAdapter(command); DataTable data = new DataTable(); adapter.Fill(data); return data; } } } /// <summary> /// 執(zhí)行一個查詢語句,返回查詢結(jié)果的第一行第一列 /// </summary> /// <param name="sql">要執(zhí)行的查詢語句</param> /// <param name="parameters">執(zhí)行SQL查詢語句所需要的參數(shù),參數(shù)必須以它們在SQL語句中的順序為準</param> /// <returns></returns> public Object ExecuteScalar(string sql, SQLiteParameter[] parameters) { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { using (SQLiteCommand command = new SQLiteCommand(sql, connection)) { if (parameters != null) { command.Parameters.AddRange(parameters); } SQLiteDataAdapter adapter = new SQLiteDataAdapter(command); DataTable data = new DataTable(); adapter.Fill(data); return data; } } } /// <summary> /// 查詢數(shù)據(jù)庫中的所有數(shù)據(jù)類型信息 /// </summary> /// <returns></returns> public DataTable GetSchema() { using (SQLiteConnection connection = new SQLiteConnection(connectionString)) { connection.Open(); DataTable data=connection.GetSchema("TABLES"); connection.Close(); //foreach (DataColumn column in data.Columns) //{ // Console.WriteLine(column.ColumnName); //} return data; } } } }
完整的程序例子:
using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.Common; using System.Data.SQLite; using SQLiteQueryBrowser; namespace SQLiteDemo { class Program { static void Main(string[] args) { //CreateTable(); //InsertData(); ShowData(); Console.ReadLine(); } public static void CreateTable() { string dbPath = "D:\\Demo.db3"; //如果不存在改數(shù)據(jù)庫文件,則創(chuàng)建該數(shù)據(jù)庫文件 if (!System.IO.File.Exists(dbPath)) { SQLiteDBHelper.CreateDB("D:\\Demo.db3"); } SQLiteDBHelper db = new SQLiteDBHelper("D:\\Demo.db3"); string sql = "CREATE TABLE Test3(id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,Name char(3),TypeName varchar(50),addDate datetime,UpdateTime Date,Time time,Comments blob)"; db.ExecuteNonQuery(sql, null); } public static void InsertData() { string sql = "INSERT INTO Test3(Name,TypeName,addDate,UpdateTime,Time,Comments)values(@Name,@TypeName,@addDate,@UpdateTime,@Time,@Comments)"; SQLiteDBHelper db = new SQLiteDBHelper("D:\\Demo.db3"); for (char c = "A"; c <= "Z"; c++) { for (int i = 0; i < 100; i++) { SQLiteParameter[] parameters = new SQLiteParameter[]{ new SQLiteParameter("@Name",c+i.ToString()), new SQLiteParameter("@TypeName",c.ToString()), new SQLiteParameter("@addDate",DateTime.Now), new SQLiteParameter("@UpdateTime",DateTime.Now.Date), new SQLiteParameter("@Time",DateTime.Now.ToShortTimeString()), new SQLiteParameter("@Comments","Just a Test"+i) }; db.ExecuteNonQuery(sql, parameters); } } } public static void ShowData() { //查詢從50條起的20條記錄 string sql = "select * from test3 order by id desc limit 50 offset 20"; SQLiteDBHelper db = new SQLiteDBHelper("D:\\Demo.db3"); using (SQLiteDataReader reader = db.ExecuteReader(sql, null)) { while (reader.Read()) { Console.WriteLine("ID:{0},TypeName{1}", reader.GetInt64(0), reader.GetString(1)); } } } } }
在實際情況中,采用通用類大批量插入數(shù)據(jù)會有些慢,這是因為在System.Data.SQLite中的操作如果沒有指定操作,則會被當做一個事物,如果需要一次性寫入大量記錄,則建議顯式創(chuàng)建一個事物,在這個事務中完成所有的操作比較好,這樣的話比每次操作創(chuàng)建一個事物的效率要提升很多。
最終利用VS2008提供的功能,可以看到里面的數(shù)據(jù)如下:
需要說明的是在System.Data.SQLite中數(shù)據(jù)類型的規(guī)定不適很嚴格,從創(chuàng)建Test3表的SQL語句來看,表中addDate、UpdateTime、Time分別是DateTime、Date、Time類型字段,但實際上我們插入的時候沒有按照這個規(guī)定,最終顯示的結(jié)果也是盡量遵循數(shù)據(jù)庫字段的定義。
總結(jié)
System.Data.SQLite確實是一個非常小巧精悍的數(shù)據(jù)庫,作為對SQLite的封裝(SQLite可以在Android等類型的手機上利用Java訪問),它依然是體較小,同比性能高、內(nèi)存消耗小、無需安裝僅需一個dll就可以運行的優(yōu)點(如果在Mobile手機上則需要兩個文件),唯一的一個缺點是沒有比較的GUI(圖形用戶界面),不過正因為如此它才得以體積小。
在實際開發(fā)中沒有圖形用戶界面可能有些不便,我們可以使用VS來查看和操作數(shù)據(jù),我自己也做了一個小東東,便于管理和維護數(shù)據(jù),界面如下:
如果你要開發(fā)數(shù)據(jù)量在10萬條以下的應用,我建議你嘗試使用一下System.Data.SQLite,它或許是一個不錯的選擇。
public static void CreateTable() { string dbPath = "D:\\Demo.db3"; //如果不存在改數(shù)據(jù)庫文件,則創(chuàng)建該數(shù)據(jù)庫文件 if (!System.IO.File.Exists(dbPath)) { SQLiteDBHelper.CreateDB("D:\\Demo.db3"); } SQLiteDBHelper db = new SQLiteDBHelper("D:\\Demo.db3"); string sql = "CREATE TABLE Test3(id integer NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,Name char(3),TypeName varchar(50),addDate datetime,UpdateTime Date,Time time,Comments blob)"; db.ExecuteNonQuery(sql, null); } public static void InsertData() { string sql = "INSERT INTO Test3(Name,TypeName,addDate,UpdateTime,Time,Comments)values(@Name,@TypeName,@addDate,@UpdateTime,@Time,@Comments)"; SQLiteDBHelper db = new SQLiteDBHelper("D:\\Demo.db3"); for (char c = "A"; c <= "Z"; c++) { for (int i = 0; i < 100; i++) { SQLiteParameter[] parameters = new SQLiteParameter[]{ new SQLiteParameter("@Name",c+i.ToString()), new SQLiteParameter("@TypeName",c.ToString()), new SQLiteParameter("@addDate",DateTime.Now), new SQLiteParameter("@UpdateTime",DateTime.Now.Date), new SQLiteParameter("@Time",DateTime.Now.ToShortTimeString()), new SQLiteParameter("@Comments","Just a Test"+i) }; db.ExecuteNonQuery(sql, parameters); } } } public static void ShowData() { //查詢從50條起的20條記錄 string sql = "select * from test3 order by id desc limit 50 offset 20"; SQLiteDBHelper db = new SQLiteDBHelper("D:\\Demo.db3"); using (SQLiteDataReader reader = db.ExecuteReader(sql, null)) { while (reader.Read()) { Console.WriteLine("ID:{0},TypeName{1}", reader.GetInt64(0), reader.GetString(1)); } } }
希望本文所述對大家的C#程序設計有所幫助。
- C#中使用SQLite數(shù)據(jù)庫的方法介紹
- C#簡單訪問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實現(xiàn)數(shù)據(jù)的增刪改查
- C#操作SQLite數(shù)據(jù)庫方法小結(jié)
- C#調(diào)用SQLite的詳細代碼舉例
相關文章
Winform中GridView分組排序功能實現(xiàn)方法
這篇文章主要介紹了Winform中GridView分組排序功能實現(xiàn)方法,以實例形式詳細說明了分組排序的實現(xiàn)方法,并附帶完整的DBHelp類代碼,是非常實用的技巧,需要的朋友可以參考下2014-11-11DevExpress實現(xiàn)為TextEdit設置水印文字的方法
這篇文章主要介紹了DevExpress實現(xiàn)為TextEdit設置水印文字的方法,對C#程序設計人員來說是一個很實用的技巧,需要的朋友可以參考下2014-08-08C#基于HttpWebRequest實現(xiàn)發(fā)送HTTP請求的方法分析
這篇文章主要介紹了C#基于HttpWebRequest實現(xiàn)發(fā)送HTTP請求的方法,結(jié)合實例形式分析了C#使用HttpWebRequest類與System.IO類實現(xiàn)發(fā)送HTTP請求相關操作技巧與注意事項,需要的朋友可以參考下2019-02-02C#中Equals和GetHashCode使用及區(qū)別
這篇文章主要介紹了C#中Equals和GetHashCode使用及區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02C#打印類PrintDocument、PrintDialog、PrintPreviewDialog使用示例
這篇文章主要介紹了C#打印類PrintDocument、PrintDialog、PrintPreviewDialog使用示例,本文分別給出了示例代碼,需要的朋友可以參考下2015-06-06C#數(shù)據(jù)結(jié)構(gòu)之最小堆的實現(xiàn)方法
這篇文章主要給大家介紹了關于C#數(shù)據(jù)結(jié)構(gòu)之最小堆的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02