asp.net下SQLite(轻量级最佳数据库) 原理分析和开发应用 |
本文标签:SQLite,轻量级最佳数据库 概述 SQLite介绍 自几十年前出现的商业应用程序以来,数据库就成为软件应用程序的主要组成部分 。正与数据库管理系统非常关键一样,它们也变得非常庞大,并占用了相当多的系统资源,增加了管理的复杂性 。随着软件应用程序逐渐模块模块化,一种新型数据库会比大型复杂的传统数据库管理系统更适应 。嵌入式数据库直接在应用程序进程中运行,提供了零配置(zero-configuration)运行模式,并且资源占用非常少 。 嵌入式数据库的一大好处就是在你的程序内部不需要网络配置,也不需要管理 。因为客户端和服务器在同一进程空间运行 。SQLite 的数据库权限只依赖于文件系统,没有用户帐户的概念 。SQLite 有数据库级锁定,没有网络服务器 。它需要的内存,其它开销很小,适合用于嵌入式设备 。你需要做的仅仅是把它正确的编译到你的程序 。 架构(architecture) SQLite采用了模块的设计,它由三个子系统,包括8个独立的模块构成 。
接口(Interface) SQLite的特点(SQLites Features and Philosophy)
事务(Transaction) 事务的周期(Transaction Lifecycles)
关于这个图有以下几点值得注意:
读者可以从http://www.sqlite.org/下载SQLite 3.3.4的版本 >SQLite3 d:\test.db 回车 就生成了一个test.db在d盘 。 这样同时也SQLite3挂上了这个test.db 用.help可以看看有什么命令 看看有创建了多少表
把表结构输出,同时索引也会输出
从http://sqlite.phxsoftware.com/下载Ado.net驱动 。 SQL语法
SQLite 分页查询 写法1: SELECT * FROM TABLE1 LIMIT 20 OFFSET 20 ; 写法2: SELECT * FROM TABLE1 LIMIT 20 , 20; SQLite 文件的压缩 VACUUM VACUUM的实现
数据插入与更新 使用REPLACE替代INSERT、UPDATE命令 。在无满足条件记录,则执行Insert,有满足条件记录,则执行UPDATE 。 复制代码 代码如下: REPLACE INTO TABLE1(col1, col2, col3) VALUES(val1, val2,val3); Insert or Replace Into 和Replace Into 的效果是一样的上面这句话也可以这样写 复制代码 代码如下: Insert or Replace INTO TABLE1(col1, col2, col3) VALUES(val1, val2,val3); 字符编码转换 sqlite3的源码中,提供了utf8ToUnicode()、unicodeToUtf8()、mbcsToUnicode()、unicodeToMbcs()、sqlite3_win32_mbcs_to_utf8 ()、utf8ToMbcs ()等8个函数进行字符在不同编码间的转换,但未在sqlite3.def、sqlite3.h文件中列出,即未对外公开 。这些函数中,都使用了MultiByteToWideChar()、WideCharToMultiByte()两个函数实现字符间转换 。 开发示例 复制代码 代码如下: using System; using System.Data; using System.Data.SQLite; using System.Collections.Generic; using System.IO; namespace FileSystemWatcthrDemo.DataHelper { public class SqLiteHelper { /// <summary> /// ConnectionString样例:Datasource=Test.db3;Pooling=true;FailIfMissing=false /// </summary> public static string ConnectionString { get { return @"Data source= "+DataBasePath+";"; } set { throw new NotImplementedException(); } } public static string DataBasePath { get { return "SpringYang.db";}; } private static object lockObject = new object(); private static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, List<SQLiteParameter> parameters) { if (conn.State != ConnectionState.Open) conn.Open(); cmd.Parameters.Clear(); cmd.Connection = conn; cmd.CommandText = cmdText; cmd.CommandType = CommandType.Text; cmd.CommandTimeout = 30; foreach (var parameter in parameters) { cmd.Parameters.Add(parameter); } } public static DataSet ExecuteQuery(string cmdText, List<SQLiteParameter> parameters) { lock (lockObject) { using (SQLiteConnection conn = new SQLiteConnection(ConnectionString)) { using (SQLiteCommand command = new SQLiteCommand()) { DataSet ds = new DataSet(); PrepareCommand(command, conn, cmdText, parameters); SQLiteDataAdapter da = new SQLiteDataAdapter(command); da.Fill(ds); return ds; } } } } public static int ExecuteNonQuery(string cmdText, List<SQLiteParameter> parameters) { lock (lockObject) { using (SQLiteConnection conn = new SQLiteConnection(ConnectionString)) { using (SQLiteCommand command = new SQLiteCommand()) { PrepareCommand(command, conn, cmdText, parameters); return command.ExecuteNonQuery(); } } } } public static SQLiteDataReader ExecuteReader(string cmdText, List<SQLiteParameter> parameters) { lock (lockObject) { SQLiteConnection conn = new SQLiteConnection(ConnectionString); SQLiteCommand command = new SQLiteCommand(); PrepareCommand(command, conn, cmdText, parameters); SQLiteDataReader sqLiteDataReader = command.ExecuteReader(); return sqLiteDataReader; } } public static object ExecuteScalar(string cmdText, List<SQLiteParameter> parameters) { lock (lockObject) { using (SQLiteConnection conn = new SQLiteConnection(ConnectionString)) { using (SQLiteCommand command = new SQLiteCommand()) { PrepareCommand(command, conn, cmdText, parameters); return command.ExecuteScalar(); } } } } public static void CreateDataBase() { if (!File.Exists(DataBasePath)) SQLiteConnection.CreateFile(DataBasePath); CreateTable(); } public static void CreateTable() { ExecuteNonQuery(CodeDetailTabale, null); } private static string CodeDetailTabale { get { return @"CREATE TABLE [CodeDetail] ( [CdType] [nvarchar] (10) NOT NULL , [CdCode] [nvarchar] (20) NOT NULL , [CdString1] [ntext] NOT NULL , [CdString2] [ntext] NOT NULL , [CdString3] [ntext] NOT NULL, PRIMARY KEY (CdType,CdCode) ) ;"; } } } } 示例讲解 A、使用到自己定义的锁private static object lockObject = new object(); B、使用完连接后都进行关闭操作 。使用了using C、创建数据库命令:SQLiteConnection.CreateFile(DataBasePath); 最后再讲解个Insert or Replace into的经典用法 复制代码 代码如下: Insert or Replace INTO User(ID, Name,Age) Select old.ID,new.Name,new.Age From (select Spring Yang as Name, 25 as Age) as new left join (Select ID,Name from User where Name = Spring Yang ) as old on old.Name = new.Name |