本文转载自 http://www.tntserver.cn/article.asp?id=41
今天遇到个问题.
首先插入一个DataTime格式的数据:
string sql="insert into [table] (date_time) values('" + date_time.ToString() + "'";
执行如上命令.插入没有报告错误.
但是,我又用一条命令读取时:
string sql="select * from [table];
.....
IDataReader dr=cmd.ExecuteReader();
...
object obj=dr["data_time"];//在这里出错了,说是无法转换为DataTime格式,字符串不正确
--------------------------------------------------------------------------------------------
我找了一天的教程,找了一天的google.
答案是:sqlite用的全球时间UTC,要用datetime()函数转换若干.
我也试了,发现好像运行的不像教程上说的那样!
实在没办法,来硬的吧,硬着头皮看源代码吧.
他的继承格式大致如下:
SqliteConvert-->SqliteBase-->Sqlite3
在SqliteConvert中定义了转换格式,上面说的很明白,默认DataTime格式为 ISO8601
然后,SqliteConnection 用到了Sqlite3.
我就研究了SqliteConnection的源代码,发现Sqlite不是用的什么全球的UTC时间.
其实就是用的国际标准ISO 8601标准.
那我就着手看怎么才能让 ......
SqLite.net的dll为System.Data.SQLite.dll,这种dll分为32位、64位和适用于compactframework三种,在引用时要注意,选择正确的dll。
将要保存图片的字段类型设为blob。代码如下:
private void savePicture()
{
using (SQLiteConnection cnn = new SQLiteConnection(dbPath))
{
cnn.Open();
using (SQLiteCommand cmd = cnn.CreateCommand())
{
//cmd.CommandText = "Create Table test(data Image)";
//cmd.ExecuteNonQuery();
cmd.CommandText = "insert into person values('12',@data,'14','13')";
SQLiteParameter para = new SQLiteParameter("@data", DbType.Binary);
string file = @"F:\Image\飞机.png";
FileStream fs = new FileStream(file, FileMode.Open);
//StreamUtil su = new StreamUtil();
//byte[] buffer = su.StreamToBytes(fs);
byte[] buffer ......
SqLite.net的dll为System.Data.SQLite.dll,这种dll分为32位、64位和适用于compactframework三种,在引用时要注意,选择正确的dll。
将要保存图片的字段类型设为blob。代码如下:
private void savePicture()
{
using (SQLiteConnection cnn = new SQLiteConnection(dbPath))
{
cnn.Open();
using (SQLiteCommand cmd = cnn.CreateCommand())
{
//cmd.CommandText = "Create Table test(data Image)";
//cmd.ExecuteNonQuery();
cmd.CommandText = "insert into person values('12',@data,'14','13')";
SQLiteParameter para = new SQLiteParameter("@data", DbType.Binary);
string file = @"F:\Image\飞机.png";
FileStream fs = new FileStream(file, FileMode.Open);
//StreamUtil su = new StreamUtil();
//byte[] buffer = su.StreamToBytes(fs);
byte[] buffer ......
这段时间在做CMS(客户管理系统,不是内容管理)的访问管理功能,要求实现对服务提供设备,客户端,计费,权限认证等信息的存储统计,远程管理。要求系统发布要方便,远程管理软件要跑在WIN平台。考虑到系统规模,客户要求,最后选择了WIN+ACCESS的方案,而最近又发现一个免费的SQLITE,而且可能在以后的手持设备上用,花点时间做了如下的简单性能测试。
ACCESS 插入性能测试:
平台:SYS:WINXP;CPU:2*1.6GHZ;RAM:1G;APP:VC+ADO
1.单条显式事务:
1 00条: 0.55S
1000条: 5s
10000条: 50s
2.单条非显式事务:
100条:31ms
1000条:156ms
10000条:1500ms
3.批量事务:
1 00条:16ms
1000条:141ms
10000条:1469ms
以上可以看出,ACCESS单条非显式事务插入的时间几乎和批量事务的插入时间一样,这大概就是网上得出ACCESS快于sqlite的原因吧,但是;单条非显式事务的
方式只能用单连接,如果有多个连接并发访问,则会出现严重问题,在一个链接插入后的相当长一段时间内(有时数S),其它链接都无法插入数据库。可以推理
ADO+ACC ......
这段时间在做CMS(客户管理系统,不是内容管理)的访问管理功能,要求实现对服务提供设备,客户端,计费,权限认证等信息的存储统计,远程管理。要求系统发布要方便,远程管理软件要跑在WIN平台。考虑到系统规模,客户要求,最后选择了WIN+ACCESS的方案,而最近又发现一个免费的SQLITE,而且可能在以后的手持设备上用,花点时间做了如下的简单性能测试。
ACCESS 插入性能测试:
平台:SYS:WINXP;CPU:2*1.6GHZ;RAM:1G;APP:VC+ADO
1.单条显式事务:
1 00条: 0.55S
1000条: 5s
10000条: 50s
2.单条非显式事务:
100条:31ms
1000条:156ms
10000条:1500ms
3.批量事务:
1 00条:16ms
1000条:141ms
10000条:1469ms
以上可以看出,ACCESS单条非显式事务插入的时间几乎和批量事务的插入时间一样,这大概就是网上得出ACCESS快于sqlite的原因吧,但是;单条非显式事务的
方式只能用单连接,如果有多个连接并发访问,则会出现严重问题,在一个链接插入后的相当长一段时间内(有时数S),其它链接都无法插入数据库。可以推理
ADO+ACC ......
1、.back ?DB? FILE 备份DB(默认为main)到文件
2、.bail ON|OFF 遇到一个错误扣停止,该值默认为OFF
3、.databases 列举附加到数据库的数据库名和文件名
4、.dump ?TABLE? ... 用SQL文本格式列举数据库,如果指定TABLE,仅仅列举匹配的表,LIKE类型TABLE
5、.echo ON|OFF 设置echo的状态可以为ON或者OFF
6、.exit 退出程序
7、.explain ?ON|OFF? 设置EXPLAIN的输出模式为ON或者OFF,如果没有参数,EXPLAIN默认设置为ON
8、.genfkey ?OPTIONS?
选项设置如下:
--NO-DROP:表示不删除旧的fkey触发器
--IGNORE-ERRORS:表示忽略含有fkey错误的表
--EXEC:表示立即执行生成的SQL语句
在信息源中查看文件tool/genfkey.README来进一步了解更详细的内容
9、.help 显示SQLite的操作指南
10、.import FILE TABLE 表示向表中导入数据
11、.indices ?TABLE? 显示所有的索引名,如果指定TABLE,那么仅仅显示指定表的索引,例如,表等配套模式
12、.load FILE ?ENTRY? 加载一个外部的库
13、.mode MODE ?TABLE? 设置输出模式,可 ......
首先做点铺垫说明:
sqlite程序通过查找分号(;)来决定一个SQL语句的结束,所以要执行SQL语句请确保在SQL语句后有分号(;).如果你省略分号,sqlite3将给你一个连续的命令提示符(...> )并等你给当前的SQL命令添加更多的文字。这个特点让你输入多行的多个SQL语句.但点号(.)命令不要分号(;).ctrl+c可以结束当前命令。
在dos窗口输入sqlite3 test.db,然后回车,结果如下:
F:\>sqlite3 test.db
SQLite version 3.6.16
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
此时我们并没有在F盘下看到 test.db,需要在输入分号(;)然后回车如下:
F:\>sqlite3 test.db
SQLite version 3.6.16
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> ;
sqlite>
我们现在就可以看到在F盘下有test.db文件了。
附:此命令如果没有test.db数据库则创建,如果有则打开,实例见下文。
建立表(websites),
命令
CREATE TABLE [websites] (
[WebID] INTEGER NOT NULL PRIMARY KEY,
[WebName] VARCHAR(20) NULL
);
注意;不可少";"号不可缺少,否则不执行。
插入数据:
insert into [websites] ([WebNa ......
可以接着上一步操作,直接向DOS窗口输入.help命令来查看SQLite的所有命令行及解释如下:
F:\>sqlite3
SQLite version 3.6.16
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .help
也可以ctrl+c结束命令,想DOS窗口 输入sqlite3执行后再输入.help命令如下:
F:\>sqlite3
SQLite version 3.6.16
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .help
显示如下:
.backup ?DB? FILE
Backup DB (default "main") to FILE
.bail ON|OFF
Stop after hitting an error. Default OFF
.databases
List names and files of attached databases
.dump ?TABLE? ...
Dump the database in an SQL text format
.echo ON|OFF
Turn command echo on or off
.exit
Exit this program
.explain ON|OFF
Turn output mode suitable for EXPLAIN on or off.
.genfkey ?OPTIONS?
Options are:
--no-drop: Do not drop old fkey triggers.
--ignore-errors: Ignore tables with fkey errors
--exec: Execute generated SQL immediately
......