C#操作SQLite数据库帮助类详解

本文实例讲述了C#操作SQLite数据库帮助类。分享给大家供大家参考,具体如下:

最近有WPF做客户端,需要离线操作存储数据,在项目中考虑使用Sqlite嵌入式数据库,在网上找了不少资料,最终整理出一个公共的帮助类。

Sqlite是一个非常小巧的数据库,基本上具备关系型数据库操作的大多数功能,Sql语法也大同小异。下面是我整理的帮助类代码:

1.获取 SQLiteConnection 对象,传入数据库有地址即可。

/// <summary>
/// 获得连接对象
/// </summary>
/// <returns>SQLiteConnection</returns>
public static SQLiteConnection GetSQLiteConnection()
{
 //Sqlite数据库地址
 string str = AppDomain.CurrentDomain.BaseDirectory;
 var con = new SQLiteConnection("Data Source=" + str + "DataBass\\InfoServiceDbB.db");
 return con;
}

2.准备操作命令参数,构造SQLiteCommand 对象:

/// <summary>
/// 准备操作命令参数
/// </summary>
/// <param name="cmd">SQLiteCommand</param>
/// <param name="conn">SQLiteConnection</param>
/// <param name="cmdText">Sql命令文本</param>
/// <param name="data">参数数组</param>
private static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, Dictionary<String, String> data)
{
 if (conn.State != ConnectionState.Open)
  conn.Open();
 cmd.Parameters.Clear();
 cmd.Connection = conn;
 cmd.CommandText = cmdText;
 cmd.CommandType = CommandType.Text;
 cmd.CommandTimeout = 30;
 if (data!=null&&data.Count >= 1)
 {
  foreach (KeyValuePair<String, String> val in data)
  {
   cmd.Parameters.AddWithValue(val.Key, val.Value);
  }
 }
}

3.查询,返回DataSet

/// <summary>
/// 查询,返回DataSet
/// </summary>
/// <param name="cmdText">Sql命令文本</param>
/// <param name="data">参数数组</param>
/// <returns>DataSet</returns>
public static DataSet ExecuteDataset(string cmdText, Dictionary<string, string> data)
{
 var ds = new DataSet();
 using (SQLiteConnection connection = GetSQLiteConnection())
 {
  var command = new SQLiteCommand();
  PrepareCommand(command, connection, cmdText, data);
  var da = new SQLiteDataAdapter(command);
  da.Fill(ds);
 }
 return ds;
}

4.查询,返回DataTable

/// <summary>
/// 查询,返回DataTable
/// </summary>
/// <param name="cmdText">Sql命令文本</param>
/// <param name="data">参数数组</param>
/// <returns>DataTable</returns>
public static DataTable ExecuteDataTable(string cmdText, Dictionary<string, string> data)
{
 var dt = new DataTable();
 using (SQLiteConnection connection = GetSQLiteConnection())
 {
  var command = new SQLiteCommand();
  PrepareCommand(command, connection, cmdText, data);
  SQLiteDataReader reader = command.ExecuteReader();
  dt.Load(reader);
 }
 return dt;
}

5.返回一行数据 DataRow

/// <summary>
/// 返回一行数据
/// </summary>
/// <param name="cmdText">Sql命令文本</param>
/// <param name="data">参数数组</param>
/// <returns>DataRow</returns>
public static DataRow ExecuteDataRow(string cmdText, Dictionary<string, string> data)
{
 DataSet ds = ExecuteDataset(cmdText, data);
 if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
  return ds.Tables[0].Rows[0];
 return null;
}

6.执行数据库操作

/// <summary>
/// 执行数据库操作
/// </summary>
/// <param name="cmdText">Sql命令文本</param>
/// <param name="data">传入的参数</param>
/// <returns>返回受影响的行数</returns>
public static int ExecuteNonQuery(string cmdText, Dictionary<string, string> data)
{
 using (SQLiteConnection connection = GetSQLiteConnection())
 {
  var command = new SQLiteCommand();
  PrepareCommand(command, connection, cmdText, data);
  return command.ExecuteNonQuery();
 }
}

7.返回SqlDataReader对象

