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);
                }
            }
        }
View Code

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;
        }
View Code

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;
        }
View Code

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;
        }
View Code

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();
            }
        }
View Code

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;
            }
        }
View Code

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();
            }
        }
View Code

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;
        }
View Code

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();
            }
        } 
View Code

 


 

 

 

转载于:https://www.cnblogs.com/OnlyVersion/p/3746086.html

### C# 中创建和使用 SQLite 数据库帮助 为了简化在 C# 应用程序中与 SQLite 数据库交互的过程,通常会编写一个帮助来封装常见的数据库操作。这不仅提高了代码的可读性和重用性,还使得开发者能更专注于业务逻辑而非底层的数据访问细节[^1]。 下面展示了一个简单的 `SQLiteHelper` 示例: ```csharp using System; using System.Data.SQLite; public class SQLiteHelper { private readonly string _connectionString; public SQLiteHelper(string connectionString) { _connectionString = connectionString; } /// <summary> /// 执行不返回结果集的SQL语句 (INSERT, UPDATE, DELETE). /// </summary> public void ExecuteNonQuery(string query) { using var connection = new SQLiteConnection(_connectionString); connection.Open(); using var command = new SQLiteCommand(query, connection); command.ExecuteNonQuery(); } /// <summary> /// 查询并获取单个值. /// </summary> public object ExecuteScalar(string query) { using var connection = new SQLiteConnection(_connectionString); connection.Open(); using var command = new SQLiteCommand(query, connection); return command.ExecuteScalar(); } /// <summary> /// 获取多行记录作为DataTable对象. /// </summary> public DataTable GetTableData(string query) { using var connection = new SQLiteConnection(_connectionString); connection.Open(); using var adapter = new SQLiteDataAdapter(query, connection); var dataTable = new DataTable(); adapter.Fill(dataTable); return dataTable; } } ``` 此帮助提供了基本的功能,比如执行更新命令 (`ExecuteNonQuery`) 和查询数据表(`GetTableData`) 。这些方法内部处理了打开关闭连接以及释放资源的工作,从而减少了重复劳动,并降低了错误发生的可能性。 当涉及到具体的应用场景时,可以根据实际需求扩展此功能,例如增加事务支持、参数化查询等功能以增强安全性和灵活性[^2]。 对于定义好的实体模型(如提供的 `Models` 实体),可以通过上述帮助轻松完成增删改查的操作。例如要向数据库插入一条新的用户登录信息,则只需构建相应的 SQL 插入语句并通过 `ExecuteNonQuery` 方法提交给数据库即可[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值