安装98及SQLite部署资料收集
win98 :Q99JQ-HVJYX-PGYCY-68GM3-WXT68
Full Source Included. 100% Free.
The full source to the wrapper and SQLite engine is in the public domain. There are zero licensing restrictions for private or commercial use.
在Win2K下,每次安装Microsoft .NET Framework 2.0的时候都提示错误:缺少系统必备的程序:Microsoft Windows Installer 3.0 !
那么Microsoft Windows Installer 3.0是什么东西啊?——微软Windows Installer作为Win2K/WinXP的组件之一,是专门用来管理和配置软件服务的工具。在Win95、Win98、WinMe与WinNT4.0下,作为额外的产品提供,允许用户有效地安装与配置软件产品与应用程序。新的Installer提供给软件产品新的特性,例如使用命令行安装产品、增加了用户的可定制性。
新版本是:sqlite-netFx 1.0.74.0
然后有各种版本二叉选择。 你可以 32/64 位选择 , 也可以选择基于不同的 .net frame版本。
果断选了 4.0 的。又因为自己机器是64bit的,很SB的选择了 64bit的版本!坑爹!
64bit版本有3个dll哦!和 32bit的不同!多出来一个 SQLite.Interop.dll
而且我忘了我的工程是x86的就是32bit啦! 还SB的弄上64bit 的 sqlite
莫名崩溃!!!!说缺少 SQLite.Interop.dll , 尼玛就在旁边看不到咩!
其实是我SB啦,伦家是32bit的啦,不认64的 SQLite.Interop 啊!!
今天再次比较两个不同版本的SQLite驱动,
---------------新版本-----------------------
文件大小: 156 KB
Assembly Version 1.0.60.0
备注: ADO.NET 2.0 Data Provider for SQLite
产品版本: 1.0.60.0
产品名称: System.Data.SQLite
公司: http://sqlite.phxsoftware.com
内部名称: System.Data.SQLite.dll
文件版本: 1.0.60.0
源文件名: System.Data.SQLite.dll
--------------老版本--------------------------
文件大小: 615 KB
备注: http://sqlite.phxsoftware.com
产品版本: 1.0
产品名称; System.Data.SQLite
内部名称: SQLite.Interop.DLL
文件版本: 1.0.48.0
源文件名: SQLite3.DLL 3.5.4
仔细比较一下,他们最大的区别是老版本文件是Interop 版本的,是一个符合COM标准的独立包装版本,可以被
非托管语言调用,如C,C++,VB等,
新版本 完全在 .NET下编译的,继承了ADO.NET2.0的大量特性,官方文档甚至说能够完全脱离.NET环境运行,它就是原来SQLite3.dll的完全替代品。
究竟这两者在实际使用中有没有效率差异,我写了一个测试程序,下面是测试结果:
==非调试环境==
采用SQLite老版本驱动,37337条 ,XML文件,导入数据,35秒,38秒,34秒,40秒,
新版SQLite驱动, 36秒,21秒,33秒,34秒。
让托管代码对象和非托管对象协同工作的过程称为互用性(interoperability),通常简称为 interop。
Visual Studio .NET 通过引入面向CLR(Common Language Runtime 通用语言运行时)的托管代码概念,使开发人员在创建和运行应用程序的方式上有了重大改变。托管代码提供了包括自动内存管理、基于属性的编程和公共类型系统等在内的许多优点。不幸的是,正是这些功能强大、独树一帜的特性也使得它与以往基于 Windows API 和 COM 对象的编程有了本质区别。虽然 Visual Studio .NET 也在尽力使得使用和创建非托管代码容易一些,但有些情况下使用非托管代码是很困难的。
SqlIte 3.5.4 (for .net)
I've got the same problem as Poorter on Windows 98 with the current version 1.0.60.
Yes, of course, Windows 98 is no longer supported by Microsoft for a long time, but .NET Framework 2.0 works fine on it and therefore it would be great if you could have a look at this problem.
I did a quick test, and in 1.0.48 it works, but in 1.0.49 it stopped working on Windows 98.
Fortunatelly I have started using System.Data.SQLite with it's version 1.0.48 (apparently last version working on Win 98!),
我使用的是1.0.48版,这个版本包括了SQLite引擎和ADO.NET的封装。作者把它们合并到了一个dll文件中。这个dll同时支持native code或managed code调用。但在1.0.50版本的更新中,已经取消了这样的方式。 即ADO.NET provider for SQLite和SQLite.Interop分开单独提供。所以后续版本的System.Data.SQLite.dll文件仅是一个ADO.NET provider for SQLite,不包含SQLite的源码,而nativer的封装在SQLite.Interop.xxx.dll这样的文件中。System.Data.SQLite.dll使用时需要p/invoke SQLite.Interop.xxx.dll。引用了新的程序集后,没有发现上面这个异常。
作者在后续的版本中提供了ManagedOnly的System.Data.SQLite.dll,使用时需要native sqlite3.dll or Linux shared library from http://www.sqlite.org,我在asp.net 中测试可以使用,但在.NET CF中异常。看来这个ManagedOnly应该不支持arm平台。
解决方法是把使用到了System.Data.Sqlite的项目的编译平台改为X86,而不是所有平台或X64.
原因是如果是“所有平台”,那么CLR只会搜索针对“所有平台”的System.Data.Sqlite.dll。而如果是"X86"或"X64",则会搜索相同平台及所有平台的版本。
而System.Data.Sqlite.dll本身因为使用了 Native Code, 所以不能编译成所有平台的版本。
System.Data.SQLite (SQLite Ado.Net provider)是一个原始SQLite的加强版. 它将是一个原版的sqlite3.dll完全替代品 (你甚至就可以把它重命名为sqlite3.dll). 它不需要链接.NET 运行时,所以可以脱离.NET独立发布, 然而它内嵌了一个完整的 ADO.NET 2.0 引擎,为开发提供了完整的支持.
以下是它的特性简介:
完整的 ADO.NET 2.0 实现
整个工程完全基于VS2005 和 ADO.NET 2.0全新构建, 使用了全部的ADO.NET framework新特性. 包括完整的 DbProviderFactory 支持, 自动的分布式事务调用, 广泛的模式支持, 此外所有的类都是从 ADO.NET 2.0 的基类继承下来的.
支持完整和精简的 .NET Framework 以及 C/C++
这个库不需要链接依赖.NET运行时,100%兼容原始的sqlite3.dll,可以使用非托管的C/C++ 进行开发.
可移植的数据库文件
未加密的 SQLite 数据库文件可以自由的跨平台和处理器使用,包括非Windows平台. 加密之后的数据库可以在全部Windows平台上使用.
可以信赖的速度,比包括Sql Server Mobile 在内的其它大多数嵌入式数据库都要快速
SQLite'安装所占用的空间相对于Sql Mobile可谓忽略不计了. 它在运行的时候占用更少的内存,同时生成的数据库也更小.
数据库加密
可以对整个数据库文件进行加密. 支持二进制和明文的密码.
支持使用Visual Studio 2005 设计
你可以向Server Explorer添加一个SQLite 连接, 使用查询设计器创建处查询语句, 向一个数据集中拖拽一个表格等等! SQLite的开发者可以在包括体验版在内的各种Visual Studio 2005下工作.
单文件再发布包容量在400kb以下
将SQLite本身和ADO.NET 封装捆绑编译在一起. 预编译的二进制文件提供了 x86, IA64, x64 和ARM 的版本.
广泛的SQL语言支持
SQLite 支持大部分的SQL92 标准(see below). 支持命名和未命名的参数以 UTF-8 和UTF-16 编码通过优化的管道传入SQLite 内核.
用户自定义的函数 和 排序
全面支持用户自定义函数和排序方式,意味着你可以用自己喜欢的.NET语言来实现SQLite没有提供的特性. 这一切将非常的简单.
提供了全部的源代码. 100% 免费.
全部的封装库源代码都是公有的. 无论是个人还是商业应用都没有任何的协议约束.
SQLite介绍
在介绍System.Data.SQLite之前需要介绍一下SQLite,SQLite是一个类似于Access的单机版数据库管理系统,它将所有数据库的定义(包括定义、表、索引和数据本身)都保存在一个单一的文件中。并且,SQLite是一个用C实现的类库,它在内存消耗、文件体积、简单性方面都有不错的表现,如果数据在10W条以下,查询速度也是相当快的。
SQLite具有以下特征:
实现多数SQL92的标准,包括事务(原子性、一致性、隔离性和持久性)、触发器和大多数的复杂查询。
不对插入或者更新的数据进行类型检查,你可以将字符串插入到整数列中(这个可能让有些用户不太适应)。
支持Windows/Linux/Unix等主流系统,还支持嵌入式系统如Android或Windows Mobile。
System.Data.SQLite
System.Data.SQLite是SQLite的加强版,它可以无需.NET Framework支持,由于它内部包含了一个ADO.NET 2.0引擎,所以.NET开发人员可以利用System.Data.SQLite方便地开发.NET程序。
System.Data.SQLite及SQLite也有一些限制,比如不支持行级及表级锁,当一个连接锁定数据库以用于写入数据,其它的数据库连接只能等待那个连接操作完成之后进行读写操作,SQLite.NET尝试在超时期内多次尝试。
实际上对于大型的应用我们都会选择一些大型专业的数据库,System.Data.SQLite和SQLite适合于一些受限的场合,比如手机等。在这里我讲一个真实的经历,在此前我曾经做过一个小型系统,要分析三个Excel文件,其中两个的记录大约在400条左右,而另外一个大约是1万条左右,对于这么一个系统如果使用数据库,即使单机版的Access,导入之后利用数据库的特性进行分析,将是一个相对较为简单的事情,因为我们可以在数据库里使用连接查询,还可以对记录使用数据库函数,但是对方提供的信息是部署的机器上尽管安装了Office,但是只是安装了Word、Excel和Outlook,而没有Access,对方也不希望安装其它的软件,由于我也不能确定没有安装Access的机器上是否能通过OleDB访问.mdb文件,所以没有办法,只有才有内存表的形式,即将Excel中的数据读取到DataTable中,然后对三个DataTable进行分析,尽管做了很多优化,但是效率仍然不是太理想。对于这种情况,如果我当时知道System.Data.SQLite就好办多了,将三个Excel中的数据导入到System.Data.SQLite中,然后利用System.Data.SQLite提供的函数处理起来是相当省事和方便的。对于System.Data.SQLite来说,部署时不需要安装,仅需要一个System.Data.SQLite.dll就够了,这个dll仅866K!而且它不需要像使用Com组件那样需要注册。
System.Data.SQLite数据库通用类
针对对数据库的操作情况,分为以下几种情况:
创建数据库文件;
返回DataTable;
返回DataReader;
执行增删改,返回受影响的行数;
执行查询,返回第一行第一列(通常用于带有行函数的查询,如SUM/AVG/COUNT等);
返回库中所有的表;
因为在System.Data.SQLite中不存在存储过程,所以所有的操作都是基于文本的SQL语句,为了避免SQL注入,所以使用了参数化的SQL语句,这个数据库通用类如下
1.Sqlite:
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。
官方网站:http://www.sqlite.org/
2.ADO.NET2.0 Provider for Sqlite
ADO.NET2.0 Provider for SqlLite是.net平台下专门用于操作SqlLite数据库的Provider
Sqlite数据库的加密
最近在做一个winform的程序,考虑用Sqlite的数据库,小巧而实用,比Access强多了,不过需要加密,不过free版本没有实现加密,有一些c++的实现:比如:http://www.sqlite.com.cn/MySqlite/3/253.Html 和http://www.cppblog.com/niewenlong/archive/2007/06/01/25261.html 。不过,鉴于我对c++不是很精通,于是就采用了ADO.NET 2.0 SQLite Data Provider 这样可以直接利用它来创建一个加密的sqlite数据库。
有关c#代码如下:
1、创建空的sqlite数据库。
//方法一:创建一个空sqlite数据库,用IO的方式
FileStream fs = File.Create(“c:\\test.db“);
//方法二:用SQLiteConnection
SQLiteConnection.CreateFile(“c:\\test.db“);
创建的数据库是个0字节的文件。
2、创建加密的空sqlite数据库
SQLiteConnection.CreateFile(“c:\\test2.db“);
SQLiteConnection cnn = new SQLiteConnection(“Data Source=c:\\test2.db“);
SQLiteConnection cnn = new SQLiteConnection(“Data Source=D:\\test2.db“);
cnn.Open();
cnn.ChangePassword(“password“);
3、给未加密的数据库加密
cnn.Open();
cnn.ChangePassword(“password“);
4、打开加密sqlite数据库
//方法一
SQLiteConnection cnn = new SQLiteConnection(“Data Source=c:\\test2.db“);
cnn.SetPassword(“password“);
cnn.Open();
//方法二
SQLiteConnectionStringBuilder builder = new SQLiteConnectionStringBuilder();
builder.DataSource = @”c:\test.db“;
builder.Password = @”password“;
SQLiteConnection cnn = new SQLiteConnection(builder.ConnectionString);
cnn .Open();
注:
A、因为加密的函数是利用windows api,故加密后的数据库只能适用在windows平台,加密的方式是整体文件加密。
B、加密的算法是RC4,如果你想采用别的加密算法来加密,请参考ADO.NET 2.0 SQLite Data Provider 的源码来修改。
c、相关sqlite数据库操作类似ADO.NET 2.0。详见ADO.NET 2.0 SQLite Data Provider的帮助文档。
c、ADO.NET 2.0 SQLite Data Provider 版本为:1.0.53.0 ,SQLite版本 : 3.6.0。
d、开发环境为vs2008。
ADO.NET 2.0 SQLite Data Provider的下载地址:http://sourceforge.net/project/showfiles.php?group_id=132486&package_id=145568
有关sqlite的中文介绍,你可以看看这里:http://www.cnblogs.com/shanyou/archive/2007/01/08/615245.html
本文地址:http://www.watch-life.net/net-tip/sqlite-encrypted.html
SQLite第一个Alpha版本诞生于2000年5月. 至今已经有4个年头了. 而在今年的5月SQLite也迎来了一个新的里程: SQLite 3. SQLite官方网站: http://www.sqlite.org/
2、SQLite类型
SQLite的数据类型
首先你会接触到一个让你惊讶的名词: Typelessness(无类型). 对! SQLite是无类型的. 这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中, 无论这列声明的数据类型是什么(只有在一种情况下不是, 稍后解释). 对于SQLite来说对字段不指定类型是完全有效的
数据库加密
可以对整个数据库文件进行加密. 支持二进制和明文的密码.
哎~~~~ 一个常识性的错误,我加几行代码 (新增代码标记 "// <-------------------")。
using System.Data.Common;
using System.Data.SQLite;
// 创建数据库文件
File.Delete("test1.db3");
SQLiteConnection.CreateFile("test1.db3");
DbProviderFactory factory = SQLiteFactory.Instance;
using (DbConnection conn = factory.CreateConnection())
{
// 连接数据库
conn.ConnectionString = "Data Source=test1.db3";
conn.Open();
// 创建数据表
string sql = "create table [test1] ([id] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)";
DbCommand cmd = conn.CreateCommand();
cmd.Connection = conn;
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
// 添加参数
cmd.Parameters.Add(cmd.CreateParameter());
// 开始计时
Stopwatch watch = new Stopwatch();
watch.Start();
DbTransaction trans = conn.BeginTransaction(); // <-------------------
try
{
// 连续插入1000条记录
for (int i = 0; i < 1000; i++)
{
cmd.CommandText = "insert into [test1] ([s]) values (?)";
cmd.Parameters[0].Value = i.ToString();
cmd.ExecuteNonQuery();
}
trans.Commit(); // <-------------------
}
catch
{
trans.Rollback(); // <-------------------
throw; // <-------------------
}
// 停止计时
watch.Stop();
Console.WriteLine(watch.Elapsed);
}
执行一下,耗时 0.2 秒。这差距是不是太大了点?
为什么只是简单启用了一个事务会有这么大的差距呢?很简单,SQLite 缺省为每个操作启动一个事务,那么原代码 1000 次插入起码开启了 1000 个事务,"事务开启 + SQL 执行 + 事务关闭" 自然耗费了大量的时间,这也是后面显示启动事务后为什么如此快的原因。其实这是数据库操作的基本常识,大家要紧记,不好的代码效率差的不是一点半点。