[转]SQLite内存数据库

http://www.cnblogs.com/liuyong/archive/2010/09/14/1826152.html

SQLite 介绍
一. SQLite 是实现了SQL 92标准的一个大子集的嵌入式数据库.其以在一个库中组合了数据库引擎和接口,能将所有数据存储于单个文件中而著名.我觉得SQLite的功能一定程度上居于MySQL 和PostgreSQL之间.尽管如此,在性能上面,SQLite常常快2-3倍 (甚至更多).这利益于其高度调整了的内部架构,因为它除去了服务器端到客户端和客户端到服务器端的通信。


二. 而令人印象深刻的特点是你可将你的整个数据库系统放在其中.利用非常高效的内存组织,SQLite只需在很小的内存中维护其很小的尺寸,远远比其它任何数据库系统都小.这些特点使得其成为在需要高效地应用数据库的任务中一个非常方便的工具.


SQLite 优势
一 . 除了速度和效率,SQLite还有其它好多的优势使得其能成为许多任务中一个理想的解决方案.因为SQLite的数据库都是简单文件,因此无须一个管理队伍花时间来构造复杂的权限结构来保护用户的数据库.因为权限通过文件系统自动进行.这也同时意味着(数据库空间的大小只与环境有关,与本身无关)无段特殊的规则来了解用户磁盘空间.用户可以从创建他们想要的任意多的数据库和对其对这些数据库的绝对控制权而得到好处.

 二  . 数据库就是一个文件的事实使用SQLite可以轻易地在服务器间移动.SQLite也除去了需要大量内存和其它系统资源的伺候进程.即使当数据库在大量地使用时也是如此. 

创建内存数据库

1.由于业务的需要,我使用SQLite 内存数据库制作一个缓存,IIS 停止内存数据库的数据全部丢失,不知道SQLite  是否可以做分布式的内存数据管理。 

2.添加using System.Data.SQLite  引用,程序集请到这里http://sqlite.phxsoftware.com/ 下载 

3.创建内存数据库 , Data Source=:memory:;Version=3;  这个连接字符串折腾了很久, 当然这里也可以使用文件来存储数据,只需要修改 Data Source=:memory:  为  Data Source= Cache.db  就ok !当然这个表需要在Global 里面创建   

SQLiteConnection conn = (SQLiteConnection)new SQLiteConnection("Data Source=:memory:;Version=3; Cache Size = 3000;New=True;Pooling=False;Max Pool Size=100;LongNames = 0; Timeout = 1000; NoTXN = 0; SyncPragma = NORMAL; StepAPI = 0");
               conn.Open();
               IDbCommand dbcmd = conn.CreateCommand();
               
//创建内存表
               string sql = "CREATE TABLE [AvTable] ( [ID] INTEGER  PRIMARY KEY NOT NULL,[CityPair] VARCHAR(6)  NULL,[FlightNo] VARCHAR(50)  NULL,[FlightDate] VARCHAR(10)  NULL,[CacheTime] VARCHAR(2000)  NULL,[AVNote] VARCHAR(2000)  NULL)";
               dbcmd.CommandText = sql;
               dbcmd.Connection = conn;
               dbcmd.ExecuteNonQuery();
               SQLiteConn = conn;

 全局属性,打开数据库连接后创建好表后赋值给这个属性,以后操作数据一致使用这个连接。 

  public static SQLiteConnection SQLiteConn { getset; }

 使用SQL  语句操作表如下, sql 是代表sql 语句 

 
     string sql = "Update AVTable Set CityPair='" + av.CityPair + "',CacheTime='" + DateTime.Now.ToString() + "',AVNote='" + av.AVNote + "' Where FlightNo='" + av.FlightNo + "' And FlightDate='" + av.FlightDate + "'";
               IDbCommand dbcmd = MemoryDatabse.SQLiteConn.CreateCommand();
               dbcmd.CommandText = sql;
               dbcmd.Connection = MemoryDatabse.SQLiteConn;
               
int count = dbcmd.ExecuteNonQuery();

string sql = "Update AVTable Set CityPair='" + av.CityPair + "',CacheTime='" + DateTime.Now.ToString() + "',AVNote='" + av.AVNote + "' Where FlightNo='" + av.FlightNo + "' And FlightDate='" + av.FlightDate + "'";
               IDbCommand dbcmd = MemoryDatabse.SQLiteConn.CreateCommand();
               dbcmd.CommandText = sql;
               dbcmd.Connection = MemoryDatabse.SQLiteConn;
               
int count = dbcmd.ExecuteNonQuery();

SQLite 的查询语法 和 SQL SERVER 有一些区别 。

 提取 avcache表 11-20 的数据 。

Select * From avcache Limit 9 Offset 10;     以上语句表示从avcache 表获取数据,跳过10行,取9行 。

 

另外一种写法, 从10 开始提取 提取9条数据 。

 select * from avcache limit10,9   

 

 语法

 sql = "select * from avcache  where "+条件+" order by "+排序+" limit "+要显示多少条记录+" offset "+跳过多少条记录;

 

 例子

 select * from avcache limit 15 offset 20      意思是说:   从avcache  表跳过20条记录选出15条记录

 

由于最近工作需要开始学习SQLite  ,写的难免有些粗糙的地方,希望大家指正,提供更好的方法!

作者: 火地晋
出处: http://yelaiju.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/yelaiju/p/1855873.html