/// <summary>
/// 返回SqlDataReader对象
/// </summary>
/// <param name="cmdText">Sql命令文本</param>
/// <param name="data">传入的参数</param>
/// <returns>SQLiteDataReader</returns>
public static SQLiteDataReader ExecuteReader(string cmdText, Dictionary<string, string> data)
{
 var command = new SQLiteCommand();
 SQLiteConnection connection = GetSQLiteConnection();
 try
 {
  PrepareCommand(command, connection, cmdText, data);
  SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
  return reader;
 }
 catch
 {
  connection.Close();
  command.Dispose();
  throw;
 }
}

8.返回结果集中的第一行第一列,忽略其他行或列

/// <summary>
/// 返回结果集中的第一行第一列,忽略其他行或列
/// </summary>
/// <param name="cmdText">Sql命令文本</param>
/// <param name="data">传入的参数</param>
/// <returns>object</returns>
public static object ExecuteScalar(string cmdText, Dictionary<string, string> data)
{
 using (SQLiteConnection connection = GetSQLiteConnection())
 {
  var cmd = new SQLiteCommand();
  PrepareCommand(cmd, connection, cmdText, data);
  return cmd.ExecuteScalar();
 }
}

9.分页查询

/// <summary>
/// 分页查询
/// </summary>
/// <param name="recordCount">总记录数</param>
/// <param name="pageIndex">页牵引</param>
/// <param name="pageSize">页大小</param>
/// <param name="cmdText">Sql命令文本</param>
/// <param name="countText">查询总记录数的Sql文本</param>
/// <param name="data">命令参数</param>
/// <returns>DataSet</returns>
public static DataSet ExecutePager(ref int recordCount, int pageIndex, int pageSize, string cmdText, string countText, Dictionary<string, string> data)
{
 if (recordCount < 0)
  recordCount = int.Parse(ExecuteScalar(countText, data).ToString());
 var ds = new DataSet();
 using (SQLiteConnection connection = GetSQLiteConnection())
 {
  var command = new SQLiteCommand();
  PrepareCommand(command, connection, cmdText, data);
  var da = new SQLiteDataAdapter(command);
  da.Fill(ds, (pageIndex - 1) * pageSize, pageSize, "result");
 }
 return ds;
}

10.重新组织数据库

当你从SQLite数据库中删除数据时, 未用的磁盘空间将会加入一个内部的“自由列表”中。

当你下次插入数据时,这部分空间可以重用。磁盘空间不会丢失, 但也不会返还给操作系统。

如果删除了大量数据,而又想缩小数据库文件占用的空间,执行 VACUUM 命令。 VACUUM 将会从头重新组织数据库

你可以在你的程序中约定一个时间间隔执行一次重新组织数据库的操作,节约空间

public void ResetDataBass()
{
 using (SQLiteConnection conn = GetSQLiteConnection())
 {
  var cmd = new SQLiteCommand();
  if (conn.State != ConnectionState.Open)
   conn.Open();
  cmd.Parameters.Clear();
  cmd.Connection = conn;
  cmd.CommandText = "vacuum";
  cmd.CommandType = CommandType.Text;
  cmd.CommandTimeout = 30;
  cmd.ExecuteNonQuery();
 }
}

更多关于C#相关内容感兴趣的读者可查看本站专题:《C#常见数据库操作技巧汇总》、《C#常见控件用法教程》、《C#窗体操作技巧汇总》、《C#数据结构与算法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》

希望本文所述对大家C#程序设计有所帮助。

(0)

