概述SQLite简介自从几十年前出现商业应用以来,数据库已经成为软件应用的主要组成部分。正如数据库管理系统非常关键一样,它们也变得非常庞大,占用了相当多的系统资源,增加了管理的复杂性。随着软件应用的逐步模块化,一种新型的数据库将比传统的大型复杂的数据库管理系统更加适用。嵌入式数据库直接在应用进程中运行,提供了零配置运行模式,占用资源很少。SQLite是一个开源的嵌入式关系数据库,由D. Richard Hipp于2000年发布。它可以减少应用程序的数据管理开销。SQLite便携、易用、小巧、高效、可靠。SQLite嵌入在使用它的应用程序中,它们共享相同的进程空间,而不是单个进程。从外部来看,它不像一个关系数据库管理系统,但从内部来看,它是一个完整和独立的数据库引擎。嵌入式数据库的优点之一是不需要在程序内部进行网络配置或管理。因为客户端和服务器运行在同一个进程空间中。SQLite的数据库权限只取决于文件系统,没有用户帐户的概念。SQLite有数据库级锁,没有网络服务器。它需要很少的内存和其他开销,因此适用于嵌入式设备。你所需要做的就是把它正确地编译到你的程序中。架构)SQLite采用模块的设计,由三个子系统组成,包括八个独立的模块。
接口(Interface)接口由SQLite C API组成,也就是说,无论是程序、脚本语言还是库文件,最终都会通过它与SQLite进行交互(我们平时用的比较多的ODBC/JDBC,最终会转换成对应C API的调用)。编译器在编译器中,Tokenizer和Parser检查SQL的语法,然后将其转换为层次化的数据结构——语法树,在底层可以更方便地处理,然后将语法树传递给代码生成器进行处理。根据它,代码生成器为SQLite生成一个汇编代码,最后由虚拟机执行。虚拟机架构的核心部分是虚拟机,即虚拟数据库引擎(VDBE)。它类似于Java虚拟机,解释字节码的执行。VDBE的字节码由128个操作码组成,主要关注数据库操作。它的每个指令用于完成特定的数据库操作(如打开表的游标)或为这些操作准备堆栈空间(如按参数)。总之,所有这些指令都是为了满足SQL命令的要求(VM将在后面详细描述)。后端后端由B树、页面缓存(寻呼机)和操作系统接口(即系统调用)组成。b树和页面缓存一起管理数据。B-tree的主要功能是索引,它维护了页面之间复杂的关系,便于快速找到需要的数据。寻呼机的主要功能是通过操作系统接口在B树和磁盘之间传送页面。SQLite的特性(SQLite的特性和理念)是零配置和可移植性:它运行在Windows、Linux、BSD、Mac OS X和一些商业Unix系统上,例如Sun的Solaris。同样,它也可以在许多嵌入式操作系统下工作,如QNX、VxWorks、掌上操作系统、塞班和视窗操作系统。紧凑性:SQLite被设计成轻量级和独立的。一个头文件,一个库,您是关系型的,不需要外部数据库服务器简单性灵活性可靠性:SQLite的核心有大约30,000行标准C代码,这些代码是模块化的,易于阅读。事务(Transaction Lifecycles)程序和事务之间有两点值得注意:a .事务——下运行哪些对象,与API直接相关。b、事务的生命周期,即开始和结束的时间,以及开始影响其他连接的时间(这对并发非常重要)。一个连接可以包含多个语句,每个连接都有一个B树和一个与数据库相关联的寻呼机。寻呼机在连接中起着重要的作用,因为它管理事务、锁、内存缓存,并负责崩溃恢复。当您编写数据库时,请记住最重要的事情:在任何时候,一个事务下只执行一个连接。这些回答了第一个问题。一般来说,事务的生命周期类似于语句,可以手动结束。默认情况下,事务是自动提交的,但是您也可以通过BEGIN手动提交.COMMIT。然后就是锁的问题。
这张图有以下几点值得注意:A .事务可以在三种状态下启动:UNLOCKED、RESERVED或EXCLUSIVE。默认情况下,它在解锁时启动。b .白框中的UNLOCKED、PENDING、SHARED和RESERVED可以同时存在于数据库中。c、从灰色的PENDING开始,事情变得严格,这意味着事务想要EXCLUSIVE锁(注意和白盒的区别)。虽然锁的状态很多,但物理上只有两种情况:读事务和写事务。读者可以从http://www.sqlite.org/,下载SQLite 3.3.4的Cmd版本,进入命令行创建数据库文件: SQLite3 d:test.db,然后按回车键在D盘生成test.db。同时,SQLite3挂起了这个test.db. use。帮助查看哪些命令。帮助按enter查看创建了多少个表。表格看表格结构。模式表名,并查看当前挂起的数据库。如果要将查询输出到文件中,请使用。输出文件名查询语句;在屏幕上输出查询结果。output stdout输出表结构,索引也输出。转储表名称。退出或。退出从http://sqlite.phxsoftware.com/.下载Ado.net驱动程序下载安装后,安装目录中有一个System.Data.SQLite.dll。我们只需要将这个文件复制到引用目录中,并添加一个引用来操作SQLite数据库。所有Ado.net对象都以SQLite开头。例如,SQLiteConnection字符串只需要以下方法:Data Source=d:test.db或DataSource=test.db -当应用于可以由应用程序或自动找到的目录时,剩下的就非常简单了。net ~~SQL语法。因为以前使用过SQLServer或ISeries,所以DDL的语法羞于创建单个主键表创建表[admin]([username][nvarchar](20)主键不为空,[password] [nvarchar] (50)不为空。[Rank] [smallint] NOT NULL,[Mail server][nvarchar](50)NOT NULL,[Mail user][nvarchar](50)NOT NULL,[Mail password][nvarchar](50)NOT NULL,[Mail][nvarchar](50)NOT NULL;创建一个具有多个主键[代码详细信息]([光盘类型][非空值] (10)的表,[光盘代码][非空值] (20)非空值。[CdString1] [ntext]不为空,[CdString2] [ntext]不为空,[CdString3] [ntext]不为空,主键(CdType,CdCode));在[帐户] ([ischeck],[username])上创建索引[IX _ account];还可以查看等等。SQLite分页查询写成1:从表1中选择*限制20偏移量20;写2:从表1中选择*限制20,20;SQLite文件的压缩在多次删除、插入、更新数据后,数据库量增加,但实际有效数据量很小,需要对数据库进行压缩整理,将删除的数据从物理文件中移除。只需调用SQL命令:真空吸尘器的实现。
数据插入与更新使用替换替代插入、更新命令。在无满足条件记录,则执行插入,有满足条件记录,则执行更新。复制代码代码如下: REPLACE INTO TABLE1(col1,col2,col3) VALUES(val1,val2,val 3);插入或替换到和替换为的效果是一样的上面这句话也可以这样写复制代码代码如下:在表一中插入或替换(列1、列2、列3)值(val1、val2、val 3);字符编码转换sqlite3的源码中,提供了utf8ToUnicode()、unicodeToUtf8()、mbcsToUnicode()、unicodeToMbcs()、sqlite3_win32_mbcs_to_utf8()、utf8ToMbcs()等8个函数进行字符在不同编码间的转换,但未在sqlite3.def、sqlite3.h文件中列出,即未对外公开。这些函数中,都使用了多字节宽字符()、宽图表多字节()两个函数实现字符间转换。开发示例复制代码代码如下:使用系统;使用系统。数据;使用系统数据。数据库使用系统。集合。通用;使用系统IO;命名空间FileSystemWatcthrDemo .DataHelper {公共类SQLite帮助程序{///summary///ConnectionString样例:数据源=测试。db 3;汇集=真;FailIfMissing=false////summary公共静态字符串连接字符串{ get { return @ '数据源=' DataBasePath} set { throw new notimplementdexception();} }公共静态字符串database path { get { return } SpringYang。' db ';};}私有静态对象lock对象=new对象();私有静态void PrepareCommand(sqlitecordcmd,SQLiteConnection conn,string cmdText,ListSQLiteParameter参数){ if (conn.State!=ConnectionState .Open)conn . Open();cmd .参数。清除();cmd .连接=连接.CommandText=cmdTextcmd .命令类型=命令类型。文字;cmd .CommandTimeout=30foreach(参数中的定义变量参数){ cmd .参数。添加(参数);} }公共静态数据集执行查询(字符串cmdText,ListSQLiteParameter参数){ lock(LockObject){ 0使用(SQliteConnection conn=new SQliteConnection(connectionString)){ 0使用(SQliteCommand=new SQliteCommand()){ DataSet ds=new DataSet();PrepareCommand(command,conn,cmdText,参数);sqlitedadapter da=new sqlitedadapter(命令);爸爸。填充(ds);返回ds;} } } } public static int execution query(字符串cmdText,ListSQLiteParameter参数){ lock(lockObject){使用(SQliteConnection conn=new SQliteConnection(connectionString)){使用(SQliteCommand=new SQliteCommand()){ prepare command(command,conn,cmdText,parameters);返回命令execution query();} } } }公共静态sqlitedata reader ExecuteReader(字符串cmdText,ListSQLiteParameter参数){ lock(LockObject){ SQliteConnection conn=new SQliteConnection(连接字符串);SQLiteCommand=new SQLiteCommand();PrepareCommand(command,conn,cmdText,参数);sqlitedata读取器sqlitedata读取器=命令ExecuteReader();返回sqLiteDataReader} }公共静态对象ExecuteScalar(字符串cmdText,ListSQLiteParameter参数){ lock(lockObject){使用(SQliteConnection conn=new SQliteConnection(connectionStrIng)){使用(SQliteCommand=new SQliteCommand()){ prepareCommand(command,conn,cmdText,parameters);返回命令执行标量();} } } } public static void create database(){ if(!文件。存在(数据库路径))SQLiteConnection .创建文件(数据库路径);创建表();} public static void create table(){ execution query(CodeDetailTabale,null);}私有静态字符串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、使用到自己定义的锁私有静态对象lock对象=new对象();b、使用完连接后都进行关闭操作。
使用了使用c、创建数据库命令:SQLiteConnection .创建文件(数据库路径);最后再讲解个插入或替换到的经典用法复制代码代码如下:插入或替换到用户(身份证、姓名、年龄)选择旧的。身份证,新的。名字,新的。年龄起点(选择"春阳"作为名称,"25"作为年龄)作为新的左连接(选择标识,用户名称,其中名称="春阳")作为旧对旧。名称=新。名字