分享一个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 ...
随机推荐
- WPF的菜单栏,工具栏的简单使用
1. 界面效果如下: 2. 页面 .xaml代码如下: <Window x:Class="MenuAndToolBar.MainWindow" xmlns="htt ...
- Struts2入门介绍(二)
一.Struts执行过程的分析. 当我们在浏览器中输入了网址http://127.0.0.1:8080/Struts2_01/hello.action的时候,Struts2做了如下过程: 1.Stru ...
- [PY3]——内置数据结构(8)——解构与封装
### 解构的理解与用法 ### 解构是python很有特色的一个功能,被很多语言借鉴(例如ES6) # 元素按照顺序赋值给变量 In [31]: lst=list(range(5)) In [32] ...
- Firebird Case-Insensitive Searching 大小写不敏感查找
Firebird 默认是大小写敏感,在检索的时候. 要想不敏感检索,两种方法: 1.where upper(name) = upper(:flt_name) 2.检索时指定字符集collation,例 ...
- log4j记录日志 和 webAppRootKey关系
今天发现一个问题,就是后台从某天开始不再记录日志了,最后发现是 webAppRootKey 的 value 的值必须要和log4j的注入变量要一致. 如下:web.xml文件的 webAppRootK ...
- Silverlight & Blend动画设计系列十:Silverlight中的坐标系统(Coordinate System)与向量(Vector)运动
如果我们习惯于数学坐标系,那么对于Silverlight中的坐标系可能会有些不习惯.因为在Silverlight中的坐标系与Flash中的坐标系一样,一切都的颠倒的.在标准的数学坐标系中,X轴表示水平 ...
- 在 Azure 上创建和链接 Azure SQL 数据库
本快速入门介绍了如何在 Azure 门户中创建并连接 Azure SQL 数据库.在本教程中完成的所有操作均符合 1 元试用条件. 开始之前 如果您还没有 Azure 账户,可以申请 1 元试用账户. ...
- Java 不可变类
Java 不可变类 immutable object 不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值. 如JDK内部自带的很多不可变类:Interger.Long和String等. * ...
- 用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)
前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成“***”就可 ...
- VC 在调用main函数之前的操作
title: VC 在调用main函数之前的操作 tags: [VC++, 反汇编, C++实现原理] date: 2018-09-16 10:36:23 categories: VC++反汇编分析 ...