相关推荐

  • C#/.Net 中快速批量给SQLite数据库插入测试数据

    使用transaction: var stopwatch = new Stopwatch(); using (var cmd = new SQLiteCommand(db_con)) using (var transaction = db_con.BeginTransaction()) { stopwatch.Reset(); stopwatch.Start(); foreach (var item in sorted) { sql = string.Format("insert into db

  • C# SQLite事务操作方法分析

    本文实例讲述了C# SQLite事务操作方法.分享给大家供大家参考,具体如下: 在 C#中执行Sqlite数据库事务有两种方式:SQL代码和C#代码 1. SQL代码: BEGIN- COMMIT /ROLLBACK 2. C#代码: using (SQLiteConnection conn = SqliteHelper.GetSQLiteConnection()) { DbTransaction trans = conn.BeginTransaction(); try { //Sql语句 tr

  • C#操作SQLite数据库方法小结(创建,连接,插入,查询,删除等)

    本文实例讲述了C#操作SQLite数据库方法.分享给大家供大家参考,具体如下: SQLite介绍 SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine. SQLite是一个开源.免费的小型RDBMS(关系型数据库),能独立运行.无服务器.零配置.支持事物,用C实现,内存占用较小,支持绝大数的SQ

  • C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法

    本文实例讲述了C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法.分享给大家供大家参考.具体如下: 这个类不是我实现的,英文原文地址为http://www.eggheadcafe.com/articles/20050315.asp,这里修改了原文中分析sql语句参数的方法,将方法名修改为AttachParameters,将其修饰符修改为private,并直接传递command到这个方法,直接绑定参数到comand.修改后的代码如下 using System;

  • C#中增加SQLite事务操作支持与使用方法

    本文实例讲述了C#中增加SQLite事务操作支持与使用方法.分享给大家供大家参考,具体如下: 在C#中使用Sqlite增加对transaction支持 using System; using System.Collections.Generic; using System.Data; using System.Data.SQLite; using System.Globalization; using System.Linq; using System.Windows.Forms; namesp

  • C#操作SQLite数据库之读写数据库的方法

    本文实例讲述了C#操作SQLite数据库之读写数据库的方法.分享给大家供大家参考,具体如下: 这里演示读写数据库并在窗体(Form)中显示其数据,其方式为: 读: Database(SQLite) -> DataAdapter -> DataSet -> DataGridView 写: Database(SQLite) <- DataAdapter <- DataSet <- DataGridView 1.假设现有数据库表student,其字段如下: ID(自增字段,主

  • C# SQLite序列操作实现方法详解

    本文实例讲述了C# SQLite序列操作实现方法.分享给大家供大家参考,具体如下: sqlite 不能直接创建自定义函数,不能像 sql server中那样方便创建并使用.不过我们照样可以创建它,创建成功后,我们照样可以随心所欲(比如批量更新等) 序列是一个数据库中很常用的操作,在其它关系型数据库创建是相当简单的,但Sqlite不是很方便,因为它不能直接创建自定义函数 1.先创建一个表示序列的表: CREATE TABLE SEQUENCE ( SEQ_NAME VARCHAR(50) NOT

  • c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql)

    在之前只知道SqlServer支持数据批量插入,殊不知道Oracle.SQLite和MySql也是支持的,不过Oracle需要使用Orace.DataAccess驱动,今天就贴出几种数据库的批量插入解决方法. 首先说一下,IProvider里有一个用于实现批量插入的插件服务接口IBatcherProvider,此接口在前一篇文章中已经提到过了. /// <summary> /// 提供数据批量处理的方法. /// </summary> public interface IBatch

  • C#简单访问SQLite数据库的方法(安装,连接,查询等)

    本文实例讲述了C#简单访问SQLite数据库的方法.分享给大家供大家参考,具体如下: 下载最新版SQLite(http://www.sqlite.org/download.html),其他版本也可以,这里使用的版本是sqlite-3_6_6_1 a.解压后copy c:\sqlite-3_6_6_1 b.进入cmd模式,进入sqlite-3_6_6_1目录,执行sqlite3 mytest.db c. create table test (seq int,desc varchar(8)); in

  • C#解决SQlite并发异常问题的方法(使用读写锁)

    本文实例讲述了C#解决SQlite并发异常问题的方法.分享给大家供大家参考,具体如下: 使用C#访问sqlite时,常会遇到多线程并发导致SQLITE数据库损坏的问题. SQLite是文件级别的数据库,其锁也是文件级别的:多个线程可以同时读,但是同时只能有一个线程写.Android提供了SqliteOpenHelper类,加入Java的锁机制以便调用.但在C#中未提供类似功能. 作者利用读写锁(ReaderWriterLock),达到了多线程安全访问的目标. using System; usin

  • C#简单查询SQLite数据库是否存在数据的方法

    本文实例讲述了C#简单查询SQLite数据库是否存在数据的方法.分享给大家供大家参考,具体如下: //sqlite数据库驱动组件 using System.Data.SQLite; //插入数据库函数 int SQLquery(string sql) { try { //打开数据库 SQLiteConnection conn = new SQLiteConnection(); SQLiteConnectionStringBuilder connstr = new SQLiteConnection

  • C#操作SQLite方法实例详解

    本文实例讲述了C#操作SQLite方法.分享给大家供大家参考.具体分析如下: 地址: System.Data.Sqlite入手... 首先import/using: 复制代码 代码如下: using System.Data.SQLite; Connection和Command: private SQLiteConnection conn; private SQLiteCommand cmd; 连接db: conn = new SQLiteConnection("Data Source=c:\\t

随机推荐