日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

第八节_我的日记本开发手记(8)——sqlite数据库与c#

發(fā)布時間:2024/3/7 C# 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第八节_我的日记本开发手记(8)——sqlite数据库与c# 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、SQLite介紹

(一)基本介紹

1. 數(shù)據(jù)庫(database,DB):一個以某種有組織的方式存儲的數(shù)據(jù)集合。數(shù)據(jù)庫中的數(shù)據(jù)按一定的數(shù)學(xué)模型組織、描述和存儲,具有較小的冗余,較高的數(shù)據(jù)獨立性和易擴展性,并可為各種用戶共享。
SQLite:是一個進程內(nèi)的庫,是遵守ACID的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng),實現(xiàn)了自給自足的、無服務(wù)器的、零配置的、事務(wù)性的 SQL 數(shù)據(jù)庫引擎。它的設(shè)計目標是嵌入式的,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它,它占用資源非常的低,在嵌入式設(shè)備中,可能只需要幾百K的內(nèi)存就夠了。它是一個零配置的數(shù)據(jù)庫,這意味著與其他數(shù)據(jù)庫不一樣,您不需要在系統(tǒng)中配置。
2. ACID具有:
(1) 原子性:同一個事物的2個步驟同時進行,一榮俱榮,一損俱損;一致性:一個事務(wù)操作前后狀態(tài)一致;持久性:事務(wù)結(jié)束后數(shù)據(jù)不隨外界原因?qū)е聰?shù)據(jù)丟失;隔離性:多個事務(wù)同時進行互不影響。
(2) 隔離級別:臟讀:一個事務(wù)讀取另一個事務(wù)未提交的數(shù)據(jù);
不可重復(fù)讀:在一個事務(wù)內(nèi)讀取表中的某一行數(shù)據(jù),多次讀取結(jié)果不同(這個不一定是錯誤,只是某些場合不對);虛讀:是指在一個事務(wù)內(nèi)讀取到了別的事務(wù)插入的數(shù)據(jù),導(dǎo)致前后讀取不一致(一般是行影響,多了一行)。
優(yōu)點:嵌入式,關(guān)系型數(shù)據(jù)庫(采用了關(guān)系模型來組織數(shù)據(jù)的數(shù)據(jù)庫),速度快。

(二)存儲數(shù)據(jù)類型

1. 存儲類型
SQLite將數(shù)據(jù)值的存儲劃分為以下幾種存儲類型:

存儲類描述
NULL值是一個 NULL 值。
INTEGER值是一個帶符號的整數(shù),根據(jù)值的大小存儲在 1、2、3、4、6 或 8 字節(jié)中。
REAL值是一個浮點值,存儲為 8 字節(jié)的 IEEE 浮點數(shù)字。
TEXT值是一個文本字符串,使用數(shù)據(jù)庫編碼(UTF-8、UTF-16BE 或 UTF-16LE)存儲。
BLOB值是一個 blob 數(shù)據(jù),完全根據(jù)它的輸入存儲。

2. 親和類型
SQLite支持列的親和類型概念,任何列仍然可以存儲任何類型的數(shù)據(jù),當數(shù)據(jù)插入時該字段的數(shù)據(jù)將會優(yōu)先采用親和類型作為該值的存儲方式。創(chuàng)建 SQLite3 表時可使用的各種數(shù)據(jù)類型名稱及相應(yīng)的親和類型,如下:

數(shù)據(jù)類型親和類型
INT,INTEGER,TINYINT,SMALLINT,MEDIUMINT,BIGINT,UNSIGNED BIG INT,INT2,INT8INTEGER:對于親緣類型為INTEGER的字段,其規(guī)則等同于NUMERIC,唯一差別是在執(zhí)行CAST表達式時。
CHARACTER(20),VARCHAR(255),VARYING CHARACTER(255),NCHAR(55),NATIVE CHARACTER(70),NVARCHAR(100),TEXT,CLOBTEXT:數(shù)值型數(shù)據(jù)在被插入之前,需要先被轉(zhuǎn)換為文本格式,之后再插入到目標字段中
BLOB,no datatype specifiedNONE:不做任何的轉(zhuǎn)換,直接以該數(shù)據(jù)所屬的數(shù)據(jù)類型進行存儲。
REAL,DOUBLE,DOUBLE PRECISION,FLOATREAL:其規(guī)則基本等同于NUMERIC,唯一的差別是不會將"30000.0"這樣的文本數(shù)據(jù)轉(zhuǎn)換為INTEGER存儲方式。
NUMERIC,DECIMAL(10,5),BOOLEAN,DATE,DATETIMENUMERIC 當文本數(shù)據(jù)被插入到親緣性為NUMERIC的字段中時:如果轉(zhuǎn)換操作不會導(dǎo)致數(shù)據(jù)信息丟失以及完全可逆,那么SQLite就會將該文本數(shù)據(jù)轉(zhuǎn)換為INTEGER或REAL類型的數(shù)據(jù);如果轉(zhuǎn)換失敗,SQLite仍會以TEXT方式存儲該數(shù)據(jù)。對于NULL或BLOB類型的新數(shù)據(jù),SQLite將不做任何轉(zhuǎn)換,直接以NULL或BLOB的方式存儲該數(shù)據(jù)。注:對于浮點格式的常量文本,如"30000.0",如果該值可以轉(zhuǎn)換為INTEGER同時又不會丟失數(shù)值信息,那么SQLite就會將其轉(zhuǎn)換為INTEGER的存儲方式。

二、可視化管理工具SQLiteStudio使用

對于sqlite數(shù)據(jù)庫的可視化管理工具,我推薦使用sqlitestudio,綠色單文件,體積小,功能強大,比起其它SQLite管理工具,我喜歡用這個。很方便易用,不用安裝的單個可執(zhí)行文件,支持中文。

(一)下載

