最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQLite數(shù)據(jù)庫(kù)管理系統(tǒng)-我所認(rèn)識(shí)的數(shù)據(jù)庫(kù)引擎

 更新時(shí)間:2013年01月04日 09:25:33   作者:  
SQLite是一款輕量級(jí)的、被設(shè)計(jì)用于嵌入式系統(tǒng)的關(guān)聯(lián)式數(shù)據(jù)庫(kù)管理系統(tǒng),SQLite 是一個(gè)實(shí)現(xiàn)自我依賴、純客戶端、零配置且支持事務(wù)的數(shù)據(jù)庫(kù)引擎

SQLite 是一款輕量級(jí)的、被設(shè)計(jì)用于嵌入式系統(tǒng)的關(guān)聯(lián)式數(shù)據(jù)庫(kù)管理系統(tǒng)。SQLite 是一個(gè)實(shí)現(xiàn)自我依賴、純客戶端、零配置且支持事務(wù)的數(shù)據(jù)庫(kù)引擎。它由D. Richard Hipp首次開(kāi)發(fā),目前已是世界上最廣泛部署的開(kāi)源數(shù)據(jù)庫(kù)引擎。

本文中,我們將介紹如下內(nèi)容:

創(chuàng)建一個(gè)SQLite 數(shù)據(jù)庫(kù)

復(fù)制代碼 代碼如下:

SQLiteConnection conn = new SQLiteConnection("Data Source=mytest.s3db");
conn.Open();

SQLite 數(shù)據(jù)插入
復(fù)制代碼 代碼如下:

/// <summary>
/// Allows the programmer to easily insert into the DB
/// </summary>
/// <param name="tableName">The table into which we insert the data.</param>
/// <param name="data">A dictionary containing the column names and data for the insert.</param>
/// <returns>A boolean true or false to signify success or failure.</returns>
public bool Insert(string tableName, Dictionary<string, string> data)
{
Boolean returnCode = true;
StringBuilder columnBuilder = new StringBuilder();
StringBuilder valueBuilder = new StringBuilder();
foreach (KeyValuePair<string, string> val in data)
{
columnBuilder.AppendFormat(" {0},", val.Key);
valueBuilder.AppendFormat(" '{0}',", val.Value);
}
columnBuilder.Remove(columnBuilder.Length - 1, 1);
valueBuilder.Remove(valueBuilder.Length - 1, 1);
try
{
this.ExecuteNonQuery(string.Format("INSERT INTO {0}({1}) VALUES({2});",
tableName, columnBuilder, valueBuilder));
}
catch (Exception ex)
{
mLog.Warn(ex.ToString());
returnCode = false;
}
return returnCode;
}

復(fù)制代碼 代碼如下:

DateTime entryTime;
string name = string.Empty, title = string.Empty;
GetSampleData(out name, out title, out entryTime);
int id = random.Next();
insertParameterDic.Add("Id", id.ToString());
insertParameterDic.Add("Name", name);
insertParameterDic.Add("Title", title);
insertParameterDic.Add("EntryTime",
entryTime.ToString("yyyy-MM-dd HH:mm:ss"));

db.Insert("Person", insertParameterDic);

SQLite 的事務(wù)處理方式

Begin Transaction:

begin-stmt

Commit Transaction:

commit-stmt

Rollback Transaction:

rollback-stmt

復(fù)制代碼 代碼如下:

try
{
db.OpenTransaction();
Insert4Native();
db.CommiteTransaction();
}
catch (System.Exception ex)
{
mLog.Error(ex.ToString());
db.RollbackTransaction();
}

SQLite 的索引

索引是一種用來(lái)優(yōu)化查詢的特性,在數(shù)據(jù)中分為聚簇索引和非聚簇索引;前者是由數(shù)據(jù)庫(kù)中數(shù)據(jù)組織方式?jīng)Q定的,比如我們?cè)谕鶖?shù)據(jù)庫(kù)中一條一條插入數(shù)據(jù)時(shí),聚簇索引能夠保證按順序插入,插入后數(shù)據(jù)的位置和結(jié)構(gòu)不變。非聚簇索引是指我們手動(dòng)、顯式創(chuàng)建的索引,可以為數(shù)據(jù)庫(kù)中的每個(gè)列創(chuàng)建索引,和字典中的索引類似,遵循的原則是對(duì)有分散性和組合型的列建立索引,以利于大數(shù)據(jù)和復(fù)雜查詢情況下提高查詢效率。

