C#中使用SQLite数据库的方法介绍
程序员文章站
2024-03-07 10:33:33
【sqlite管理工具简介】 推荐以下2款: navicat for sqlite:功能非常强大,几乎包含了数据库管理工具的所有必需功能,操作简单,容易上手。唯一的缺点是不...
【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必备的小工具。下载地址:http://fishcodelib.com/database.htm 下载地址
建议以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/>");
}
可以看到代码精简了很多。
推荐以下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必备的小工具。下载地址:http://fishcodelib.com/database.htm 下载地址
建议以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数据访问驱动下载地址:
推荐阅读
-
C#中使用SQLite数据库的方法介绍
-
asp.net(c#)开发中的文件上传组件uploadify的使用方法(带进度条)
-
C#中使用SQLite数据库的方法介绍
-
.NET中的异步编程-EAP/APM使用方法及案例介绍
-
asp.net(c#)开发中的文件上传组件uploadify的使用方法(带进度条)
-
.NET中的异步编程-EAP/APM使用方法及案例介绍
-
实例讲解Android App使用自带的SQLite数据库的基本方法
-
使用 C# 中的 dynamic 关键字调用类型方法时可能遇到的各种问题
-
C#和asp.net中链接数据库中参数的几种传递方法实例代码
-
简单介绍MySQL中索引的使用方法