当前位置: 移动技术网 > IT编程>开发语言>.net > C#中使用SQLite数据库的方法介绍

C#中使用SQLite数据库的方法介绍

2017年12月12日  | 移动技术网IT编程  | 我要评论

重生之慧眼识夫,冯天魁的儿子,卡缦圣茶

【sqlite管理工具简介】
推荐以下2款:
navicat for sqlite:功能非常强大,几乎包含了数据库管理工具的所有必需功能,操作简单,容易上手。唯一的缺点是不能打开由system.data.sqlite.dll加密过的数据库。
database.net:台湾人用.net开发的全能数据库管理工具,可以管理多种数据库,包括mssql、mysql、ibm db2、oracle、access、excel、oledb、odbc等十多种数据库(或数据接口),功能没有navicat那么多,只包含最基本功能。对sqlite而言,database.net最大的优点是支持打开由system.data.sqlite.dll加密过的数据库,且可以随时对数据库设置密码,是.net下开发sqlite必备的小工具。下载地址: 移动技术网下载地址
建议以navicat for sqlite为主,database.net为辅,只要涉及到数据库加密时才用后者。
【操作sqlite实例】
操作sqlite的方法基本同其他数据库相同,但有一些区别:
『例1』整数似乎都是int64的。
查询出网站app_data目录下“省市.db”数据库中city表的总记录数
复制代码 代码如下:

sqliteconnection cn = new sqliteconnection("data source=|datadirectory|省市.db;version=3");
sqlitecommand cmd = new sqlitecommand("select count(*) from city", cn);
cn.open();
int recordcount = (int)(int64)cmd.executescalar();
cn.close();
response.write(recordcount);

sqlite中count函数返回的是一个int64的整数,这一点同mssql、access等不同。实际上,经过有限的使用发现,似乎所有integer字段的返回值都是int64,这一点未经过有效证实。executescalar方法返回一个object实例,按照c#规定,拆箱时进行标准转换,必须转换成该object实例实际存储的格式,因此分两步,先转换成int64,再转换成int。当然用.net中某些高级转换器如convert.toint32方法只要一步就可以了。
『例2』批量增删改时需要用事务,否则效率很低。
批量插入1000条记录,每条记录只有简单的id、name、password三个字段:
复制代码 代码如下:

sqliteconnection cn = new sqliteconnection("data source=c:\\测试.db3;version=3;password=12345");
sqlitecommand cmd = new sqlitecommand("select count(*) from test", cn);
cn.open();
int recordcount = (int)(int64)cmd.executescalar();
response.write("当前的总记录数:" + recordcount + "<br/>");
for (int i = 0; i < 1000; i++)
{
cmd.commandtext = "insert into test values(@id,@name,@password)";
cmd.parameters.addwithvalue("@id", i);
cmd.parameters.addwithvalue("@name", "姓名" + i);
cmd.parameters.addwithvalue("@password", (i * 2).tostring());
cmd.executenonquery();
}
cmd.commandtext = "select count(*) from test";
recordcount = (int)(int64)cmd.executescalar();
cn.close();
response.write("当前的总记录数:" + recordcount + "<br/>");

经过测试,这段代码中的for循环花费了70000~90000毫秒,一分钟多!
改用事务执行:
复制代码 代码如下:

sqliteconnection cn = new sqliteconnection("data source=c:\\测试.db3;version=3;password=12345");
sqlitecommand cmd = new sqlitecommand("select count(*) from test", cn);
cn.open();
int recordcount = (int)(int64)cmd.executescalar();
response.write("当前的总记录数:" + recordcount + "<br/>");
sqlitetransaction tran = cn.begintransaction();
cmd.transaction = tran;
try
{
for (int i = 0; i < 1000; i++)
{
cmd.commandtext = "insert into test values(@id,@name,@password)";
cmd.parameters.addwithvalue("@id", i);
cmd.parameters.addwithvalue("@name", "姓名" + i);
cmd.parameters.addwithvalue("@password", (i * 2).tostring());
cmd.executenonquery();
}
tran.commit();
}
catch
{
tran.rollback();
response.write("执行出错!");
}
finally
{
cmd.commandtext = "select count(*) from test";
recordcount = (int)(int64)cmd.executescalar();
cn.close();
response.write("当前的总记录数:" + recordcount + "<br/>");
}

经过测试,这段代码中的try部分只用了100~150毫秒!开启事务后,效率非常高!
『例3』一般开发中可以编写自己的数据库通用操作类,进一步封装ado.net。
如上面用事务操作的代码,改用数据库通用操作类后:
复制代码 代码如下:

sqlitedata md = new sqlitedata("data source=c:\\测试.db3;version=3;password=12345");
int recordcount = (int)(int64)md.executescalar("select count(*) from test");
response.write("当前的总记录数:" + recordcount + "<br/>");
md.createtransaction();
try
{
for (int i = 0; i < 1000; i++)
md.executenonquery("insert into test values(@id,@name,@password)", "@id", i, "@name", "姓名" + i, "@password", (i * 2).tostring());
md.committransaction();
}
catch
{
md.rollback();
response.write("执行出错!");
}
finally
{
recordcount = (int)(int64)md.executescalar("select count(*) from test");
md.close();
response.write("当前的总记录数:" + recordcount + "<br/>");
}

可以看到代码精简了很多。

【sqlite相关有用的链接地址】

sqlite官方网站:

sqlite内置核心函数参考文档:

sqlite日期时间函数参考文档:

sqlite数学函数参考文档:

sqlite相关sql语法参考文档:

system.data.sqlite.dll数据访问驱动下载地址:

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网