create-index-stmt

復(fù)制代碼 代碼如下:

/// <summary>
/// Create index
/// </summary>
/// <param name="tableName">table name</param>
/// <param name="columnName">column name</param>
/// <param name="indexName">index name</param>
public void CreateIndex(string tableName, string columnName, string indexName)
{
string createIndexText = string.Format("CREATE INDEX {0} ON {1} ({2});",
indexName, tableName, columnName);
ExecuteNonQuery(createIndexText);
}

簡(jiǎn)單查詢、無(wú)關(guān)數(shù)據(jù)庫(kù)大小情況下對(duì)查詢效率的測(cè)試結(jié)果如下(700,000條數(shù)據(jù)):
復(fù)制代碼 代碼如下:

string sql = "SELECT LeafName FROM File WHERE Length > 5000";

Capture

復(fù)雜查詢情況下對(duì)查詢效率的測(cè)試結(jié)果如下(~40,000條數(shù)據(jù)):

復(fù)制代碼 代碼如下:

string sql = "SELECT folder.Location AS FilePath"
+ "FROM Folder folder LEFT JOIN File file ON file.ParentGuid=folder.Guid"
+"WHERE file.Length > 5000000 GROUP BY File.LeafName";

Capture2

SQLite 的觸發(fā)器(Trigger)

觸發(fā)器是指當(dāng)一個(gè)特定的數(shù)據(jù)庫(kù)事件(DELETE, INSERT, or UPDATE)發(fā)生以后自動(dòng)執(zhí)行的數(shù)據(jù)庫(kù)操作,  我們可以把觸發(fā)器理解為高級(jí)語(yǔ)言中的事件(Event)。

假設(shè)我有兩個(gè)表

Folder(Guid VCHAR(255) NOT NULL, Deleted BOOLEAN DEFAULT 0)

File(ParentGuid VCHAR(255) NOT NULL, Deleted BOOLEAN DEFAULT 0)

在Folder 表中創(chuàng)建一個(gè)觸發(fā)器Update_Folder_Deleted:

復(fù)制代碼 代碼如下:

CREATE TRIGGER Update_Folder_Deleted UPDATE Deleted ON Folder
Begin
UPDATE File SET Deleted=new.Deleted WHERE ParentGuid=old.Guid;
END;

創(chuàng)建完觸發(fā)器以后在執(zhí)行以下語(yǔ)句:
復(fù)制代碼 代碼如下:

UPDATE Folder SET Deleted=1 WHERE Guid='13051a74-a09c-4b71-ae6d-42d4b1a4a7ae'

以上語(yǔ)句將會(huì)導(dǎo)致下面的語(yǔ)句自動(dòng)執(zhí)行:
復(fù)制代碼 代碼如下:

UPDATE File SET Deleted=1 WHERE ParentGuid='13051a74-a09c-4b71-ae6d-42d4b1a4a7ae'

SQLite 的視圖(View)

視圖可以是一個(gè)虛擬表,里面可以存儲(chǔ)按照一定條件過(guò)濾出來(lái)的數(shù)據(jù)集合,這樣我們?cè)傧麓蜗氲玫竭@些特定數(shù)據(jù)集合的時(shí)候就不用通過(guò)復(fù)雜查詢來(lái)獲得,簡(jiǎn)單的查詢指定視圖就可以得到想要的數(shù)據(jù)。

在下個(gè)例子中,我們創(chuàng)建一個(gè)簡(jiǎn)單的視圖:

Capture

基于上面的查詢結(jié)果我們創(chuàng)建一個(gè)視圖:

Capture2

SQLite 命令行工具

SQLite 庫(kù)中包含了一個(gè)SQLite3.exe 的命令行工具,它可以實(shí)現(xiàn)SQLite 各項(xiàng)基本操作。這里只介紹一下如何使用它來(lái)分析我們的查詢結(jié)果:

1. CMD->sqlite3.exe MySQLiteDbWithoutIndex.s3db

Capture

2. 開(kāi)啟EXPLAIN 功能并分析指定查詢結(jié)果

Capture

3. 重新使用命令行打開(kāi)一個(gè)有索引的數(shù)據(jù)庫(kù)并執(zhí)行前兩步

Capture

4. 通過(guò)比較兩個(gè)不同查詢語(yǔ)句的分析結(jié)果,我們可以發(fā)現(xiàn)如果查詢過(guò)程中使用了索引,SQLite 會(huì)在detail 列中提示我們。

5. 要注意的是每條語(yǔ)句后面都要加分號(hào)“;”

SQLite一些常見(jiàn)的使用限制

1. SQLite 不支持Unicode 字符的大小寫(xiě)比較,請(qǐng)看以下測(cè)試結(jié)果:

Capture

2. 如何處理SQLite 轉(zhuǎn)義字符:

復(fù)制代碼 代碼如下:

INSERT INTO xyz VALUES('5 O''clock');

3. 一條復(fù)合SELECT語(yǔ)句的條數(shù)限制:
一條復(fù)合查詢語(yǔ)句是指多條SELECT語(yǔ)句由 UNION, UNION ALL, EXCEPT, or INTERSECT 連接起來(lái). SQLite進(jìn)程的代碼生成器使用遞歸算法來(lái)組合SELECT語(yǔ)句。為了降低堆棧的大小,SQLite 的設(shè)計(jì)者們限制了一條復(fù)合SELECT語(yǔ)句的條目數(shù)量。 SQLITE_MAX_COMPOUND_SELECT的默認(rèn)值是500. 這個(gè)值沒(méi)有嚴(yán)格限制,在實(shí)踐中,幾乎很難看到一條復(fù)合查詢語(yǔ)句的條目數(shù)大于500的。

這里提到復(fù)合查詢的原因是我們可以使用它來(lái)幫助我們快速插入大量數(shù)據(jù):

復(fù)制代碼 代碼如下:

public void Insert4SelectUnion()
{
bool newQuery = true;
StringBuilder query = new StringBuilder(4 * ROWS4ACTION);
for (int i = 0; i < ROWS4ACTION; i++)
{
if (newQuery)
{
query.Append("INSERT INTO Person");
newQuery = false;
}
else
{
query.Append(" UNION ALL");
}

DateTime entryTime;
string name = string.Empty, title = string.Empty;
GetSampleData(out name, out title, out entryTime);
int id = random.Next();
query.AppendFormat(" SELECT '{0}','{1}','{2}','{3}'", id, name, title, entryTime.ToString("yyyy-MM-dd HH:mm:ss"));
if (i % 499 == 0)
{
db.ExecuteNonQuery(query.ToString());
query.Remove(0, query.Length);
newQuery = true;
}
}

//executing remaining lines
if (!newQuery)
{
db.ExecuteNonQuery(query.ToString());
query.Remove(0, query.Length);
}
}