首先去官網(wǎng)下載(官網(wǎng)下載地址:https://sqlitestudio.pl/),如圖1;

圖1
下載并解壓,直接運行SQLiteStudio.exe文件,界面如圖2所示。

圖2

(二)新建數(shù)據(jù)庫

單擊菜單Database->Add a database(如圖3),

圖3

彈出數(shù)據(jù)庫屬性對話框,如圖4,

圖4

單擊綠色加好,選擇數(shù)據(jù)庫保存位置,并添加數(shù)據(jù)名稱為MythDiary.db,結(jié)果如圖5所示。

圖5

(三)新建表格

步驟2完成后,在左側(cè)的列表中會出現(xiàn)我們剛才新建的數(shù)據(jù)庫,如圖6所示。

圖6

在數(shù)據(jù)庫上單擊右鍵,選擇Connect to the database,鏈接數(shù)據(jù)庫,如圖7所示;

圖7

展開數(shù)據(jù)庫,會出現(xiàn)連個菜單,一是Tables,一個是Views,在Tables上單擊右鍵選擇Create Table新建表格,如圖8所示。

圖8

在右側(cè)會出現(xiàn)表格屬性設(shè)置界面,如圖9所示,在這個界面我們可以設(shè)置表格的字段和表格的名稱。

圖9
先在表格名稱里面輸入adminuser,然后單擊操作工具欄上的綠色打鉤按鈕進行保存(如圖10),這樣表格就已經(jīng)保存成功,這里特別說明一下:
“WITHOUT ROWID”這個復(fù)選框:在SQLiteStudio中,我們新建一個表格,如果這個復(fù)選框不被選擇,SQLiteStudio會自動給表格添加一個字段RowID,這個字段是一個隱含的字段,自動加一;如果選擇不會添加這個隱形字段

(四)添加字段。

保存完成后,單擊操作工具欄上的添加字段按鈕,彈出字段屬性對話框,如圖11所示,在這里我們可以設(shè)置字段名稱,數(shù)據(jù)類型、大小等。目前我們需要完成3個表格的設(shè)計,一個是adminuser表格,一個是DiaryType,最后一個是Articles,具體字段如下:
1. DiaryType 數(shù)據(jù)字段

名稱數(shù)據(jù)類型默認值備注
TypeNameVARCHAR分類名稱
ParentIDINT父類ID
TypeIconVARCHAR分類小圖標
CreateTimeDATETIMEDEFAULT (datetime(‘now’, ‘localtime’) )創(chuàng)建時間

2. Articles數(shù)據(jù)字段

名稱數(shù)據(jù)類型默認值備注
TitleVARCHAR標題
ContentTEXT內(nèi)容
PicVARCHAR文章圖片
KeyWordVARCHAR文章關(guān)鍵字
DescVARCHAR文章描述
UserIDINT0作者ID
CreateTimeDATETIMEDEFAULT (datetime(‘now’, ‘localtime’) )創(chuàng)建時間
EditTimeDATETIMEDEFAULT (datetime(‘now’, ‘localtime’) )修改時間
ViewCountINT0查看次數(shù)
StateINT0文章狀態(tài),0表示不公開;1表示公開
IsBackUpINT0是否備份到服務(wù)器:0未備份;1已備份

3. Adminuser 數(shù)據(jù)字段

名稱數(shù)據(jù)類型默認值備注
UserNameVARCHAR用戶名稱
PassWordVARCHAR用戶密碼
HeadPicVARCHAR用戶頭像照片地址
OneKeyVARCHAR一句話宣言
CreateTimeDATETIMEDEFAULT (datetime(‘now’, ‘localtime’) )創(chuàng)建時間
LastLoginTimeDATETIMEDEFAULT (datetime(‘now’, ‘localtime’) )最后登錄時間

三、c#操作sqlite數(shù)據(jù)庫

在C#中使用SQLite數(shù)據(jù)庫需要引用System.Data.SQLite.dll,下載鏈接:http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

注:System.Data.SQLite是SQLite的ADO.NET提供程序,兩者是兩個不同的開源項目,現(xiàn)在System.Data.SQLite的開發(fā)和維護工作大部分由SQLite開發(fā)團隊執(zhí)行。

(一)操作基礎(chǔ)類
public class SQLiteHelper {/// <summary>/// 數(shù)據(jù)庫列表/// </summary>public static Dictionary<string, SQLiteHelper> DataBaceList = new Dictionary<string, SQLiteHelper>();/// <summary>/// 構(gòu)造函數(shù)/// </summary>/// <param name="filename">數(shù)據(jù)庫文件名</param>public SQLiteHelper(string filename=null) {DataSource = filename; }/// <summary>/// 數(shù)據(jù)庫地址/// </summary>public string DataSource { get; set; } /// <summary>/// 創(chuàng)建數(shù)據(jù)庫,如果數(shù)據(jù)庫文件存在則忽略此操作/// </summary>public void CreateDataBase() {string path = Path.GetDirectoryName(DataSource);if ((!string.IsNullOrWhiteSpace(path)) && (!Directory.Exists(path))) Directory.CreateDirectory(path);if (!File.Exists(DataSource)) SQLiteConnection.CreateFile(DataSource); }/// <summary>/// 獲得連接對象/// </summary>/// <returns>SQLiteConnection</returns> public SQLiteConnection GetSQLiteConnection(){string connStr =string.Format("Data Source={0}", DataSource); var con = new SQLiteConnection(connStr);return con;}/// <summary>/// 準備操作命令參數(shù)/// </summary>/// <param name="cmd">SQLiteCommand</param>/// <param name="conn">SQLiteConnection</param>/// <param name="cmdText">Sql命令文本</param>/// <param name="data">參數(shù)數(shù)組</param>private static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, Dictionary<String, String> data){if (conn.State != ConnectionState.Open)conn.Open();cmd.Parameters.Clear();cmd.Connection = conn;cmd.CommandText = cmdText;cmd.CommandType = CommandType.Text;cmd.CommandTimeout = 30;if (data != null && data.Count >= 1){foreach (KeyValuePair<String, String> val in data){cmd.Parameters.AddWithValue(val.Key, val.Value);}}}/// <summary>/// 查詢,返回DataSet/// </summary>/// <param name="cmdText">Sql命令文本</param>/// <param name="data">參數(shù)數(shù)組</param>/// <returns>DataSet</returns>public DataSet ExecuteDataset(string cmdText, Dictionary<string, string> data = null){var ds = new DataSet();using (SQLiteConnection connection = GetSQLiteConnection()){var command = new SQLiteCommand();PrepareCommand(command, connection, cmdText, data);var da = new SQLiteDataAdapter(command);da.Fill(ds);}return ds;}/// <summary>/// 查詢,返回DataTable/// </summary>/// <param name="cmdText">Sql命令文本</param>/// <param name="data">參數(shù)數(shù)組</param>/// <returns>DataTable</returns>public DataTable ExecuteDataTable(string cmdText, Dictionary<string, string> data = null){var dt = new DataTable();using (SQLiteConnection connection = GetSQLiteConnection()){var command = new SQLiteCommand();PrepareCommand(command, connection, cmdText, data);SQLiteDataReader reader = command.ExecuteReader();dt.Load(reader);}return dt;}/// <summary>/// 返回一行數(shù)據(jù)/// </summary>/// <param name="cmdText">Sql命令文本</param>/// <param name="data">參數(shù)數(shù)組</param>/// <returns>DataRow</returns>public DataRow ExecuteDataRow(string cmdText, Dictionary<string, string> data = null){DataSet ds = ExecuteDataset(cmdText, data);if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)return ds.Tables[0].Rows[0];return null;}/// <summary>/// 執(zhí)行數(shù)據(jù)庫操作/// </summary>/// <param name="cmdText">Sql命令文本</param>/// <param name="data">傳入的參數(shù)</param>/// <returns>返回受影響的行數(shù)</returns>public int ExecuteNonQuery(string cmdText, Dictionary<string, string> data=null){using (SQLiteConnection connection = GetSQLiteConnection()){var command = new SQLiteCommand();PrepareCommand(command, connection, cmdText, data);return command.ExecuteNonQuery();}}/// <summary>/// 返回SqlDataReader對象/// </summary>/// <param name="cmdText">Sql命令文本</param>/// <param name="data">傳入的參數(shù)</param>/// <returns>SQLiteDataReader</returns>public SQLiteDataReader ExecuteReader(string cmdText, Dictionary<string, string> data = null){var command = new SQLiteCommand();SQLiteConnection connection = GetSQLiteConnection();try{PrepareCommand(command, connection, cmdText, data);SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);return reader;}catch{connection.Close();command.Dispose();throw;}}/// <summary>/// 返回結(jié)果集中的第一行第一列,忽略其他行或列/// </summary>/// <param name="cmdText">Sql命令文本</param>/// <param name="data">傳入的參數(shù)</param>/// <returns>object</returns>public object ExecuteScalar(string cmdText, Dictionary<string, string> data = null){using (SQLiteConnection connection = GetSQLiteConnection()){var cmd = new SQLiteCommand();PrepareCommand(cmd, connection, cmdText, data);return cmd.ExecuteScalar();}}/// <summary>/// 分頁查詢/// </summary>/// <param name="recordCount">總記錄數(shù)</param>/// <param name="pageIndex">頁牽引</param>/// <param name="pageSize">頁大小</param>/// <param name="cmdText">Sql命令文本</param>/// <param name="countText">查詢總記錄數(shù)的Sql文本</param>/// <param name="data">命令參數(shù)</param>/// <returns>DataSet</returns>public DataSet ExecutePager(ref int recordCount, int pageIndex, int pageSize, string cmdText, string countText, Dictionary<string, string> data = null){if (recordCount < 0)recordCount = int.Parse(ExecuteScalar(countText, data).ToString());var ds = new DataSet();using (SQLiteConnection connection = GetSQLiteConnection()){var command = new SQLiteCommand();PrepareCommand(command, connection, cmdText, data);var da = new SQLiteDataAdapter(command);da.Fill(ds, (pageIndex - 1) * pageSize, pageSize, "result");}return ds;}/// <summary>/// 重新組織數(shù)據(jù)庫:VACUUM 將會從頭重新組織數(shù)據(jù)庫/// </summary>public void ResetDataBass(){using (SQLiteConnection conn = GetSQLiteConnection()){var cmd = new SQLiteCommand();if (conn.State != ConnectionState.Open)conn.Open();cmd.Parameters.Clear();cmd.Connection = conn;cmd.CommandText = "vacuum";cmd.CommandType = CommandType.Text;cmd.CommandTimeout = 30;cmd.ExecuteNonQuery();}}}
(二)類的使用
static void Main(string[] args) {SQLiteHelper testDb = new SQLiteHelper("test.db");SQLiteHelper.DataBaceList.Add("TEST", testDb);//建庫testDb.CreateDataBase();//建表 StringBuilder sbr = new StringBuilder();sbr.AppendLine("CREATE TABLE IF NOT EXISTS `test_table`(");sbr.AppendLine("`id` INTEGER PRIMARY KEY AUTOINCREMENT,");//自增id主鍵sbr.AppendLine("`name` VARCHAR(100) NOT NULL,");sbr.AppendLine("`password` VARCHAR(40) NOT NULL,");sbr.AppendLine("`create_time` datetime DEFAULT CURRENT_TIMESTAMP,");sbr.AppendLine("`update_time` datetime DEFAULT CURRENT_TIMESTAMP );"); sbr.AppendLine();sbr.AppendLine("CREATE TRIGGER IF NOT EXISTS `trigger_test_table_update_time` ");//觸發(fā)器-自動更新update_timesbr.AppendLine("AFTER UPDATE ON `test_table` ");sbr.AppendLine("FOR EACH ROW ");sbr.AppendLine("BEGIN ");sbr.AppendLine("UPDATE `test_table` SET `update_time` = CURRENT_TIMESTAMP WHERE id = old.id; ");sbr.AppendLine("END;");string cmdText = sbr.ToString();int val = testDb.ExecuteNonQuery(cmdText); Console.WriteLine("影響行數(shù):" + val);//增sbr.Clear();sbr.Append("INSERT INTO test_table (name,password) VALUES ");sbr.Append("(11,111), ");sbr.Append("(12,222); ");cmdText = sbr.ToString();val = testDb.ExecuteNonQuery(cmdText);Console.WriteLine("影響行數(shù):" + val);//刪sbr.Clear();sbr.Append("DELETE FROM test_table ");sbr.Append("WHERE id=1;");cmdText = sbr.ToString();val = testDb.ExecuteNonQuery(cmdText);Console.WriteLine("影響行數(shù):" + val);//改sbr.Clear();sbr.Append("UPDATE test_table SET ");sbr.Append("name='13', ");sbr.Append("password='333' ");sbr.Append("WHERE id=@id;");cmdText = sbr.ToString();Dictionary<string, string> data = new Dictionary<string, string>();data.Add("@id", "2"); val = testDb.ExecuteNonQuery(cmdText, data);Console.WriteLine("影響行數(shù):" + val);//查sbr.Clear();sbr.Append("SELECT name,password FROM test_table ");sbr.Append("WHERE id=@id;");cmdText = sbr.ToString();DataTable dt = testDb.ExecuteDataTable(cmdText, data);Console.WriteLine("結(jié)果行數(shù):" + dt.Rows.Count); //刪除表sbr.Clear();sbr.Append("DROP TABLE test_table;");cmdText = sbr.ToString();val = SQLiteHelper.DataBaceList["TEST"].ExecuteNonQuery(cmdText);Console.WriteLine("影響行數(shù):" + val);//重組數(shù)據(jù)庫SQLiteHelper.DataBaceList["TEST"].ResetDataBass();Console.ReadKey(); }
(三)sqlite事務(wù)

事務(wù)定義了一組 SQL 命令,這組命令或者作為一個整體被全部執(zhí)行,或者都不執(zhí)行,這被稱為數(shù)據(jù)庫完整性的原子性原則。這種關(guān)系的典型例子就是銀行轉(zhuǎn)賬,假設(shè)銀行程序從一個賬戶向另一個賬戶轉(zhuǎn)賬,轉(zhuǎn)賬程序通過如下方式進行:首先將第一個賬戶的錢轉(zhuǎn)入第二個賬戶,然后從第一個賬戶刪除對應(yīng)的數(shù)目;或者首先從第一個賬戶刪除要轉(zhuǎn)賬的數(shù)目,然后向第二個賬戶插入對應(yīng)的數(shù)目。無論哪種方式,都是通過兩步完成的:先插入,后刪除;或者先刪除,后插入。但是在轉(zhuǎn)賬期間,如果數(shù)據(jù)庫服務(wù)器突然奔潰或電力中斷,第二個操作沒有完成怎么辦?要么這筆錢存在于兩個賬戶(第一種方式),要么這筆錢在兩個賬戶中都不存在(第二種方式)。無論發(fā)生哪種情況,總有人無法接受。數(shù)據(jù)庫也處于不一致的狀態(tài),關(guān)鍵是這兩步操作必須要同時被執(zhí)行或者一步都不執(zhí)行。這就是事務(wù)的本質(zhì)。
事務(wù)使用代碼:

SQLiteTransaction tr = dbConnection.BeginTransaction();//事務(wù)開始try{ SQLiteCommand cmd = new SQLiteCommand();cmd.CommandText = "DROP TABLE IF EXISTS Company1";cmd.Connection = dbConnection;cmd.ExecuteNonQuery();cmd.CommandText = "CREATE TABLE Company1(ID INTEGER PRIMARY KEY NOT NULL,NAME TEXT NOT NULL)";//創(chuàng)建一個表,ID為主鍵,NOT NULL 表示這個不能為空cmd.Connection = dbConnection;cmd.ExecuteNonQuery();cmd.CommandText = "INSERT INTO Company1(NAME) VALUES('ALBABA')";//表插入內(nèi)容cmd.Connection = dbConnection;cmd.ExecuteNonQuery();cmd.CommandText = "INSERT INTO Company1(NAME) VALUES('HKWS')";cmd.Connection = dbConnection;cmd.ExecuteNonQuery();cmd.CommandText = "INSERT INTO Company1(NAME) VALUES('HUAW')";cmd.Connection = dbConnection;cmd.ExecuteNonQuery();cmd.CommandText = "INSERT INTO Company1(NAME) VALUES('GSYH')";cmd.Connection = dbConnection;cmd.ExecuteNonQuery(); Console.Write("FINALLY");tr.Commit();//把事務(wù)調(diào)用的更改保存到數(shù)據(jù)庫中,事務(wù)結(jié)束dbConnection.Close();}catch(Exception ex){Console.Write(ex.Message);tr.Rollback();//回滾}}

ok,本節(jié)就到這里

我的日記開發(fā)系列手記目錄

1.我的日記本開發(fā)手記——概述
2.我的日記本開發(fā)手記(2)——配色
3.我的日記本開發(fā)手記(3)—— 布局
4.我的日記本開發(fā)手記(4)—— UI效果圖
5.我的日記本開發(fā)手記(5)—— 效果圖轉(zhuǎn)HTML
6.我的日記本開發(fā)手記(6)——Winform運行HTML
7.第七節(jié)_我的日記本開發(fā)手記(7)——Javascript與c#交互

總結(jié)

以上是生活随笔為你收集整理的第八节_我的日记本开发手记(8)——sqlite数据库与c#的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。