C#调用本地sqllite文件工具类

C#调用本地sqllite文件封装工具类

namespace Test.Utils
{
    public class SQLiteHelper
    {
        private SQLiteConnection _connection;

        private static readonly Lazy<SQLiteHelper> lazy =
       new Lazy<SQLiteHelper>(() => new SQLiteHelper());

        public static SQLiteHelper Instance { get { return lazy.Value; } }
        public SQLiteHelper()
        {
            string currentDirectory = Directory.GetCurrentDirectory();
            string relativePath = "DB\\cabinet.db";
            string path = Path.Combine(currentDirectory, relativePath);
            // string path = "C:\\CabinetData\\cabinet.db";
            _connection = new SQLiteConnection($"Data Source={path};Version=3;BinaryGUID=False;");
        }

        public SQLiteConnection GetConnection()
        {
            return _connection;
        }


        public void OpenConnection()
        {
            if (_connection.State != ConnectionState.Open)
            {
                _connection.Open();
            }
        }

        public void CloseConnection()
        {
            if (_connection.State != ConnectionState.Closed)
            {
                _connection.Close();
            }
        }


        public List<Dictionary<string, object>> query(string sql)
        {
            List<Dictionary<string, object>> result = new List<Dictionary<string, object>>();
            this.OpenConnection();
            SQLiteCommand command = new SQLiteCommand(sql, this._connection);
            SQLiteDataReader reader = command.ExecuteReader();
            while (reader.Read())
            {
                Dictionary<string, object> kv = new Dictionary<string, object>();
                for (int i = 0; i < reader.FieldCount; i++)
                {
                    kv[reader.GetName(i)] = reader.GetValue(i);
                }
                result.Add(kv);
            }
            //command.Dispose();
            //this._connection.Dispose();
            return result;
        }

        // 根据ID查询数据的方法  
        public T GetById<T>(string tableName, string idColumnName, Int64 id, Func<DbDataReader, T> map)
        {
            this.OpenConnection();
            using (var cmd = _connection.CreateCommand())
            {
                cmd.CommandText = $"SELECT * FROM {tableName} WHERE {idColumnName} = @id";
                cmd.Parameters.AddWithValue("@id", id);

                using (var reader = cmd.ExecuteReader())
                {
                    if (reader.Read())
                    {
                        return map(reader);
                    }
                }
            }

            return default(T);
        }

        // 根据Name查询数据的方法  
        public T GetByName<T>(string tableName, string idColumnName, string name, Func<DbDataReader, T> map, Boolean hasDeleteColumn)
        {
            this.OpenConnection();
            using (var cmd = _connection.CreateCommand())
            {
                if (hasDeleteColumn)
                {
                    cmd.CommandText = $"SELECT * FROM {tableName} WHERE {idColumnName} = @name and is_deleted=0";
                }
                else
                {
                    cmd.CommandText = $"SELECT * FROM {tableName} WHERE {idColumnName} = @name";
                }

                cmd.Parameters.AddWithValue("@name", name);

                using (var reader = cmd.ExecuteReader())
                {
                    if (reader.Read())
                    {
                        return map(reader);
                    }
                }
            }

            return default(T);
        }


        /// <summary>
        /// 执行插入操作
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="key_values">键值对字典</param>
        /// <returns>int</returns>
        public int Insert(string tableName, List<SQLiteParameter> parameters)
        {
            this.OpenConnection();
            using (var cmd = _connection.CreateCommand())
            {
                // 添加参数到命令对象  
                cmd.Parameters.AddRange(parameters.ToArray());

                // 构建INSERT语句的列名部分和值部分  
                string columnNames = string.Join(",", parameters.Select(p => p.ParameterName));
                string placeholders = string.Join(",", parameters.Select(p => "@" + p.ParameterName));

                // 构建完整的INSERT语句  
                string query = $"INSERT INTO {tableName} ({columnNames}) VALUES ({placeholders});";
                cmd.CommandText = query;

                // 执行命令并返回受影响的行数  
                return cmd.ExecuteNonQuery();
            }
        }

