查看: 2304|回复: 0

[ASP.NET教程] C#操作SQLite数据库帮助类详解

发表于 2018-2-18 20:05:18

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

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

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

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

  1. /// <summary>
  2. /// 获得连接对象
  3. /// </summary>
  4. /// <returns>SQLiteConnection</returns>
  5. public static SQLiteConnection GetSQLiteConnection()
  6. {
  7. //Sqlite数据库地址
  8. string str = AppDomain.CurrentDomain.BaseDirectory;
  9. var con = new SQLiteConnection("Data Source=" + str + "DataBass\\InfoServiceDbB.db");
  10. return con;
  11. }
复制代码

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

  1. /// <summary>
  2. /// 准备操作命令参数
  3. /// </summary>
  4. /// <param name="cmd">SQLiteCommand</param>
  5. /// <param name="conn">SQLiteConnection</param>
  6. /// <param name="cmdText">Sql命令文本</param>
  7. /// <param name="data">参数数组</param>
  8. private static void PrepareCommand(SQLiteCommand cmd, SQLiteConnection conn, string cmdText, Dictionary<String, String> data)
  9. {
  10. if (conn.State != ConnectionState.Open)
  11. conn.Open();
  12. cmd.Parameters.Clear();
  13. cmd.Connection = conn;
  14. cmd.CommandText = cmdText;
  15. cmd.CommandType = CommandType.Text;
  16. cmd.CommandTimeout = 30;
  17. if (data!=null&&data.Count >= 1)
  18. {
  19. foreach (KeyValuePair<String, String> val in data)
  20. {
  21. cmd.Parameters.AddWithValue(val.Key, val.Value);
  22. }
  23. }
  24. }
复制代码

3.查询,返回DataSet

  1. /// <summary>
  2. /// 查询,返回DataSet
  3. /// </summary>
  4. /// <param name="cmdText">Sql命令文本</param>
  5. /// <param name="data">参数数组</param>
  6. /// <returns>DataSet</returns>
  7. public static DataSet ExecuteDataset(string cmdText, Dictionary<string, string> data)
  8. {
  9. var ds = new DataSet();
  10. using (SQLiteConnection connection = GetSQLiteConnection())
  11. {
  12. var command = new SQLiteCommand();
  13. PrepareCommand(command, connection, cmdText, data);
  14. var da = new SQLiteDataAdapter(command);
  15. da.Fill(ds);
  16. }
  17. return ds;
  18. }
复制代码

4.查询,返回DataTable

  1. /// <summary>
  2. /// 查询,返回DataTable
  3. /// </summary>
  4. /// <param name="cmdText">Sql命令文本</param>
  5. /// <param name="data">参数数组</param>
  6. /// <returns>DataTable</returns>
  7. public static DataTable ExecuteDataTable(string cmdText, Dictionary<string, string> data)
  8. {
  9. var dt = new DataTable();
  10. using (SQLiteConnection connection = GetSQLiteConnection())
  11. {
  12. var command = new SQLiteCommand();
  13. PrepareCommand(command, connection, cmdText, data);
  14. SQLiteDataReader reader = command.ExecuteReader();
  15. dt.Load(reader);
  16. }
  17. return dt;
  18. }
复制代码

5.返回一行数据 DataRow

  1. /// <summary>
  2. /// 返回一行数据
  3. /// </summary>
  4. /// <param name="cmdText">Sql命令文本</param>
  5. /// <param name="data">参数数组</param>
  6. /// <returns>DataRow</returns>
  7. public static DataRow ExecuteDataRow(string cmdText, Dictionary<string, string> data)
  8. {
  9. DataSet ds = ExecuteDataset(cmdText, data);
  10. if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
  11. return ds.Tables[0].Rows[0];
  12. return null;
  13. }
复制代码

6.执行数据库操作

  1. /// <summary>
  2. /// 执行数据库操作
  3. /// </summary>
  4. /// <param name="cmdText">Sql命令文本</param>
  5. /// <param name="data">传入的参数</param>
  6. /// <returns>返回受影响的行数</returns>
  7. public static int ExecuteNonQuery(string cmdText, Dictionary<string, string> data)
  8. {
  9. using (SQLiteConnection connection = GetSQLiteConnection())
  10. {
  11. var command = new SQLiteCommand();
  12. PrepareCommand(command, connection, cmdText, data);
  13. return command.ExecuteNonQuery();
  14. }
  15. }
