using System;
using System.Collections;
using System.Data;
using System.Data.Common;
using System.Configuration;

namespace Lee.Data
{
    public class DataAccess
    {
        #region 字段 构造函数
        public readonly DbProviderFactory Factory;
        public readonly ConnectionStringSettings ConnectionSettings;

public static DataAccess Instance = new DataAccess();

DataAccess() {
            this.ConnectionSettings = ConfigurationManager.ConnectionStrings["default"];
            this.Factory = DbProviderFactories.GetFactory(this.ConnectionSettings.ProviderName);
        }
        #endregion

#region 创建 DbConnection, DbCommand对象
        /// <summary>
        /// 获取一个新的DbConnection对象
        /// </summary>
        /// <returns>DbConnection</returns>
        public DbConnection CreateConnection() {
            DbConnection connection = Factory.CreateConnection();
            connection.ConnectionString = this.ConnectionSettings.ConnectionString;
            return connection;
        }

/// <summary>
        /// 使用sql语句创建一个DbCommand对象
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <returns></returns>
        public DbCommand CreateCommand(String sql) {
            return this.CreateCommand(sql, CommandType.Text, null, this.CreateConnection());
        }

/// <summary>
        /// 使用sql语句,DbConnection对象创建一个DbCommand对象
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="connection">DbConnection对象</param>
        /// <returns></returns>
        public DbCommand CreateCommand(String sql, DbConnection connection) {
            return this.CreateCommand(sql, CommandType.Text, null, connection);
        }

/// <summary>
        /// 使用sql语句, CommandType, DbParameter数组 创建一个DbCommand对象
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="type">DbCommand所执行命令的类型</param>
        /// <param name="parameters">DbCommand的参数</param>
        /// <returns></returns>
        public DbCommand CreateCommand(String sql, CommandType type, DbParameter[] parameters) {
            DbCommand cmd = Factory.CreateCommand();
            cmd.CommandType = type;
            cmd.CommandText = sql;
            cmd.Connection = this.CreateConnection();
            if(parameters != null && parameters.Length > 0)
                cmd.Parameters.AddRange(parameters);
            return cmd;
        }

/// <summary>
        /// 使用sql语句, CommandType, DbParameter数组, DbConnection对象 创建一个DbCommand对象
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="type">DbCommand所执行命令的类型</param>
        /// <param name="parameters">DbCommand的参数</param>
        /// <param name="connection">connection对象</param>
        /// <returns></returns>
        public DbCommand CreateCommand(String sql, CommandType type, DbParameter[] parameters, DbConnection connection) {
            DbCommand cmd = null;
            if (connection == null) cmd = this.CreateConnection().CreateCommand();
            else cmd = connection.CreateCommand();
            cmd.CommandType = type;
            cmd.CommandText = sql;
            if (parameters != null && parameters.Length > 0)
                cmd.Parameters.AddRange(parameters);
            return cmd;
        }
        #endregion

#region 执行sql语句
        /// <summary>
        /// 执行sql语句返回受影响的行数
        /// </summary>
        /// <param name="sql">要执行的sql语句</param>
        /// <returns></returns>
        public int ExecuteNoneQuery(String sql) {
            using (DbConnection connection = this.CreateConnection()) {
                using (DbCommand command = connection.CreateCommand()) {
                    this.Open(connection);
                    command.CommandText = sql;
                    return command.ExecuteNonQuery();
                }
            }
        }

/// <summary>
        /// 使用指定的DbConnection对象执行sql语句并返回受影响的行数
        /// </summary>
        /// <param name="sql">要执行的sql语句</param>
        /// <param name="connection">DbConnection对象</param>
        /// <returns></returns>
        public int ExecuteNoneQuery(String sql, DbConnection connection) {
            using (DbCommand command = connection.CreateCommand()) {
                command.CommandText = sql;
                this.Open(connection);
                return command.ExecuteNonQuery();
            }
        }

/// <summary>
        /// 执行sql语句获取第一行第一列的值 (Object类型)
        /// </summary>
        /// <param name="sql">要执行的sql语句</param>
        /// <returns></returns>
        public Object ExecuteScalar(String sql) {
            using (DbConnection connection = this.CreateConnection()) {
                using (DbCommand command = connection.CreateCommand()) {
                    command.CommandText = sql;
                    this.Open(connection);
                    return command.ExecuteScalar();
                }
            }
        }

/// <summary>
        /// 使用指定的DbConnection对象执行sql语句并获取第一行第一列的值 (Object类型)
        /// </summary>
        /// <param name="sql">要执行的sql语句</param>
        /// <param name="connection">DbConnection对象</param>
        /// <returns></returns>
        public Object ExecuteScalar(String sql, DbConnection connection) {
            using (DbCommand command = connection.CreateCommand()) {
                command.CommandText = sql;
                command.Connection = connection;
                this.Open(connection);
                return command.ExecuteScalar();
            }
        }

/// <summary>
        /// 执行sql语句获取第一行第一列的值 (int类型)
        /// </summary>
        /// <param name="sql">要执行的sql语句</param>
        /// <returns></returns>
        public Int32? ExecuteScalarGetInt(String sql) {
            Object obj =  this.ExecuteScalar(sql);
            return obj == null ? null : (Int32?)obj;
        }

/// <summary>
        /// 使用指定的DbConnection执行sql语句并获取第一行第一列的值 (int类型)
        /// </summary>
        /// <param name="sql">要执行的sql语句</param>
        /// <param name="connection">DbConnection对象</param>
        /// <returns></returns>
        public Int32? ExecuteScalarGetInt(String sql, DbConnection connection) {
            Object obj = this.ExecuteScalar(sql, connection);
            return obj == null ? null : (Int32?)obj;
        }

/// <summary>
        /// 执行sql语句并获取第一行第一列的值 (String类型)
        /// </summary>
        /// <param name="sql">要执行的sql语句</param>
        /// <returns></returns>
        public String ExcuteScalarGetString(String sql) {
            Object obj = this.ExecuteScalar(sql);
            return obj == null ? null : obj.ToString();
        }

/// <summary>
        /// 使用指定的DbConnection执行sql语句并获取第一行第一列的值 (String类型)
        /// </summary>
        /// <param name="sql">要执行的sql语句</param>
        /// <param name="connection">DbConnection对象</param>
        /// <returns></returns>
        public String ExcuteScalarGetString(String sql, DbConnection connection) {
            Object obj = this.ExecuteScalar(sql, connection);
            return obj == null ? null : obj.ToString();
        }

/// <summary>
        /// 使用指定的sql语句创建一个DbDataReader对象
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <returns></returns>
        public DbDataReader ExecuteReader(String sql) {
            DbConnection connection = this.CreateConnection();
            DbCommand command = connection.CreateCommand();
            command.CommandText = sql;
            this.Open(connection);
            return command.ExecuteReader(CommandBehavior.CloseConnection);
        }

/// <summary>
        /// 使用指定的DbConnection对象执行sql语句并获取一个DbDataReader对象
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <param name="connection">DbConnection对象</param>
        /// <returns></returns>
        public DbDataReader ExecuteReader(String sql, DbConnection connection) {
            DbCommand command = connection.CreateCommand();
            command.CommandText = sql;
            this.Open(connection);
            return command.ExecuteReader();
        }

/// <summary>
        /// 执行sql语句返回DataTable
        /// </summary>
        /// <param name="sql">sql语句</param>
        /// <returns></returns>
        public DataTable GetDataTable(String sql) {
            using (DbConnection connection = this.CreateConnection()) {
                using (DbDataAdapter adapter = Factory.CreateDataAdapter()) {
                    using (adapter.SelectCommand = connection.CreateCommand()) {
                        adapter.SelectCommand.CommandText = sql;
                        DataTable table = new DataTable();
                        adapter.Fill(table);
                        return table;
                    }
                }
            }
        }

/// <summary>
        /// 执行sql语句返回DataTable
        /// </summary>
        /// <param name="sql"></param>
        /// <param name="connection"></param>
        /// <returns></returns>
        public DataTable GetDataTable(String sql, DbConnection connection) {
            using (DbDataAdapter adapter = Factory.CreateDataAdapter()) {
                using (adapter.SelectCommand = connection.CreateCommand()) {
                    adapter.SelectCommand.CommandText = sql;
                    DataTable table = new DataTable();
                    adapter.Fill(table);
                    return table;
                }
            }
        }

#endregion

#region 执行存储过程
        public ArrayList ExecuteProc(String procName, DbParameter[] parameters) {
            DbCommand command = this.CreateCommand(procName, CommandType.StoredProcedure, parameters);
            ArrayList values = new ArrayList(parameters.Length / 2);
            try {
                this.Open(command);
                command.ExecuteNonQuery();
                foreach (DbParameter item in parameters)
                    if (item.Direction == ParameterDirection.Output)
                        values.Add(item.Value);
            }
            catch { throw; }
            finally { command.Connection.Dispose(); command.Dispose(); }
            return values;
        }

/// <summary>
        /// 执行存储过程并将输出参数作为int数组返回
        /// </summary>
        /// <param name="procName">存储过程名称</param>
        /// <param name="parameters">存储过程参数</param>
        /// <returns></returns>
        public Int32[] ExecuteProcGetInt(String procName, DbParameter[] parameters) {
            ArrayList values = this.ExecuteProc(procName, parameters);
            Int32[] intValues = new Int32[values.Count];
            for (int i = 0; i < values.Count; i++)
                intValues[i] = (Int32)values[i];
            return intValues;
        }

/// <summary>
        /// 执行存储过程并将输出参数作为String数组返回
        /// </summary>
        /// <param name="procName">存储过程名称</param>
        /// <param name="parameters">存储过程参数</param>
        /// <returns></returns>
        public String[] ExecuteProcGetString(String procName, DbParameter[] parameters) {
            ArrayList values = this.ExecuteProc(procName, parameters);
            String[] stringValues = new String[values.Count];
            for (int i = 0; i < values.Count; i++)
                stringValues[i] = values[i].ToString();
            return stringValues;
        }

/// <summary>
        /// 执行存储过程并获取一个DbDataReader对象
        /// </summary>
        /// <param name="procName">存储过程名称</param>
        /// <param name="parameters">存储过程参数</param>
        /// <returns></returns>
        public DbDataReader ExecuteProcGetDataReader(String procName, DbParameter[] parameters) {
            DbCommand command = this.CreateCommand(procName, CommandType.StoredProcedure, parameters);
            DbDataReader reader = null;
            try { this.Open(command); reader = command.ExecuteReader(CommandBehavior.CloseConnection); }
            catch { throw; }
            //finally { command.Connection.Dispose(); command.Dispose(); }
            return reader;
        }

/// <summary>
        /// 执行存储过程获取DataTable
        /// </summary>
        /// <param name="procName">存储过程名称</param>
        /// <param name="parameters">存储过程参数</param>
        /// <returns></returns>
        public DataTable ExecuteProcGetDataTable(String procName, DbParameter[] parameters) {
            DataTable table = new DataTable();
            DbDataAdapter adapter = null;

try {
                adapter = Factory.CreateDataAdapter();
                adapter.SelectCommand = this.CreateCommand(procName, CommandType.StoredProcedure, parameters);
                adapter.Fill(table);
            }
            catch { throw; }
            finally {
                adapter.SelectCommand.Connection.Dispose();
                adapter.SelectCommand.Dispose();
                adapter.Dispose();
            }
            return table;
        }

#endregion

#region 其它

/// <summary>
        /// 创建一个输入参数
        /// </summary>
        /// <param name="name"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public DbParameter CreateParameter(String name, Object value) {
            return this.CreateParameter(name, value, DbType.Object, ParameterDirection.Input);
        }

/// <summary>
        /// 创建一个输入参数
        /// </summary>
        /// <param name="name"></param>
        /// <param name="value"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        public DbParameter CreateParameter(String name, Object value, DbType type) {
            return this.CreateParameter(name, value, type, ParameterDirection.Input);
        }

