zoukankan      html  css  js  c++  java
  • Android DB类,支持MDB,SQLITE,SQLSERVER,支持查询、事务,对象直接插入和更新操作等

    直做数据库,最近花了点时间把自己常用的东西封装在一起。

    DBHelper
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Data;
    using System.Data.Common;
    using System.Reflection;
    
    namespace DBHelper
    {
        public sealed class DB : IDisposable
        {
            #region 数据库类型枚举
            /// <summary>
            /// 数据库类型
            /// </summary>
            public enum DBType
            {
                SQLSERVER,
                MDB,
                SQLITE
            }
            #endregion
    
            #region 公共成员
            public string ConnectionString { get; set; } //连接字符串
    
            DBType _DbType;
    
            public DBType DbType
            {
                get { return this._DbType; }
                set
                {
                    this._DbType = value;
                    switch (value)
                    {
                        case DBType.SQLSERVER:
                            Factory = DbProviderFactories.GetFactory("System.Data.SqlClient");
                            break;
                        case DBType.MDB:
                            Factory = DbProviderFactories.GetFactory("System.Data.OleDb");
                            break;
                        case DBType.SQLITE:
                            Factory = DbProviderFactories.GetFactory("System.Data.SQLite");
                            break;
                    }
                }
            } //数据库类型
    
            public string CommandText { get; set; } //查询语句
    
            //public DbParameterCollection Parameters { get; set; } //参数集合
    
    
    
            #endregion
    
            #region 私有成员
    
            private DbParameterCollection Parameters { get; set; } //参数集合
    
            #endregion
    
            #region 初始成员
    
            private DbConnection Conn = null; //连接对象
    
            private DbProviderFactory Factory = null; //数据库工厂                
    
            private List<myTran> TranList = new List<myTran>(); //事务集合
    
            #endregion
    
            #region 构造函数
            public DB()
            { }
    
            public DB(DBType dbType, string connectionString)
            {
                this.DbType = dbType;
                this.ConnectionString = connectionString;
                this.Parameters = Factory.CreateCommand().Parameters;
            }
            #endregion
    
            #region 初始化与自动释放
    
            public void Open()
            {
                try
                {
                    if (Conn == null)
                    {
                        Conn = Factory.CreateConnection();
                        Conn.ConnectionString = this.ConnectionString;
                        Conn.Open();
                    }
                    else
                    {
                        if (Conn.State == ConnectionState.Closed)
                            Conn.Open();
                    }
                }
                catch (Exception)
                {
                    throw;
                }
            }
    
            public void Close()
            {
                try
                {
                    if (Conn.State == ConnectionState.Open)
                        Conn.Close();
                }
                catch (Exception)
                {
                    throw;
                }
            }
    
            public void Dispose()
            {
                try
                {
                    if (Conn.State == ConnectionState.Open)
                        Conn.Close();
                }
                catch (Exception)
                {
                    throw;
                }
            }
            #endregion
    
            #region 添加查询参数
            public void AddParameter(string name, object value)
            {
                var pa = Factory.CreateParameter();
                pa.ParameterName = name;
                pa.Value = value;
                this.Parameters.Add(pa);
            }
    
            public void AddParameters<T>(T model) where T : class,new()
            {
                Type t = typeof(T);
                Array.ForEach<System.Reflection.PropertyInfo>(t.GetProperties(), p =>
                {
                    AddParameter("@" + p.Name, p.GetValue(model, null));
                });
            }
    
            public void AddParameters(string[] names, object[] values)
            {
                if (names.Length != values.Length)
                    throw new Exception("参数名称跟参数值数量不匹配!");
                for (var i = 0; i < names.Length; i++)
                {
                    var pa = Factory.CreateParameter();
                    pa.ParameterName = names[i];
                    pa.Value = values[i];
                    this.Parameters.Add(pa);
                }
            }
            #endregion
    
            #region 创建查询参数
            public DbParameter CreateParameter(string name, object value)
            {
                var pa = Factory.CreateParameter();
                pa.ParameterName = name;
                pa.Value = value;
                return pa;
            }
    
            public List<DbParameter> CreateParameters(string[] names, object[] values)
            {
                if (names.Length != values.Length)
                    throw new Exception("参数名称跟参数值数量不匹配!");
                var parameters = new List<DbParameter>();
                for (var i = 0; i < names.Length; i++)
                {
                    parameters.Add(CreateParameter(names[i],values[i]));
                }
                return parameters;
            }
    
            public List<DbParameter> CreateParameters<T>(T model) where T : class,new()
            {
                var parameters = new List<DbParameter>();
                Type t = typeof(T);
                Array.ForEach<System.Reflection.PropertyInfo>(t.GetProperties(), p =>
                {                
                    parameters.Add(CreateParameter(p.Name, p.GetValue(model, null)));
                });
                return parameters;
            }
            #endregion
    
            #region 清除查询字符串和查询参数
            /// <summary>
            /// 清除查询字符串和查询参数
            /// </summary>
            void Clear()
            {
                this.CommandText = "";
                if (this.Parameters != null)
                    this.Parameters.Clear();
            }
            #endregion
    
            #region 返回一个DataTable
            /// <summary>
            /// 返回一个DataTable
            /// </summary>
            public DataTable ExecuteDataTable()
            {
                try
                {
                    using (DbCommand cmd = Factory.CreateCommand())
                    {
                        Open();
                        cmd.Connection = this.Conn;
                        cmd.CommandText = this.CommandText;
                        //cmd.Parameters.AddRange(this.Parameters);   
                        if (this.Parameters != null)
                            foreach (var para in this.Parameters)
                            {
                                var p = cmd.CreateParameter();
                                p.ParameterName = (para as DbParameter).ParameterName;
                                p.Value = (para as DbParameter).Value;
                                cmd.Parameters.Add(p);
                            }
                        Clear();
    
                        DbDataReader dr = cmd.ExecuteReader();
                        DataTable dt = new DataTable();
                        dt.Load(dr);
                        return dt;
                    }
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    Clear();
                }
            }
            #endregion
    
            #region 执行一条更新语句
            /// <summary>
            /// 执行一条更新语句
            /// </summary>        
            public int ExecuteNonQuery()
            {
                try
                {
                    using (DbCommand cmd = Factory.CreateCommand())
                    {
                        Open();
                        cmd.Connection = this.Conn;
                        cmd.CommandText = this.CommandText;
                        if (this.Parameters != null)
                            foreach (var para in this.Parameters)
                            {
                                var p = cmd.CreateParameter();
                                p.ParameterName = (para as DbParameter).ParameterName;
                                p.Value = (para as DbParameter).Value;
                                cmd.Parameters.Add(p);
                            }
                        Clear();
                        if (this.Conn.State == ConnectionState.Closed)
                            Open();
                        return cmd.ExecuteNonQuery();
                    }
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    Clear();
                }
            }
            #endregion
    
            #region 返回首行首列
            public object ExecuteScalar()
            {
                try
                {
                    using (var cmd = Factory.CreateCommand())
                    {
                        Open();
                        cmd.Connection = this.Conn;
                        cmd.CommandText = this.CommandText;
                        if (this.Parameters != null)
                            foreach (var para in this.Parameters)
                            {
                                var p = cmd.CreateParameter();
                                p.ParameterName = (para as DbParameter).ParameterName;
                                p.Value = (para as DbParameter).Value;
                                cmd.Parameters.Add(p);
                            }
                        Clear();
                        if (this.Conn.State == ConnectionState.Closed)
                            Open();
                        return cmd.ExecuteScalar();
                    }
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    Clear();
                }
            }
            #endregion
    
            #region 自定义事务类
            class myTran
            {
                public string queryString { get; set; }
                public List<DbParameter> parameters { get; set; }
    
                public myTran(string queryString, List<DbParameter> parameters)
                {
                    this.queryString = queryString;
                    this.parameters = parameters;
                }
            }
            #endregion
    
            #region 添加事务
            public void AddTran(string queryString, List<DbParameter> parameters)
            {
                var tran = new myTran(queryString, parameters);
                TranList.Add(tran);
            }
    
            public void AddTran(string queryString, DbParameter parameter)
            {
                List<DbParameter> paras = new List<DbParameter>();
                if (parameter != null)
                    paras.Add(parameter);
                var tran = new myTran(queryString, paras);
                TranList.Add(tran);
            }
            #endregion
    
            #region 清除事务
            void ClearTran()
            {
                TranList.Clear();
            }
            #endregion
    
            #region 执行事务
            public void ExecuteTran()
            {
                try
                {
                    using (DbTransaction tran = Conn.BeginTransaction())
                    {
                        try
                        {
                            if (this.Conn.State == ConnectionState.Closed)
                                Open();
                            TranList.ForEach(m =>
                            {
                                using (var cmd = this.Factory.CreateCommand())
                                {
                                    cmd.Connection = this.Conn;
                                    cmd.CommandText = m.queryString;
                                    cmd.Transaction = tran;
                                    m.parameters.ForEach(n =>
                                    {
                                        cmd.Parameters.Add(n);
                                    });
                                    cmd.ExecuteNonQuery();
                                }
                            });
                            tran.Commit();
                        }
                        catch (Exception)
                        {
                            tran.Rollback();
                            throw;
                        }
                        finally
                        {
                            ClearTran();
                        }
                    }
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    ClearTran();
                }
            }
            #endregion
    
            #region 根据对象生成更新语句
            /// <summary>
            /// 获取更新语句
            /// </summary>
            /// <typeparam name="TResult"></typeparam>
            /// <param name="Result"></param>
            /// <param name="TableName"></param>
            /// <param name="IndexFieldName"></param>
            /// <returns></returns>
            public string GetUpdateString<TResult>(string TableName, string IndexFieldName) where TResult : class,new()
            {
                string rt = "update " + TableName + " set";
                Type t = typeof(TResult);
                Array.ForEach<System.Reflection.PropertyInfo>(t.GetProperties(), p =>
                {
                    if (p.Name != IndexFieldName) rt += " " + p.Name + " = @" + p.Name + " ,";
                });
                rt = rt.Substring(0, rt.Length - 2);
                if (IndexFieldName != null)
                    rt += " where " + IndexFieldName + " = @" + IndexFieldName;
                return rt;
            }
            #endregion
    
            #region 根据对象生成插入语句
            /// <summary>
            /// 获取插入语句
            /// </summary>
            /// <typeparam name="TResult"></typeparam>
            /// <param name="Result"></param>
            /// <param name="TableName"></param>
            /// <param name="IndexFieldName"></param>
            /// <returns></returns>
            public string GetInsertString<TResult>(string TableName, string IndexFieldName) where TResult : class,new()
            {
                string rt = "insert into " + TableName + " (";
                Type t = typeof(TResult);
                Array.ForEach<System.Reflection.PropertyInfo>(t.GetProperties(), p =>
                {
                    if (p.Name != IndexFieldName) rt += p.Name + " , ";
                });
                rt = rt.Substring(0, rt.Length - 3);
                rt += ") values (";
                Array.ForEach<System.Reflection.PropertyInfo>(t.GetProperties(), p =>
                {
                    if (p.Name != IndexFieldName)
                        rt += "@" + p.Name + " , ";
                });
                rt = rt.Substring(0, rt.Length - 3);
                rt += ")";
                return rt;
            }
            #endregion
    
            #region 对象操作
            /// <summary>
            /// 将对象插入到数据库
            /// </summary>
            /// <typeparam name="T">对象类型</typeparam>
            /// <param name="model">对象</param>
            /// <param name="TableName">表名</param>
            /// <param name="IndexFieldName">主键ID</param>
            /// <returns></returns>
            public bool InsertModel<T>(T model, string TableName, string IndexFieldName) where T : class,new()
            {
                this.CommandText = GetInsertString<T>(TableName, IndexFieldName);
                this.AddParameters<T>(model);
                return this.ExecuteNonQuery() > 0;
            }
    
            /// <summary>
            /// 将对象更新到数据库
            /// </summary>
            /// <typeparam name="T">对象类型</typeparam>
            /// <param name="model">对象</param>
            /// <param name="TableName">表名</param>
            /// <param name="IndexFieldName">主键ID</param>
            /// <returns></returns>
            public bool UpdateModel<T>(T model, string TableName, string IndexFieldName) where T : class,new()
            {
                this.CommandText = GetUpdateString<T>(TableName, IndexFieldName);
                this.AddParameters<T>(model);
                return this.ExecuteNonQuery() > 0;
            }
            #endregion
    
            #region 数据库静态方法
    
            #region 生成查询字符串
            /// <summary>
            /// 返回SQLSERVER连接字符串
            /// </summary>
            /// <param name="serverIp">服务器IP</param>
            /// <param name="uid">用户名</param>
            /// <param name="pwd">密码</param>
            /// <param name="catalog">库名</param>
            /// <param name="timeout">超时时间</param>
            /// <returns></returns>
            public static string GetSQLConnectionString(string serverIp, string uid, string pwd, string catalog, int timeout)
            {
                return string.Format("Server={0};User ID={1};PWD={2};Initial Catalog={3};Connect TimeOut={4};", serverIp, uid, pwd, catalog, timeout.ToString());
            }
    
            /// <summary>
            /// 返回Mdb连接字符串
            /// </summary>
            /// <param name="filePath">数据库路径</param>
            /// <param name="password">数据库密码</param>
            /// <returns></returns>
            public static string GetMdbConnectionString(string filePath, string password)
            {
                return string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Persist Security Info=False;Jet OLEDB:Database Password={1}", filePath, password);
            }
    
            /// <summary>
            /// 返回SQLite连接字符串
            /// </summary>
            /// <param name="filePath">数据库路径</param>
            /// <returns></returns>
            public static string GetSQLiteConnectionString(string filePath)
            {
                return string.Format("Data Source={0}", filePath);
            }
            #endregion
    
            #endregion
        }
    }

    使用例1:

    /// <summary>
            /// 添加内容
            /// </summary>
            /// <param name="model"></param>
            /// <returns></returns>
            public bool Insert(Model.ContentTable model)
            {
                using (var db = Program.GetDB())
                {
                    try
                    {
                        return db.InsertModel<Model.ContentTable>(model, "ContentTable", "ID");
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }
            }

    使用例2:

    /// <summary>
            /// 修改内容
            /// </summary>
            /// <param name="model"></param>
            /// <returns></returns>
            public bool Update(Model.ContentTable model)
            {
                using (var db = Program.GetDB())
                {
                    try
                    {
                        return db.UpdateModel<Model.ContentTable>(model, "ContentTable", "ID");
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }
            }

    使用例3:

    /// <summary>
            /// 批量插入数据
            /// </summary>
            /// <param name="lst"></param>
            public void InsertAll(List<Model.ContentTable> lst)
            {
                using (var db = Program.GetDB())
                {
                    try
                    {
                        foreach(var model in lst)
                        {
                            var names = new string[] { 
                                "Title",
                                "Content"
                            };
                            var values = new object[]{
                                model.Title,
                                model.Content
                            };
                            db.AddTran(DB.GetInsertString<Model.ContentTable>("ContentTable", "ID"), db.CreateParameters(names, values));
                        }
                        db.ExecuteTran();
                    }
                    catch (Exception)
                    {   
                        throw;
                    }
                }
            }

    Dll文件:这里

  • 相关阅读:
    升级或安装 GNOME Shell
    安装eclipse for c/c++环境
    BT3入门之中文语言支持
    开始接触BT5-自动登录X界面
    标准流与序列化
    IO流
    Collection与Map容器
    常用类
    枚举与常用类
    异常处理机制
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4220135.html
Copyright © 2011-2022 走看看