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

时间: 2024-10-05 05:00:29

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

Entity Framework 6 Code First 系列:使SQLite.CodeFirst支持DropCreateDatabaseIfModelChanges和RowVersion

没什么好说的,能支持DropCreateDatabaseIfModelChanges和RowVersion的Sqlite谁都想要.EntityFramework7正在添加对Sqlite的支持,虽然EF7不知道猴年马月才能完成正式版,更不知道MySql等第三方提供程序会在什么时候跟进支持,但是EF7中的确出现了Sqlite的相关代码.Sqlite支持EF6的CodeFirst,只是不支持从实体生成数据库,估计有很多人因为这个原因放弃了使用它.现在SQLite.CodeFirst的简单实现可以让我们

Android学习路线(十八)支持不同设备——支持不同的屏幕

Android系统使用两个普通属性:尺寸和密度,来对设备屏幕进行分类.你需要先预测你的应用将会在什么样屏幕的设备上安装,包括屏幕尺寸和密度.这样的话,你就需要提供一些可选的资源类让你的应用在不同屏幕的设备上有最佳的展示. 有四种普遍的尺寸:small, normal, large, xlarge 还有四种普遍的密度:low (ldpi), medium (mdpi), high (hdpi), extra high (xhdpi) 要为不同的屏幕声明不同的布局和图片,你需要让这些可选的资源放在不

Android学习路线(十九)支持不同设备——支持不同(Android)平台版本

当最新的Android版本为你的应用提供着很棒的APIs时,你却要在更多的设备更新之前继续支持老的系统版本.这篇课程如何在继续支持低版本的系统的情况下使用新版本的高级API. Platform Versions 仪表板展示了最新的活跃设备上运行的Android系统版本的分布,基于设备访问Google Play商店的次数.通常情况下,支持90%的活跃设备同时使用最新版本作为target是一个好习惯. 贴士: 为了在不同的Android版本上提供最好的特性和功能,你应该在你的应用中使用Android

Android - 支持不同的设备 - 支持不同的屏幕

Android - 支持不同的设备 - 支持不同的屏幕 Android整体上按照两大类来分类设备屏幕:尺寸和分辨率.app在设备上运行应该考虑大小和分辨率.同样的,你应该包含不同的资源来让app适应不同的屏幕大小和分辨率. 整体上有四种尺寸:小的,正常的,大的,超级大的 和四种分辨率:低分辨率(ldpi),中分辨率(mdpi),高分辨率(hdpi),超高分辨率(xhdpi) 为了声明不同屏幕的不同的布局和突变,你需要把不同的资源放在不同的文件夹下,和处理不同语言的方法一样. 同样要注意到在考虑屏

Android学习路线(十六)支持不同设备

全世界的Android 设备有很多很多不同的形状和大小.凭借着广泛的设备类型,你的应用程序可以有机会拥有一个庞大的用户群.为了让你的应用在android平台上更成功,你的应用需要适配各种设备类型.有几个重要的差异必须被考虑进去,包括不同的语言,屏幕尺寸以及android平台版本. 这篇课程会教你如何使用基本的平台特性,利用可选的资源以及其他的特性来让你的应用能够在多种Android兼容设备上提供最佳的用户体验,使用一个简单的应用包(APK). 课程 支持不同语言 学习如何通过可选的资源来支持多语

运行时错误&#39;430&#39;: 类不支持自动化或不支持期望的接口。New ADODB.Connection问题

运行时错误'430': 类不支持自动化或不支持期望的接口. 问题: 经调试发现,是运行到下面语句时出错:Set MyConn = New ADODB.Connection  运行到这里是提示本错误 这个MyConn在通用里是这么声明的:    Dim MyConn As ADODB.Connection 你引用 2.8 版的试试. 定位: C:\Program Files \Common Files\Sysem\ADO\msado15.dll   (用2.8解决问题) === nstalling

Android 原生应用开发得到Go语言支持

今天的主要内容为Android 原生应用开发得到Go 语言支持,那么我们首先简单看下GO是什么呢? Go是Google开发的一种编译型,並發型,并具有垃圾回收功能的编程语言. Google工程师和独立开发人员提出了几份不同的提案,旨在让Go语言支持开发原生的Android应用.这项工作无法让Go语言编写的应用使用Android NDK的全部接口,但有可能使用其中的一个子集. David Crawshaw是Google的工程师,他写了一份提案,旨在让Go语言部分支持编写Android应用.根据他的

Android解析获取网络上的图片(支持bmp格式)

Android学习系列 - 显示网络上的图片(支持bmp格式)) 见如下代码: /** * 到Url地址上去下载图片,并回传Bitmap回來 * * @param imgUrl * @return */ public static Bitmap getBitmapFromUrl(String imgUrl) { URL url; Bitmap bitmap = null; try { url = new URL(imgUrl); InputStream is = url.openConnecti

SQlite不支持的语法总结

SQlite不支持以下特性: 1.RIGHT and FULL OUTER JOIN,LEFT OUTER JOIN 是支持的. 2.alter table 不是完全支持:只支持重命名表名和增加列变量,其他操作例如删除列,改变列,增加约束是不能操  作的. 3.trigger 不是完全支持.支持对每行建立触发器,不能对状态建立 4.VIEWS不能写入,VIEWS只支持read-only 5.grant and revoke操作.SQLite的读和写一个普通的磁盘文件以来,其唯一的访问权限是通过可