复制代码

7.返回SqlDataReader对象

  1. /// <summary>
  2. /// 返回SqlDataReader对象
  3. /// </summary>
  4. /// <param name="cmdText">Sql命令文本</param>
  5. /// <param name="data">传入的参数</param>
  6. /// <returns>SQLiteDataReader</returns>
  7. public static SQLiteDataReader ExecuteReader(string cmdText, Dictionary<string, string> data)
  8. {
  9. var command = new SQLiteCommand();
  10. SQLiteConnection connection = GetSQLiteConnection();
  11. try
  12. {
  13. PrepareCommand(command, connection, cmdText, data);
  14. SQLiteDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
  15. return reader;
  16. }
  17. catch
  18. {
  19. connection.Close();
  20. command.Dispose();
  21. throw;
  22. }
  23. }
复制代码

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

  1. /// <summary>
  2. /// 返回结果集中的第一行第一列,忽略其他行或列
  3. /// </summary>
  4. /// <param name="cmdText">Sql命令文本</param>
  5. /// <param name="data">传入的参数</param>
  6. /// <returns>object</returns>
  7. public static object ExecuteScalar(string cmdText, Dictionary<string, string> data)
  8. {
  9. using (SQLiteConnection connection = GetSQLiteConnection())
  10. {
  11. var cmd = new SQLiteCommand();
  12. PrepareCommand(cmd, connection, cmdText, data);
  13. return cmd.ExecuteScalar();
  14. }
  15. }
复制代码

9.分页查询

  1. /// <summary>
  2. /// 分页查询
  3. /// </summary>
  4. /// <param name="recordCount">总记录数</param>
  5. /// <param name="pageIndex">页牵引</param>
  6. /// <param name="pageSize">页大小</param>
  7. /// <param name="cmdText">Sql命令文本</param>
  8. /// <param name="countText">查询总记录数的Sql文本</param>
  9. /// <param name="data">命令参数</param>
  10. /// <returns>DataSet</returns>
  11. public static DataSet ExecutePager(ref int recordCount, int pageIndex, int pageSize, string cmdText, string countText, Dictionary<string, string> data)
  12. {
  13. if (recordCount < 0)
  14. recordCount = int.Parse(ExecuteScalar(countText, data).ToString());
  15. var ds = new DataSet();
  16. using (SQLiteConnection connection = GetSQLiteConnection())
  17. {
  18. var command = new SQLiteCommand();
  19. PrepareCommand(command, connection, cmdText, data);
  20. var da = new SQLiteDataAdapter(command);
  21. da.Fill(ds, (pageIndex - 1) * pageSize, pageSize, "result");
  22. }
  23. return ds;
  24. }
复制代码

10.重新组织数据库

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

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

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

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

  1. public void ResetDataBass()
  2. {
  3. using (SQLiteConnection conn = GetSQLiteConnection())
  4. {
  5. var cmd = new SQLiteCommand();
  6. if (conn.State != ConnectionState.Open)
  7. conn.Open();
  8. cmd.Parameters.Clear();
  9. cmd.Connection = conn;
  10. cmd.CommandText = "vacuum";
  11. cmd.CommandType = CommandType.Text;
  12. cmd.CommandTimeout = 30;
  13. cmd.ExecuteNonQuery();
  14. }
  15. }
复制代码

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

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

您可能感兴趣的文章:

  • C#操作SQLite方法实例详解
  • C#/.Net 中快速批量给SQLite数据库插入测试数据
  • C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法
  • C#简单访问SQLite数据库的方法(安装,连接,查询等)
  • C#简单查询SQLite数据库是否存在数据的方法
  • C#操作SQLite数据库方法小结(创建,连接,插入,查询,删除等)
  • C#操作SQLite数据库之读写数据库的方法
  • C#解决SQlite并发异常问题的方法(使用读写锁)
  • c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql)
  • C# SQLite事务操作方法分析
  • C# SQLite序列操作实现方法详解
  • C#中增加SQLite事务操作支持与使用方法


回复

使用道具 举报