分享一个SqliteHelper类
SQLite作为一个本地文件数据库相当好用,小巧、快速、支持事务、关系型,甚至可以运行在Android上。在很久以前的一个项目中,我们用过它来将接收到的数据做本地统计,数据量很大,甚至于我们想自己搞个内存空间专门做缓存,缓存满后再一点点地往SQLite中移,现在看起来是多余的,这也不符合开发的过程。在开发中,应该先把功能做出来,如果有性能问题,再找出解决方法。直接在SQLite中做插入而不是先在内存中做,它的效率已经达到了要求。
现在跟大家分享一个对SQLite操作的帮助类,使用它可以对本地SQLite数据库进行方便的操作。
如有引用,注意写明转自:http://www.cnblogs.com/wgp13x/p/3868916.html
using System;
using System.Data.SQLite;
using System.Data;
using System.Data.Common; namespace DXPlatformClientFramework.UC.StatAnalyzeCommon
{
public class SqliteHelper : IDisposable
{
public SQLiteConnection conn; public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
} protected virtual void Dispose(bool disposing)
{
if(disposing)
if(conn != null)
{
conn.Dispose();
conn = null;
}
} ~SqliteHelper()
{
Dispose(false);
} /// <summary>
/// 构造函数。
/// </summary>
/// <param name="dataBaseName">数据库名</param>
public SqliteHelper(string dataBaseName)
{
string connString = string.Format(@"Data Source={0}", dataBaseName);
conn = new SQLiteConnection(connString);
conn.Open();
} /// <summary>
/// 手动打开数据库。
/// </summary>
public void SqliteOpen()
{
if(conn != null && conn.State == ConnectionState.Closed)
conn.Open();
} /// <summary>
/// 通过执行SQL语句,获取表中数据。
/// </summary>
/// <param name="sError">错误信息</param>
/// <param name="sSQL">执行的SQL语句</param>
public DataTable GetDataTable(out string sError, string sSQL)
{
DataTable dt = null;
sError = string.Empty;
try
{
SQLiteCommand cmd = newSQLiteCommand() { CommandText = sSQL, Connection = conn };
SQLiteDataAdapter dao = newSQLiteDataAdapter(cmd);
dt = newDataTable();
dao.Fill(dt);
}
catch(Exception e)
{
sError = e.Message;
}
return dt;
} /// <summary>
/// 通过执行SQL语句,获取表中数据个数。
/// </summary>
/// <param name="sError">错误信息</param>
/// <param name="sSQL">执行的SQL语句</param>
public int GetDataCount(out string sError, string sSQL)
{
DataTable dt = newDataTable();
sError = string.Empty;
SQLiteCommand cmd = newSQLiteCommand() { CommandText = sSQL, Connection = conn };
try
{
SQLiteDataAdapter dao = new SQLiteDataAdapter(cmd);
dao.Fill(dt);
cmd.Dispose();
}
catch(Exception e)
{
sError = e.Message;
}
finally{ cmd.Dispose(); }
return int.Parse(dt.Rows[][].ToString());
} /// <summary>
/// 通过执行SQL语句,执行insert,update,delete 动作,也可以使用事务。
/// </summary>
/// <param name="sError">错误信息</param>
/// <param name="sSQL">执行的SQL语句</param>
/// <param name="bUseTransaction">是否使用事务</param>
public bool UpdateData(out string sError, string sSQL, bool bUseTransaction=false)
{
bool iResult = false;
sError = string.Empty;
if(!bUseTransaction)
{
try
{
SQLiteCommand comm = new SQLiteCommand(conn) { CommandText = sSQL };
iResult = comm.ExecuteNonQuery()>;
comm.Dispose();
}
catch(Exception ex)
{
sError = ex.Message;
}
}
else// 使用事务
{
DbTransaction trans = null;
trans = conn.BeginTransaction();
SQLiteCommand comm = new SQLiteCommand(conn) { CommandText = sSQL };
try
{
iResult = comm.ExecuteNonQuery()>;
trans.Commit();
}
catch(Exception ex)
{
sError = ex.Message;
iResult = false;
trans.Rollback();
}
finally{comm.Dispose();trans.Dispose();}
}
return iResult;
} /// <summary>
/// 使用事务执行多条相同的带参数的SQL语句。
/// </summary>
/// <param name="sqlString">SQL语句</param>
/// <param name="sqLiteParameters">每次SQL执行的参数</param>
public void ExecuteSqlTran(string sqlString, object[][] sqLiteParameters)
{
if(sqLiteParameters.Length == )
return;
using(DbTransaction trans = conn.BeginTransaction())
{
if(conn.State != ConnectionState.Open)
conn.Open();
SQLiteCommand cmd = conn.CreateCommand();
cmd.Connection = conn;
try
{
for(inti = ; i < sqLiteParameters[].Length; i++)
{
cmd.Parameters.Add(cmd.CreateParameter());
}
//循环
foreach(object[] sqlParameters insqLiteParameters)
{
ExecuteSqlNonQuery(cmd, sqlString, sqlParameters);
}
trans.Commit();
}
catch(Exception ex)
{
trans.Rollback();
throw;
}
finally
{
cmd.Dispose();trans.Dispose();
}
}
} /// <summary>
/// 不使用事务执行一条带参数的SQL语句。
/// </summary>
/// <param name="sqlString">SQL语句</param>
/// <param name="sqLiteParameters">SQL执行的参数</param>
public void ExecuteSql(string sqlString, object[] sqLiteParameters)
{
if(conn.State != ConnectionState.Open)
conn.Open();
SQLiteCommand cmd = conn.CreateCommand();
cmd.Connection = conn;
cmd.CommandText = sqlString;
try
{
for(inti = ; i < sqLiteParameters.Length; i++)
{
cmd.Parameters.Add(cmd.CreateParameter());
cmd.Parameters[i].Value = sqLiteParameters[i];
}
cmd.ExecuteNonQuery();
}
finally
{
cmd.Dispose();
}
} private void ExecuteSqlNonQuery(SQLiteCommand cmd, string cmdText, object[] cmdParms)
{
cmd.CommandText = cmdText;
if(cmdParms != null)
{
for(inti = ; i < cmdParms.Length; i++ )
{
cmd.Parameters[i].Value = cmdParms[i];
}
}
cmd.ExecuteNonQuery();
}
}
}
。分享一个SqliteHelper类的更多相关文章
- 分享一个md5类
这个md5干嘛用的,大家比我清楚就不说了,这里不是讲md5的原理.要讲md5的原理,网上一大堆,我也不是什么算法很厉害的人,我只是算法搬运工.咱是一般程序员,有时候能完成业务需要就可以,那些伟大算法的 ...
- 分享一个手机端好用的jquery ajax分页类
分享一个手机端好用的jquery ajax分页类 jquery-ias.min.js 1,引入jquery-ias.min.js 2,调用ajax分页 <script type="te ...
- 分享一个Snackbar工具类 SnackbarUtils;
分享一个Snackbar工具类,源代码也是在Github上面找的,自己做了一下修改: 功能如下: 1:设置Snackbar显示时间长短 1.1:Snackbar.LEN ...
- 分享一个自定义的 console 类,让你不再纠结JS中的调试代码的兼容
问题的产生 在写JS的过程中,为了调试我们常常会写很多 console.log.console.info.console.group.console.warn.console.error代码来查看JS ...
- .Net Excel 导出图表Demo(柱状图,多标签页) .net工具类 分享一个简单的随机分红包的实现方式
.Net Excel 导出图表Demo(柱状图,多标签页) 1 使用插件名称Epplus,多个Sheet页数据应用,Demo为柱状图(Epplus支持多种图表) 2 Epplus 的安装和引用 新建一 ...
- 分享一个简单的C#的通用DbHelper类(支持数据连接池)
每次新项目的时候,都要从头去找一遍数据库工具类.这里分享一个简单实用的C#的通用DbHelper工具类,支持数据连接池. 连接池配置 <connectionStrings> <add ...
- 分享一个的c++写的,模仿awk的框架类CAwkDoc
这是我好多年前,模仿awk写的. awk大家都比较熟悉,使用awk处理文件,读取文件,分割字段这些工作awk自己帮你实现了. 程序员只要编写业务逻辑代码,并且awk还提供了很多常用的字符串操作函数,可 ...
- 分享一个动态生成RDLC报表的类
在实际工作中,当需要进行大批量查询和生成报表的时候,可以使用我写的类. 特点: 无需报表设计器.无需为报表设置数据集 只需要传入查询结果就可以全自动生成报表,传入的对象为Dynamic(目前支持Dat ...
- Android 分享一个SharedPreferences的工具类,方便保存数据
我们平常保存一些数据,都会用到SharedPreferences,他是保存在手机里面的,具体路径是data/data/你的包名/shared_prefs/保存的文件名.xml, SharedPrefe ...
随机推荐
- 32位和64位系统内核函数调用从ZwProtectVirtualMemory到NtProtectVirtualMemory
0x01 前言 我们知道R3层中,Zw系列函数和Nt系列函数函数是一样的,但是在内核Zw系列函数调用了Nt系列函数,但是为什么要在内核设置一个Zw系列函数而不是直接调用Nt函数呢?Zw系列函数又是怎么 ...
- ES6学习准备
ES6学习准备 选择运行环境 ES6的语法,nodeJs.浏览器不一定都支持,不同版本的支持情况不一样.在学习过程中,如何确定是自己写的代码有问题,还是运行环境不支持呢? 首先,浏览器端一般支持的特性 ...
- SSH基本概念和用途
一.SSH是什么 简单的说,SSH是一种网络协议,主要用于客户端与远程主机的安全链接和交互. 二.常见用法1.客户端与远程主机的安全链接命令如下: $ ssh -p user@host 解释如下:-p ...
- 架构实战项目心得(十):基于spring-ladp的统一用户中心结构设计以及代码结构设计
一.目录设计 1 公司 2 部门 3 注册人员 4 层级人员 二.规则 1 注册 自行注册人员放到模拟公司的目录下,等所属公司组织结构建立完毕,将此人员迁移到所属公司(或者删除此人员,所属公司新建此人 ...
- Java - 谨慎覆盖clone
覆盖clone时需要实现Cloneable接口,Cloneable并没有定义任何方法. 那Cloneable的意义是什么? 如果一个类实现了Clonable,Object的clone方法就可以返回该对 ...
- logback.xml简单配置
感觉配置的没问题,但是控制台就是不输出日志,后来发现是jar的问题. 依赖包: 注意依赖包,没有其他,只有下面3个,因为Jar包的问题,浪费了很长时间 <dependency> <g ...
- 基于bootstrap的内容折叠功能
加入js及css支持: <link rel="stylesheet" href="css/bootstrap.min.css"/> <scri ...
- MVC 控制器中直接访问url 的方式
public void ShowDetailsImg() { //生成MD5码 string path = @"D:\其他\Test\WebApplication2\WebApplicati ...
- 洛谷P1024 一元三次方程求解(数学)
题意 题目链接 Sol 本来是一道好的公式题. 然后输出只要保留两位小数?? 直接上不就赢了嘛.. #include<bits/stdc++.h> #define LL long long ...
- easyui numberbox输入框 编辑不可编辑的切换
背景:申请单里需要选费用类型,费用类型有的有子明细项,有个合计项 当有子明细项的时候,合计项的值是通过弹出的子明细项价格的总和(设置为可编辑没问题,因为点击出来弹框,编辑不了) 没有子明细 ...