posts - 194,  comments - 1484,  trackbacks - 6

最近接了个美国的小项目,主要需求是把盘点机导出的数据(DBF格式)和另外的数据(csv格式)合并生成新的数据表,方便查询纠错。对方没有安装ms Access,考虑到对方使用方便,就采用了sqlite,开发语言使用.net 2.0。 下面简单罗列下用过程中的几点体会。

Provider:通过使用其他开源软件的体会和网上搜索,Provider决定使用System.Data.SQLite

 

事务(DbTransaction):因为涉及数据导入合并,批量插入和更新等工作是必须的了,一开始没有显式调用事务,速度别提多慢,于是想当然觉得sqlite速度比access还慢,后来搜索发现,原来SQLite 缺省为每个操作启动一个事务,其实这是数据库操作的基本常识,不仅仅Sqlite需要注意这些,当然Access等不支持事务的不在此列。

索引(index):数据导入合并,插入和更新时都需要查询数据是否有重复以及存在,所以索引是不可以缺少的。

SQLiteParameter:批量插入的时候,为了省懒事,使用string.format来格式化插入,结果碰到“near "s": syntex error.”,经过跟踪,原来是单引号(')的问题,看来还是乖乖使用SQLiteParameter来规范地导入,并可以避免很多字符上的问题。

Update ...From(Cross Join in Update):Sqlite 不支持类似

UPDATE tbl1 SET col2 = tbl2.col2
FROM table1 tbl1 INNER JOIN table2 tbl2 ON tbl1.col1 = tbl2.col1

的update,替代的解决办法是:

UPDATE table1 SET col2 = (select col2 from table2 where table2.col1=table1.col1 limit 1)

where exists(select * from table2 where table2.col1=table1.col1); 

查询分析器:我选择SQLite Administrator,后来发现Firefox的插件(addons) Sqlite Manager也是不错的选择。

下面顺便列些和DotNet开发的和SQLite有关的项目:

Convert SQL Server DB to SQLite DB:C# utility to automatically do the conversion from SQL Server DB to SQLite DB(一个把ms SQL Server数据库自动转为SQLite DB的工具,包括源代码)。

SQLite Membership, Role, and Profile Providers:Complete, production-ready Membership, Role, and Profile providers for SQLite. Includes instructions for migrating data between SQL Server and SQLite.




posted on 2009-02-15 20:34 RubyPDF 阅读(8112) 评论(38) 编辑 收藏

FeedBack:
2009-02-15 21:15 | Ariex[未注册用户]
SQLiteMaestro也是个很不错的管理工具
 回复 引用   
#2楼[楼主]
2009-02-15 21:23 | RubyPDF      
@Ariex
谢谢你的推荐,第一次在真正项目中使用SQLite,本来以为和使用Access差不多,实际发现碰到的问题不少,有时候甚至觉得是在给自己找麻烦。

 回复 引用 查看   
2009-02-15 21:39 | pandaren      
@RubyPDF
多一种体验么 挺好的

 回复 引用 查看   
#4楼[楼主]
2009-02-15 21:43 | RubyPDF      
@pandaren
嗯,而且会继续考虑在更多的项目中使用SQLite,慢慢熟悉起来,也许更可以方便我开发软件和项目。


 回复 引用 查看   
2009-02-15 22:43 | 木头羊[未注册用户]
我的出错了,就没有法修复,SQLSERVER 有修复功能,这个没有的
 回复 引用   
2009-02-15 23:00 | chanzuo[未注册用户]
用于小项目的临时数据存储还可以,如果项目大了,可能用这个就有点。。。
呵呵,毕竟开源嘛,出了问题谁来解决?如果我商业项目还是会选择付费的数据库滴。

 回复 引用   
#7楼[楼主]
2009-02-15 23:06 | RubyPDF      
@chanzuo
同样的担忧也可以用在Access吧?
呵呵
这里不是讨论那个数据库好,而是根据我对具体项目的需求来定我是用Sqlite,MySql,ms Sql 还是Oracle(这个我最不熟悉,只是在一个项目中用过)。

另外说下,大公司用Sqlite的地方也不少。

 回复 引用 查看   
2009-02-15 23:23 | GAKAKI[未注册用户]
rails或者ruby activerecord配SQLITE
 回复 引用   
2009-02-15 23:25 | sharper[未注册用户]
sqlite 比较适合CS单机数据库,其不擅长高并发,无法替代在线业务系统的数据库
 回复 引用   
2009-02-16 09:03 | 深渊野鱼      
SqliteDeveloper很好用
目前只能用d版 sqlite可以用于并发不是非常大的场景 性能非常的好,如果对于小网站用sqlite足够了。 缺点:在线维护不方便。比如要扩数据结构。

 回复 引用 查看   
2009-02-16 09:08 | xjb      
在非windows系统还是很有优势的
 回复 引用 查看   
2009-02-16 09:39 | aierong      
lz您好,请教一个问题
我想在sqlite中,写一个这样的sql语句怎么写?
就是某个查询不存在时,往表里面插入数据

下面是我在sql2000中的写法:
IF NOT EXISTS (SELECT * FROM mydata WHERE data='abc' )
BEGIN
INSERT INTO mydata(Data) SELECT '1'
END

或者是:

SELECT * FROM mydata WHERE data='abc'
IF (@@ROWCOUNT=0)
BEGIN
INSERT INTO mydata(Data) SELECT '1'
END

您看看sqlite中有没有类似这样的sql语句?

 回复 引用 查看   
#13楼[楼主]
2009-02-16 09:47 | RubyPDF      
@aierong
其实在正文中已经给出了实现,这里再写一次吧:

INSERT INTO mydata(Data) SELECT '1'
WHERE  NOT EXISTS (SELECT * FROM mydata WHERE data='abc' )

 回复 引用 查看   
2009-02-16 09:48 | aierong      
@RubyPDF

谢谢你的指点

 回复 引用 查看   
#15楼[楼主]
2009-02-16 09:48 | RubyPDF      
@xjb
嗯,开发.net 2.0的winform,使用sqlite数据库,也许可以很方便地移植到非windows系统(基于MONO)。

 回复 引用 查看   
#16楼[楼主]
2009-02-16 09:51 | RubyPDF      
@sharper
嗯,至于SQLite的性能到底如何,我也不是很清楚;但我的项目是单机的简单数据管理程序,不需要那么复杂的sql操作,sqlite足够用了。

 回复 引用 查看   
2009-02-16 09:59 | aierong      
您好再问一个问题:
sqlite中多个sql语句间是否也和sql 2000一样用空格来区分?

例如在sql 2000中
SELECT * FROM mydata SELECT * FROM a INSERT INTO a SELECT 1
查询分析器知道是3条sql语句

 回复 引用 查看   
#18楼[楼主]
2009-02-16 10:01 | RubyPDF      
@aierong
sql 2000里可以这样写吗?

sqlite用“分号”,跟access一样。

 回复 引用 查看   
2009-02-16 10:04 | aierong      
--引用--------------------------------------------------
RubyPDF: @aierong
sql 2000里可以这样写吗?

sqlite用“分号”,跟access一样。
--------------------------------------------------------


sql 2000可以这样写
sql 2005也可以

sql 2005也可以用分号的
例如:
SELECT * FROM mydata;SELECT * FROM a;

 回复 引用 查看   
#20楼[楼主]
2009-02-16 10:14 | RubyPDF      
@aierong
谢谢,我还是习惯用分号间隔,并且把两条语句分行写,这样看着清晰些。

 回复 引用 查看   
2009-02-16 10:17 | aierong      
对了,再请教一个问题:
看你文章中提到SQLite Manager

它是否需要在火狐浏览器下运行,
我只有ie浏览器哦

我想找个数据库管理工具

 回复 引用 查看   
#22楼[楼主]
2009-02-16 10:29 | RubyPDF      
@aierong
那你可以用sqlite manager的程序版本,或者使用SQLite Administrator,我SQLite Administrator用得比较多,或者你可以用别人推荐的,连接在正文。

 回复 引用 查看   
2009-02-16 10:43 | aierong      
@RubyPDF

谢谢你哦

我找到了一个SQLiteSpy_1.8.8,不用安装,还挺好用的
你推荐的SQLite Administrator我也下载了,还有中文的呢

奇怪,我的数据库用SQLiteSpy都可以打开
用SQLite Administrator打开数据库时老报这错误,我新建立数据库也报这错误
cannot perform this operation on a closed dataset


 回复 引用 查看   
#24楼[楼主]
2009-02-16 10:47 | RubyPDF      
@aierong
没有碰到过,无法解答。

 回复 引用 查看   
2009-02-16 14:04 | 梁逸晨      
SQLite有一个不好的地方:版本问题,有好几个版本相互之间不兼容,导致了23楼说的那些问题。

除此以外,SQLITE完全可以代替ACCESS了

 回复 引用 查看   
#26楼[楼主]
2009-02-16 14:07 | RubyPDF      
--引用--------------------------------------------------
梁逸晨: SQLite有一个不好的地方:版本问题,有好几个版本相互之间不兼容,导致了23楼说的那些问题。

除此以外,SQLITE完全可以代替ACCESS了
--------------------------------------------------------


版本兼容是个问题,SQLite Administrator只支持2.x 和3.x,但我开始就用3.x版本,所以可以回避这个问题,另外就是需要专门的dump工具来实现版本切换了。

 回复 引用 查看   
2009-02-16 14:07 | viaivi[未注册用户]
--引用--------------------------------------------------
RubyPDF: @Ariex
谢谢你的推荐,第一次在真正项目中使用SQLite,本来以为和使用Access差不多,实际发现碰到的问题不少,有时候甚至觉得是在给自己找麻烦。
--------------------------------------------------------
不赞成,感觉挺好用

 回复 引用   
#28楼[楼主]
2009-02-16 14:08 | RubyPDF      
@viaivi

在使用的过程中碰到不少和access,sql server或者mysql感觉不一致的地方,等慢慢熟悉起来了,感觉还是很好用的,客户使用也方便。

btw,能介绍下你的使用体会吗?

 回复 引用 查看   
2009-02-16 14:45 | 玉开      
我有5篇关于sqlite的随笔,自荐一下
http://www.cnblogs.com/yukaizhao/tag/sqlite

 回复 引用 查看   
2009-02-16 14:47 | 玉开      
我用的sqlite管理工具是sqlite admin感觉还不错,缺点是显示中文数据乱码
 回复 引用 查看   
2009-02-16 17:27 | ZYB      
我在一个文档管理系统中也用过,感觉不爽,老是出现DB锁定。简直给自己找麻烦,后来干脆换了个sqlexpress用
 回复 引用 查看   
#32楼[楼主]
2009-02-17 07:47 | RubyPDF      
@ZYB
能说下一般会在什么时候碰到锁定的呢?
Firefox和Chrome都在使用sqlite,Mac的浏览器也用sqlite呢。


 回复 引用 查看   
2009-02-27 19:44 | 蓝色星球
@RubyPDF
你好。
看到您关于.net下使用SQLite数据库的文章,想请教您个问题。
从VS2008( NET 3.5)开始,微软出了个LINQ,也算是一种O/R Mapping框架吧。不知道您在真实的项目中,是否应用过LINQ呢?
您在使用SQLite数据库的时候,持久层是使用的什么框架,还是项目组自己实现的?

 回复 引用   
2009-02-27 19:46 | 蓝色星球
博主您好。想请教您个问题。
看到您也使用了SQLite数据库和.NET。不知道您的项目中持久层是使用的什么框架?还是项目组自己实现的呢?
您对.NET 3.0的LINQ和其他的持久层框架有何见解?

 回复 引用   
2009-02-27 19:48 | 蓝色星球
不好意思,浏览器出了点问题,回复发重了。
 回复 引用   
#36楼[楼主]
2009-02-27 23:15 | RubyPDF      
@蓝色星球
我仍然在使用.net 2.0,不过subsonic支持sqlite,而且有类似linq的技术,感觉还是比较好用的。

也许这篇文章你会有些兴趣,我还没有看,只是以前留意到,现在翻出来供你参考,

http://www.codeproject.com/KB/linq/linqToSql_7.aspx

Comprehensive Support for SQLite, Microsoft Access, SQServer2000/2005

 回复 引用 查看   
2011-01-24 15:06 | ITLOVER      
你提到:"一开始没有显式调用事务"
请问下,你最终是如何解决的?
好像单条语句不需要事务,批量操作的话,用事务性能要好的多。

 回复 引用 查看   
#38楼[楼主]
2011-01-27 10:26 | RubyPDF      
引用ITLOVER:
你提到:"一开始没有显式调用事务"
请问下,你最终是如何解决的?
好像单条语句不需要事务,批量操作的话,用事务性能要好的多。


先begin traction
批量导入工作
最后commit

这样上千条甚至更多的导入工作只有一个事务调用,大大增加了导入速度。

 回复 引用 查看