码迷,mamicode.com
首页 > 移动开发 > 详细

Android DB类,支持MDB,SQLITE,SQLSERVER,支持查询、事务,对象直接插入和更新操作等

时间:2015-01-12 23:54:12      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:

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

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文件:这里

Android DB类,支持MDB,SQLITE,SQLSERVER,支持查询、事务,对象直接插入和更新操作等

标签:

原文地址:http://www.cnblogs.com/zhujiabin/p/4220135.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!