        /// <summary>
        /// 执行插入操作
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="key_values">键值对字典</param>
        /// <returns>int</returns>
        public int Insert(string tableName, Dictionary<string, object> key_values)
        {
            using (var cmd = _connection.CreateCommand())
            {
                List<string> columns = new List<string>();
                List<SQLiteParameter> parameters = new List<SQLiteParameter>();
                int index = 0;

                foreach (var kvp in key_values)
                {
                    columns.Add(kvp.Key);
                    parameters.Add(new SQLiteParameter($"{kvp.Key}", kvp.Value));
                    cmd.Parameters.Add(parameters[index]);
                    index++;
                }

                string query = $"INSERT INTO {tableName} ({string.Join(",", columns)}) VALUES ({string.Join(",", parameters.Select(p => "@" + p.ParameterName))});";
                cmd.CommandText = query;
                return cmd.ExecuteNonQuery();
            }
        }

        /// <summary>
        /// 执行更新操作
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="setValues">新数据</param>
        /// <param name="whereClause">条件</param>
        /// <param name="parameters">条件数据</param>
        /// <returns>int</returns>
        public int Update(string tableName, Dictionary<string, object> setValues, string whereClause, List<SQLiteParameter> parameters)
        {
            using (var cmd = _connection.CreateCommand())
            {
                List<string> setColumns = new List<string>();
                int index = 0;

                foreach (var kvp in setValues)
                {
                    setColumns.Add($"{kvp.Key} = @{kvp.Key}");
                    cmd.Parameters.Add(new SQLiteParameter($"@{kvp.Key}", kvp.Value));
                    index++;
                }

                string query = $"UPDATE {tableName} SET {string.Join(",", setColumns)} WHERE {whereClause}";
                cmd.CommandText = query;
                cmd.Parameters.AddRange(parameters.ToArray());

                return cmd.ExecuteNonQuery();
            }
        }

        /// <summary>
        /// 执行删除操作
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="whereClause">条件</param>
        /// <param name="parameters">参数数据</param>
        /// <returns>int</returns>
        public int Delete(string tableName, string whereClause, List<SQLiteParameter> parameters)
        {
            try
            {
                //this.OpenConnection();
                //if (_connection.State != ConnectionState.Open)
                //{
                //    Console.WriteLine();
                //}
                using (var cmd = _connection.CreateCommand())
                {
                    if (tableName == null)
                    {
                        throw new ArgumentNullException("table=null");
                    }

                    // 在使用 _connection 之前确保其状态正确
                    if (_connection.State != ConnectionState.Open)
                    {
                        _connection.Open();
                    }


                    cmd.CommandText = $"DELETE FROM {tableName} WHERE {whereClause};";

                    cmd.Parameters.AddRange(parameters.ToArray());

                    return cmd.ExecuteNonQuery();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Exception occurred: {ex.Message}");
                return 0;
                // 可以根据具体情况处理异常
            }

        }





        /// <summary>
        /// 执行条件查询操作
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="parameters">参数数据</param>
        /// <returns>DataTable</returns>
        public DataTable Select(string sql, List<SQLiteParameter> parameters)
        {
            DataTable dt = new DataTable();
            // 在使用 _connection 之前确保其状态正确
            if (_connection.State != ConnectionState.Open)
            {
                _connection.Open();
            }

            using (var cmd = _connection.CreateCommand())
            {
                cmd.CommandText = sql;

                cmd.Parameters.AddRange(parameters.ToArray());

                using (var reader = cmd.ExecuteReader())
                {
                    dt.Load(reader);
                }
            }
            return dt;
        }

        /// <summary>
        /// 执行自定义SQL语句,返回影响行数
        /// </summary>
        /// <param name="sql"></param>
        /// <returns>int类型</returns>
        public int ExecuteSQL(string sql)
        {
            using (var cmd = _connection.CreateCommand())
            {
                cmd.CommandText = sql;

                return cmd.ExecuteNonQuery();
            }
        }

        /// <summary>
        /// 执行自定义SQL语句,返回影响行数
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <returns>int类型</returns>
        public int ExecuteSQL(string sql, List<SQLiteParameter> parameters)
        {
            using (var cmd = _connection.CreateCommand())
            {
                cmd.CommandText = sql;

                cmd.Parameters.AddRange(parameters.ToArray());

                return cmd.ExecuteNonQuery();
            }
        }

        /// <summary>
        /// 执行自定义sql查询语句,如果你计划对返回的 DataTable 进行大量的后续操作(例如,添加或删除行,修改列值等),那么使用 SQLiteDataAdapter 可能会更有优势,因为它提供了更高级的数据绑定和更新功能
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <returns>DataTable</returns>
        public DataTable ExecuteSelect(string sql, List<SQLiteParameter> parameters)
        {
            using (SQLiteCommand command = _connection.CreateCommand())
            {
                command.CommandText = sql;
                command.Parameters.AddRange(parameters.ToArray());
                using (SQLiteDataAdapter adapter = new SQLiteDataAdapter(command))
                {
                    DataTable dataTable = new DataTable();
                    adapter.Fill(dataTable); // 填充数据表  
                    return dataTable; // 返回查询结果的数据表  
                }
            }
        }

        /// <summary>
        /// 批量操作
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="parameters"></param>
        /// <returns></returns>
        public int BatchExecuteSQL(string sql, List<List<SQLiteParameter>> parameters)
        {
            int affectedRows = 0;
            using (var transaction = _connection.BeginTransaction())
            {
                try
                {
                    using (var cmd = _connection.CreateCommand())
                    {
                        cmd.Transaction = transaction;
                        foreach (var paramList in parameters)
                        {
                            cmd.CommandText = sql;
                            cmd.Parameters.Clear();
                            cmd.Parameters.AddRange(paramList.ToArray());
                            affectedRows += cmd.ExecuteNonQuery();
                        }
                        transaction.Commit(); // 提交事务  
                    }
                }
                catch (Exception ex)
                {
                    transaction.Rollback(); // 发生异常时回滚事务  
                    throw; // 重新抛出异常,以便上层调用者处理  
                }
            }
            return affectedRows;
        }

    }

}

举个例子展示具体调用方式

首先实体类:

namespace Test.Model
{