相關(guān)文章

  • CentOS下更新SQLite版本

    CentOS下更新SQLite版本

    SQLite是一個(gè)軟件庫(kù),實(shí)現(xiàn)了自給自足的、無(wú)服務(wù)器的、零配置的、事務(wù)性的 SQL 數(shù)據(jù)庫(kù)引擎。這篇文章主要介紹了CentOS下更新SQLite版本,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-12-12
  • SQLite數(shù)據(jù)庫(kù)安裝及基本操作指南

    SQLite數(shù)據(jù)庫(kù)安裝及基本操作指南

    SQLite 是一個(gè)開(kāi)源的嵌入式關(guān)系數(shù)據(jù)庫(kù),實(shí)現(xiàn)自包容、零配置、支持事務(wù)的SQL數(shù)據(jù)庫(kù)引擎。 其特點(diǎn)是高度便攜、使用方便、結(jié)構(gòu)緊湊、高效、可靠。今天我們主要來(lái)講解下SQLite數(shù)據(jù)庫(kù)的安裝以及基本操作指南
    2014-08-08
  • SQLite教程(八):命令行工具介紹

    SQLite教程(八):命令行工具介紹

    這篇文章主要介紹了SQLite教程(八):命令行工具介紹,本文羅列了所有內(nèi)置命令,并對(duì)命令作用做了說(shuō)明,然后給出了常用示例,需要的朋友可以參考下
    2015-05-05
  • SQLite3中自增主鍵相關(guān)知識(shí)總結(jié)

    SQLite3中自增主鍵相關(guān)知識(shí)總結(jié)

    這篇文章主要介紹了SQLite3中自增主鍵相關(guān)知識(shí)總結(jié),清零的方法、INTEGER PRIMARY KEY AUTOINCREMENT和rowid的使用等,需要的朋友可以參考下
    2014-05-05
  • Sqlite 操作類代碼

    Sqlite 操作類代碼

    這兩天用了用SQLite,感覺(jué)比SQL CE好用多了,最主要的是性能好多了.這一點(diǎn)對(duì)手持設(shè)備來(lái)講很重要.閑話少說(shuō),下來(lái)將怎么在WM用.NET CF訪問(wèn)SQLite.
    2009-11-11
  • SQLite教程(六):表達(dá)式詳解

    SQLite教程(六):表達(dá)式詳解

    這篇文章主要介紹了SQLite教程(六):表達(dá)式詳解,本文講解了常用表達(dá)式、條件表達(dá)式、轉(zhuǎn)換表達(dá)式等內(nèi)容,需要的朋友可以參考下
    2015-05-05
  • SQLite 入門教程三 好多約束 Constraints

    SQLite 入門教程三 好多約束 Constraints

    在上一篇隨筆的結(jié)尾,我提到了約束, 但是在那里我把它翻譯成了限定符,不太準(zhǔn)確,這里先更正一下,應(yīng)該翻譯成約束更貼切一點(diǎn)。 那么什么是約束呢
    2013-12-12
  • SQLite高手晉級(jí)教程:調(diào)試與性能優(yōu)化以及常見(jiàn)問(wèn)題

    SQLite高手晉級(jí)教程:調(diào)試與性能優(yōu)化以及常見(jiàn)問(wèn)題

    SQLite 是一個(gè)輕量級(jí)的數(shù)據(jù)庫(kù),廣泛用于各種應(yīng)用中,包括移動(dòng)應(yīng)用和嵌入式系統(tǒng),盡管它非常靈活和強(qiáng)大,但在處理大規(guī)模數(shù)據(jù)或高并發(fā)請(qǐng)求時(shí),性能優(yōu)化變得非常重要,本篇文章將重點(diǎn)講解 SQLite 的調(diào)試工具和性能優(yōu)化技巧,以幫助您解決常見(jiàn)問(wèn)題并進(jìn)一步提升數(shù)據(jù)庫(kù)性能
    2025-03-03
  • 基于sqlite特殊字符轉(zhuǎn)義的實(shí)現(xiàn)方法

    基于sqlite特殊字符轉(zhuǎn)義的實(shí)現(xiàn)方法

    本篇文章是對(duì)sqlite特殊字符轉(zhuǎn)義的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • SQLite教程(十四):C語(yǔ)言編程實(shí)例代碼(2)

    SQLite教程(十四):C語(yǔ)言編程實(shí)例代碼(2)

    這篇文章主要介紹了SQLite教程(十四):C語(yǔ)言編程實(shí)例代碼(2),本文講解了高效的批量數(shù)據(jù)插入和數(shù)據(jù)查詢代碼實(shí)例,需要的朋友可以參考下
    2015-05-05

最新評(píng)論

武邑县| 重庆市| 博白县| 色达县| 新干县| 依安县| 云南省| 平顺县| 吴旗县| 穆棱市| 铜鼓县| 施甸县| 台湾省| 噶尔县| 阿荣旗| 鸡泽县| 连城县| 商水县| 垣曲县| 霍山县| 荥阳市| 济南市| 钟山县| 湖北省| 平山县| 海林市| 壤塘县| 延川县| 枣阳市| 安溪县| 宽甸| 阳泉市| 岢岚县| 松桃| 神木县| 长兴县| 临西县| 盖州市| 红桥区| 陆河县| 金寨县|