分享一个SqliteHelper类

SQLite作为一个本地文件数据库相当好用,小巧、快速、支持事务、关系型,甚至可以运行在Android上。在很久以前的一个项目中,我们用过它来将接收到的数据做本地统计,数据量很大,甚至于我们想自己搞个内存空间专门做缓存,缓存满后再一点点地往SQLite中移,现在看起来是多余的,这也不符合开发的过程。在开发中,应该先把功能做出来,如果有性能问题,再找出解决方法。直接在SQLite中做插入而不是先在内存中做,它的效率已经达到了要求。

现在跟大家分享一个对SQLite操作的帮助类,使用它可以对本地SQLite数据库进行方便的操作。

如有引用,注意写明转自:http://www.cnblogs.com/wgp13x/p/3868916.html

关键词:SQLite, C#, sqlite3.dll, SQLite Expert
摘要:SQLite作为一个本地文件数据库相当好用,小巧、快速、支持事务、关系型,在之前的一个项目中使用了它,现在把这使用经验总结一下,分享给大家。

 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();
}
}
}
SQLite的语法跟标准的SQL语法不太一样,比如isnull(x, y) --> 如果x为空则应该返回y,SQLite就不支持,取代的是ifnull(x, y),使用起来也很方便。
这里提供了C#版本的的操作代码,JAVA版本的也差不多。
 
做了这个项目,回头看以前写的代码,惨不忍睹,太烂。尤其是关于C#多线程的,线程之间同步处理的一笔吊糟,经常缝缝补补,代码逻辑混乱。
做完后自己就立马总结了一下,关于多线程的同步,不到万不得以,不要自己做。
lock (BackWorker.ProduceLocker) {  Monitor.Pulse(BackWorker.ProduceLocker); }
lock (BackWorker.ConsumeLocker) {  Monitor.Wait(BackWorker.ConsumeLocker);  }
这类的,非常容易把自己绕进去,而且脱离了面向对象的思想。
多线程同步无非是因为多个线程同时对同一份数据有了同时操作,它们之间得分出个先后次序来,
这在JAVA中提供了线程安全的集合在java.util.concurrent包中,这就不需要自己在线程中手动做同步了,这也非常符合面向对象的思想。
SQLite本身应该提供了多线程访问的支持。
之后的多线程开发就是使用了线程安全的集合,代码结构简单

分享一个SqliteHelper类的更多相关文章

  1. 分享一个md5类

    这个md5干嘛用的,大家比我清楚就不说了,这里不是讲md5的原理.要讲md5的原理,网上一大堆,我也不是什么算法很厉害的人,我只是算法搬运工.咱是一般程序员,有时候能完成业务需要就可以,那些伟大算法的 ...

  2. 分享一个手机端好用的jquery ajax分页类

    分享一个手机端好用的jquery ajax分页类 jquery-ias.min.js 1,引入jquery-ias.min.js 2,调用ajax分页 <script type="te ...

  3. 分享一个Snackbar工具类 SnackbarUtils;

    分享一个Snackbar工具类,源代码也是在Github上面找的,自己做了一下修改: 功能如下: 1:设置Snackbar显示时间长短                 1.1:Snackbar.LEN ...

  4. 分享一个自定义的 console 类,让你不再纠结JS中的调试代码的兼容

    问题的产生 在写JS的过程中,为了调试我们常常会写很多 console.log.console.info.console.group.console.warn.console.error代码来查看JS ...

  5. .Net Excel 导出图表Demo(柱状图,多标签页) .net工具类 分享一个简单的随机分红包的实现方式

    .Net Excel 导出图表Demo(柱状图,多标签页) 1 使用插件名称Epplus,多个Sheet页数据应用,Demo为柱状图(Epplus支持多种图表) 2 Epplus 的安装和引用 新建一 ...

  6. 分享一个简单的C#的通用DbHelper类(支持数据连接池)

    每次新项目的时候,都要从头去找一遍数据库工具类.这里分享一个简单实用的C#的通用DbHelper工具类,支持数据连接池. 连接池配置 <connectionStrings> <add ...

  7. 分享一个的c++写的,模仿awk的框架类CAwkDoc

    这是我好多年前,模仿awk写的. awk大家都比较熟悉,使用awk处理文件,读取文件,分割字段这些工作awk自己帮你实现了. 程序员只要编写业务逻辑代码,并且awk还提供了很多常用的字符串操作函数,可 ...

  8. 分享一个动态生成RDLC报表的类

    在实际工作中,当需要进行大批量查询和生成报表的时候,可以使用我写的类. 特点: 无需报表设计器.无需为报表设置数据集 只需要传入查询结果就可以全自动生成报表,传入的对象为Dynamic(目前支持Dat ...

  9. Android 分享一个SharedPreferences的工具类,方便保存数据

    我们平常保存一些数据,都会用到SharedPreferences,他是保存在手机里面的,具体路径是data/data/你的包名/shared_prefs/保存的文件名.xml, SharedPrefe ...

随机推荐

  1. 移动端适配(2)——viewport适配

    通过viewport来适配 <script> (function(){ var w=window.screen.width; console.log(w);//获取屏幕尺寸 var tar ...

  2. 1004. 填充矩形 (Standard IO)

    题目描述 已知矩形的大小为n×m,现用a×a的正方形填充该矩形.输入三个正整数n,m,a(n,m,a≤10^9),计算至多能填入多少正方形?(正方形可以正好碰到矩形边界,但不能超出矩形外) 输入 一行 ...

  3. js权威指南学习笔记(三)语句

    1.声明语句 如果用var声明的变量没有初始化,那么这个变量的值会被初始化为undefined. 函数声明语句的语法如下:       4 4           1 console.log(func ...

  4. js权威指南学习笔记(一)类型、值和变量

    1.数据类型:原始类型(primitive type) 和对象类型(object type) 原始类型包括数字.字符串和布尔值: 除数字.字符串.布尔值.null(空).undefined(未定义), ...

  5. 配合sublime使用flexible.js实现微信开发页面自适应

    什么是flexible.js 是一个终端设备适配的解决方案.也就是说它可以让你在不同的终端设备中实现页面适配. 是一个用来适配移动端的javascript框架.根据宽度的不同设置不同的字体大小,样式间 ...

  6. FeatureLayer 里属性数据的提取与显示

    我们用工程文件所发布的WebServer下,包含一个个图层,这些图层根据顺序进行了 0 开始的编号,这些就是FeatureLayer的地址了! FeatureLayer 包含了地图的属性信息,十分好用 ...

  7. hive配置参数的说明:

    hive.ddl.output.format:hive的ddl语句的输出格式,默认是text,纯文本,还有json格式,这个是0.90以后才出的新配置: hive.exec.script.wrappe ...

  8. 04_dubbo_ioc

    [dubbo的IOC实现方法] dubbo的IOC具体实现在:T injectExtension( T instance )方法中,该方法在3个地方被使用: ExtensionLoader.getEx ...

  9. 01_微信小程序支付

    [支付流程] 1.小程序内调用登录接口,获取到用户的openid(我们这一步骤让前端去获取) 2.服务端代码这边生成订单 3.服务端调用支付统一下单的api 4.服务端将再次签名,返回5个参数(前端得 ...

  10. Retrofit实现图文上传至服务器

    Retrofit实现图文上传至服务器 前言:现在大多数的项目中都涉及图片+文字上传了,下面请详见实现原理: 开发环境:AndroidStudio 1.引入依赖: compile 'com.square ...