    [Table(Name = "agency")]
    public class Agency
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public string Property { get; set; }

        public string Address { get; set; }

        public override string ToString()
        {
            return $"Name: {Name}, Property: {Property}, Address: {Address}";
        }
    }
}

封装了一个service方法(我之前是java开发,习惯了):

namespace Test.Service
{
    public class AgencyService
    {
        private static SQLiteHelper helper = SQLiteHelper.Instance;



        public static List<Agency> selectAgencyID(Agency agency)
        {
            List<Agency> entities = new List<Agency>();

            String sql = "SELECT * FROM agency WHERE  name = @Name AND property = @Property AND address = @Address";
            //where条件
            //where条件中对应的参数
            List<SQLiteParameter> parameter = new List<SQLiteParameter>
                                {
                                    new SQLiteParameter("@Name", agency.Name),
                                    new SQLiteParameter("@Property", agency.Property),
                                    new SQLiteParameter("@Address", agency.Address)
                                };
            DataTable dataTable = helper.Select(sql, parameter);

            entities = dataTable.AsEnumerable().Select(data => new Agency
            {
                Id = Convert.ToInt32(data["id"]),
                Name = (string)data["name"],
                Property = (string)data["property"],
                Address = (string)data["address"]
            }).ToList();

           
           return entities;
            

        }

        public static int insertAgency(Agency agency)
        {
            try
            {
                // 打开数据库连接  
                helper.OpenConnection();

                // 插入数据示例  
                Dictionary<string, object> valuesToInsert = new Dictionary<string, object>
                {

                    { "username", agency.Name },
                    { "property", agency.Property },
                    { "address", agency.Address }
                };
                int insert_count = helper.Insert("agency1111", valuesToInsert);
                Console.WriteLine(insert_count);
                return insert_count;
            }
            catch (Exception ex)
            {
                LoggerFactory.GetLog().Error(string.Format("An exception occurred during data saving and has been captured.{0}", ex.Message));
                TipDialogUtils.TipDialogPromt(ErrorCodes.DeviceError + ":" + ResourceResxManager.Instance.GetString("NewOrganizationFailure"));
                
            }

            return 0;
        }



    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值