/// <summary>
        /// 创建一个输出参数
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public DbParameter CreateParameter(String name, DbType type) {
            DbParameter parameter = Factory.CreateParameter();
            parameter.ParameterName = name;
            parameter.Direction = ParameterDirection.Output;
            parameter.DbType = type;
            return parameter;
        }

public DbParameter CreateParameter(String name, Object value, DbType type, ParameterDirection direct) {
            DbParameter parameter = Factory.CreateParameter();
            parameter.ParameterName = name;
            parameter.Value = value;
            parameter.DbType = type;
            parameter.Direction = direct;
            return parameter;
        }

/// <summary>
        /// 打开连接
        /// </summary>
        /// <param name="connection">需要打开的DbConnection对象</param>
        public void Open(DbConnection connection) {
            if(connection.State != ConnectionState.Open)
                try { connection.Open(); }
                catch { throw; }
        }

/// <summary>
        /// 打开连接
        /// </summary>
        /// <param name="command">需要打开的DbCommand对象</param>
        public void Open(DbCommand command) {
            if (command.Connection.State == ConnectionState.Open)
                return;
            try { command.Connection.Open(); }
            catch { throw; }
        }
        #endregion
    }
}

DbHelper第三版, 数据库通吃的更多相关文章

  1. [Android 4.4.3] 泛泰A860 Omni4.4.3 20140610 RC2.0 三版通刷 by syhost

    欢迎关注泛泰非盈利专业第三方开发团队 VegaDevTeam  (本team 由 syhost suky zhaochengw(z大) xuefy(大星星) tenfar(R大师) loogeo cr ...

  2. 泛泰A870刷4.4专用英文版非触摸CWM Recovery 6.0.4.8(三版通刷)

    首先声明. 发此Recovery的目的是測试能否够三版都能够启动. 而且不会出现像850 860之前出现过的卡第一屏问题! 不希望看到某些人士的过度解读!! 此Recovery能够刷第三方4.4 RO ...

  3. JavaScript高级程序设计(第三版)学习笔记20、21、23章

    第20章,JSON JSON(JavaScript Object Notation,JavaScript对象表示法),是JavaScript的一个严格的子集. JSON可表示一下三种类型值: 简单值: ...

  4. 泛泰A870L/K/S第三版官方4.4.2原来的系统卡刷机包 (愿自己主动ROOT)

    采用suky大神ota具,来自官方的拍摄OTA包裹,未做任何改动, 使用官方recovery,还是我的头发中国TWRP 2.7.1.1 for A870 (己主动ROOT. 自己主动ROOT完后就自己 ...

  5. [Android 4.4.3] 泛泰A870 Mokee4.4.3 20140610 RC2.0 通过刷第三版 by syhost

    欢迎关注泛泰非盈利专业第三方开发团队 VegaDevTeam  (本team 由 syhost suky zhaochengw(z大) xuefy(大星星) tenfar(R大师) loogeo cr ...

  6. 【unix网络编程第三版】阅读笔记(三):基本套接字编程

    unp第三章主要介绍了基本套接字编程函数.主要有:socket(),bind(),connect(),accept(),listen()等. 本博文也直接进入正题,对这几个函数进行剖析和讲解. 1. ...

  7. 重读《学习JavaScript数据结构与算法-第三版》- 第5章 队列

    定场诗 马瘦毛长蹄子肥,儿子偷爹不算贼,瞎大爷娶个瞎大奶奶,老两口过了多半辈,谁也没看见谁! 前言 本章为重读<学习JavaScript数据结构与算法-第三版>的系列文章,主要讲述队列数据 ...

  8. 微软发布 Windows Server 2016 预览版第三版,开发者要重点关注Nano Server

    微软已经发布 Windows Server 2016 和 System Center 2016 第三个技术预览版,已经提供下载.Windows Server 2016 技术预览版第三版也是首个包括了容 ...

  9. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

随机推荐

  1. lintcode 中等题:interleaving String 交叉字符串

    题目 交叉字符串 给出三个字符串:s1.s2.s3,判断s3是否由s1和s2交叉构成. 样例 比如 s1 = "aabcc" s2 = "dbbca" - 当 ...

  2. 【Linux高频命令专题(11)】cp

    概述 cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是 ...

  3. php相关学习资源

    相关书籍资源: 1:PHP和MySQL Web开发 经典书籍 视频教程: PHP开发工程师闯关记--初识PHP php调试技巧: PHP 程序员的调试技术 使用 print 语句.错误报告和 PHPE ...

  4. CentOS7 升级python同时解决yum损坏问题

    CentOS7中的python版本为python2.7.5,升级到最新版的python时需要注意两个问题 新版的python安装好后要修改python的系统默认指向问题 升级到最新版python后yu ...

  5. NFC(4)响应NFC设备时启动activity的四重过滤机制

    响应NFC设备时启动activity的四重过滤机制 在一个NFC设备读取NFC标签或另一个NFC设备中的数据之前会在0.1秒之内建立NFC连接,然后数据会自动从被读取一端流向读取数据的一端(NFC设备 ...

  6. Hearthstone-Deck-Tracker汉化处理技巧

    https://github.com/chucklu/Hearthstone-Deck-Tracker 首先本地需要有自己的远端chucklu以及作者的远端epix37 $ git remote -v ...

  7. [HIHO1184]连通性二·边的双连通分量(双连通分量)

    题目链接:http://hihocoder.com/problemset/problem/1184 题意裸,写个博客记下输出姿势. /* ━━━━━┒ギリギリ♂ eye! ┓┏┓┏┓┃キリキリ♂ mi ...

  8. 关于 Memcached 的一些使用

    关于Memcached的一些用法, Memcached 在Windows下的版本费了很大劲,才找到.win32,win64都有.本来想自己build的,但是Cygwin下载包也是费老劲了,下不下来. ...

  9. bzoj1566

    好题,这道题体现了换一个角度计数的思想 a1^2+a2^2+……ak^2=(变成第1种输出序列的操作序列数目)^2+(变成第2种输出序列的操作序列数目)^2…… 脑洞大一点,这就相当于两个操作序列变成 ...

  10. 4010: [HNOI2015]菜肴制作

    拓扑排序+堆. 转自popoqqq神犇. 反向建图跑拓扑排序然后逆序输出. 为什么不能正的来呢,因为不知道选当前菜要先制作哪种菜. 逆序过来跑拓扑的话,也能保证满足限制条件编号小的在前面. 题外话:我 ...