.NET开发之DBHelper通用类

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Data.OracleClient;
using System.Data.OleDb;
using System.Data.Odbc;
using System.Reflection;

namespace WebDAL
{

    public class DBHelper
    {
        #region 属性

        //项目中添加如下引用
        //System.Configuration
        //System.Data.OracleClient


        //web.config中增加如下节点
        //<appSettings>
        //<add key="DBType" value="SQLServer"/>配置数据库类型SQLServer||OleDb||ODBC||Oracle
        //<add key="SQLServer" value="连库字符串"/>配置该数据库类型对应的连库字符串
        //<add key="assemblyName" value="Entity"/>指定实体类的命名空间
        //</appSettings>

        //获取连接字符串和数据库类型
        //从Web.config文件中动态获取
       
        private static string conType=ConfigurationManager.AppSettings["DBType"].ToString();

        private static string constr = ConfigurationManager.AppSettings[conType].ToString();

        //动态获取程序集名称,以备反射时所用
        private static string assemblyName = ConfigurationManager.AppSettings["assemblyName"].ToString();
        #endregion

        #region 私有方法

        /// <summary>
        /// 根据数据库类型,获取对应数据库的连接
        /// </summary>
        /// <returns>连接接口</returns>
        private static IDbConnection GetConnection()
        {
            IDbConnection con = null;
            if (conType == DBType.SQLServer.ToString())
            {
                con = new SqlConnection(constr);
            }
            else if (conType == DBType.Oracle.ToString())
            {
                con = new OracleConnection(constr);
            }
            else if (conType == DBType.OleDb.ToString())
            {
                con = new OleDbConnection(constr);
            }
            else if (conType == DBType.ODBC.ToString())
            {
                con = new OdbcConnection(constr);
            }
            else
            {
                con = new SqlConnection(constr);
            }
            return con;
        }

        /// <summary>
        /// 根据数据库类型,获取对应Command对象
        /// </summary>
        /// <param name="cmdText">SQL语句或存储过程名</param>
        /// <param name="cmdType">SQL命令类型</param>
        /// <param name="con">连接对象</param>
        /// <param name="param">SQL命令参数数组</param>
        /// <returns>Command接口对象</returns>
        private static IDbCommand GetCommand(string commandText,CommandType commandType,IDbConnection con, params IDbDataParameter[] param)
        {
            IDbCommand cmd = null;
            if (conType == DBType.SQLServer.ToString())
            {
                cmd = new SqlCommand(commandText,con as SqlConnection);
            }
            else if (conType == DBType.Oracle.ToString())
            {
                cmd = new OracleCommand(commandText, con as OracleConnection);
            }
            else if (conType == DBType.OleDb.ToString())
            {
                cmd = new OleDbCommand(commandText,con as OleDbConnection);
            }
            else if (conType == DBType.ODBC.ToString())
            {
                cmd = new OdbcCommand(commandText,con as OdbcConnection);
            }
            else
            {
                cmd = new SqlCommand(commandText, con as SqlConnection);
            }
            cmd.CommandType = commandType;
            if (param != null)
            {
                cmd.Parameters.Add(param);
            }
            return cmd;
        }

        /// <summary>
        /// 执行返回一条记录的泛型集合对象
        /// </summary>
        /// <typeparam name="T">泛型类型</typeparam>
        /// <param name="reader">Reader对象,用于读取数据结果集</param>
        /// <returns>泛型对象</returns>
        private static T ExexuteDataReader<T>(IDataReader reader)
        {
            T obj = default(T);
            try
            {
                Type type = typeof(T);
                obj = (T)Assembly.Load(DBHelper.assemblyName).CreateInstance(assemblyName + "." + type.Name);
                PropertyInfo[] propertyInfos = type.GetProperties();
                foreach (PropertyInfo propertyinfo in propertyInfos)
                {
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        string filedName = reader.GetName(i);
                        if (filedName.ToLower() == propertyinfo.Name.ToLower())
                        {
                            Object value = reader[propertyinfo.Name];
                            if (value != null && value != DBNull.Value)
                            {
                                propertyinfo.SetValue(obj, value, null);
                                break;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return obj;
        }
        #endregion

        #region 公有方法
        /// <summary>
        /// 执行返回一行一列的数据库操作
        /// </summary>
        /// <param name="cmdText">SQL语句或存储过程名</param>
        /// <param name="cmdType">SQL命令类型</param>
        /// <param name="param">SQL命令参数数组</param>
        /// <returns>第一行第一列记录</returns>
        public static int ExecuteScalar(string commandText, CommandType commandType, params IDbDataParameter[] param)
        {
            int result = 0;
            try
            {
                IDbConnection con = GetConnection();
                IDbCommand cmd = GetCommand(commandText, commandType, con, param);
                using (con)
                {
                    using (cmd)
                    {
                        con.Open();
                        result = Convert.ToInt32(cmd.ExecuteScalar());
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return result;
        }

        /// <summary>
        /// 执行非查询的数据库操作
        /// </summary>
        /// <param name="cmdText">SQL语句或存储过程名</param>
        /// <param name="cmdType">SQL命令类型</param>
        /// <param name="param">SQL命令参数数组</param>
        /// <returns>受影响的行数</returns>
        public static int ExecuteNonQuery(string commandText, CommandType commandType, params IDbDataParameter[] param)
        {
            int result = 0;
            try
            {
                IDbConnection con = GetConnection();
                IDbCommand cmd = GetCommand(commandText, commandType, con, param);
                using (con)
                {
                    using (cmd)
                    {
                        con.Open();
                        IDbTransaction tr = con.BeginTransaction();
                        cmd.Transaction = tr;
                        try
                        {
                            result = Convert.ToInt32(cmd.ExecuteNonQuery());
                            tr.Commit();
                        }
                        catch (Exception ex)
                        {
                            tr.Rollback();
                            throw ex;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return result;
        }

        /// <summary>
        /// 执行返回一条记录的泛型对象
        /// </summary>
        /// <typeparam name="T">泛型类型</typeparam>
        /// <param name="commandText">SQL语句或存储过程名</param>
        /// <param name="commandType">SQL命令类型</param>
        /// <param name="param">SQL命令参数数组</param>
        /// <returns>实体对象</returns>
        public static T ExexuteEntity<T>(string commandText, CommandType commandType, params IDbDataParameter[] param)
        {
            T obj = default(T);
            try
            {
                IDbConnection con = GetConnection();
                IDbCommand cmd = GetCommand(commandText, commandType, con, param);
                using (con)
                {
                    using (cmd)
                    {
                        con.Open();
                        IDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                        while (reader.Read())
                        {
                            obj = DBHelper.ExexuteDataReader<T>(reader);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return obj;
        }

        /// <summary>
        /// 执行返回多行记录的泛型集合对象
        /// </summary>
        /// <typeparam name="T">泛型类型</typeparam>
        /// <param name="commandText">SQL语句或村存储过程名</param>
        /// <param name="commandType">SQL命令类型</param>
        /// <param name="param">SQL命令参数数组</param>
        /// <returns>泛型集合对象</returns>
        public static List<T> ExecuteList<T>(string commandText, CommandType commandType, params IDbDataParameter[] param)
        {
            List<T> list = new List<T>();
            try
            {
                IDbConnection con = GetConnection();
                IDbCommand cmd = GetCommand(commandText, commandType, con, param);
                using (con)
                {
                    using (cmd)
                    {
                        con.Open();
                        IDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                        while (reader.Read())
                        {
                            T obj = DBHelper.ExexuteDataReader<T>(reader);
                            list.Add(obj);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return list;
        }
        #endregion
    }

    #region 数据库类型枚举
    /// <summary>
    /// 该枚举类型用于创建合适的数据库访问对象
    /// </summary>
    public enum DBType
    {
        SQLServer,
        OleDb,
        ODBC,
        Oracle
    }
    #endregion
}

个人曾经写过的数据访问接口,包含:MSSQL、Mysql、Oracle等数据库的公共处理接口。可以拿过来直接使用,放在手里好多年了。 IDatabase接口声明如下: namespace Simple.Database { /// /// IDatabase 接口 /// public interface IDatabase { DbConnection dbConn { get; set; } /// /// 创建 DbConnection 对象实例。 /// /// DbConnection 对象实例。 DbConnection CreateConnection(); /// /// 创建 DbCommand 对象实例。 /// /// DbCommand 对象实例。 DbCommand CreateCommand(); /// /// 创建 DbCommand 对象实例。 /// /// Sql 语句或存储过程名。 /// CommandType 参数。 /// DbCommand 对象实例。 DbCommand CreateCommand(string text, CommandType type); /// /// 创建 DbCommand 对象实例。 /// /// Sql 语句或存储过程名。 /// CommandType 参数。 /// 参数集合。 /// DbCommand 对象实例。 DbCommand CreateCommand(string text, CommandType type, IDataParameter[] paras); /// /// 创建 DbCommand 对象实例。 /// /// DbConnection 对象。 /// Sql 语句或存储过程名。 /// CommandType 参数。 /// 参数集合。 /// DbCommand 对象实例。 DbCommand CreateCommand(DbConnection conn, string text, CommandType type, IDataParameter[] paras); /// /// 创建 DbDataAdapter 对象实例。 /// /// DbDataAdapter 对象实例。 DbDataAdapter CreateDataAdapter(); /// /// 创建 DbParameter 对象实例。 /// /// DbParameter 对象实例。 DbParameter CreateParameter(); /// /// 创建 DbParameter 对象实例。 /// /// 参数名称。 /// 参数值。 /// DbParameter 对象实例。 DbParameter CreateParameter(string name, Object value); /// /// 创建 DbParameter 对象实例。 /// /// 参数名称。 /// 参数型。 /// DbParameter 对象实例。 DbParameter CreateParameter(string name, DbType type); /// /// 创建 DbParameter 对象实例。 /// /// 参数名称。 /// 参数型。 /// 数据的最大大小。 /// DbParameter 对象实例。 DbParameter CreateParameter(string name, DbType type, int size); /// /// 获取指定长度数据的 DataSet 对象。 /// /// 要读取的 Sql 语句。 /// 开始读取位置的索引。 /// 待读取记录集的长度。 /// DataSet 对象。 DataSet GetDataSet(string sql, int start, int length); /// /// 获取指定长度数据的 DataTable 对象。 /// /// 要读取的 Sql 语句。 /// 开始读取位置的索引。 /// 待读取记录集的长度。 /// DataTable 对象。 DataTable GetDataTable(string sql, int start, int length); /// /// 执行Insert、Update、Delete等操作,并返回受影响的记录数。 /// /// 要执行的 Sql 语句。 /// 受影响的记录数。 int GetEffect(string sql); /// /// 执行 Insert、Update、Delete 等操作,并返回受影响的记录数。 /// /// 要执行的 Sql 语句或存储过程名等。 /// CommandType 的型,即该命令是 Sql 语句,还是存储过程名等。 /// 受影响的记录数。 int GetEffect(string sql, CommandType type); /// /// 执行带参数的 Sql 语句或存储过程,并返回受影响的记录数。 /// /// 要执行的 Sql 语句或存储过程名等。 /// CommandType 参数型,即该命令是 sql 语句,还是存储过程名等。 /// 参数集合。 /// 受影响的记录数。 int GetEffect(string text, CommandType type, IDataParameter[] paras); /// /// /// /// /// /// /// /// /// int GetEffect(DbConnection conn, string text, CommandType type, IDataParameter[] paras, DbTransaction DbTrans); /// /// /// /// /// List ExecuteTransaction(params string[] sqls); /// /// 执行 Select 语句,并返回 DataSet 对象。 /// /// 要执行的 Sql 语句。 /// DataSet 对象。 DataSet GetDataSet(string sql); /// /// 执行 Select 语句或存储过程,并返回 DataSet 对象。 /// /// 要执行的 Sql 语句或存储过程名等。 /// CommandType 参数型,即该命令是 sql 语句,还是存储过程名等。 /// DataSet 对象。 DataSet GetDataSet(string text, CommandType type); /// /// 执行带参数的 Sql 语句或存储过程,并返回 DataSet 对象。 /// /// 要执行的 Sql 语句或存储过程名等。 /// CommandType 参数型,即该命令是 sql 语句,还是存储过程名等。 /// 参数集合。 /// DataSet 对象。 DataSet GetDataSet(string text, CommandType type, IDataParameter[] paras); /// /// 执行 Select 语句,并返回 DataTable 对象。 /// /// 要执行的 Sql 语句。 /// DataTable 对象。 DataTable GetDataTable(string sql); /// /// 执行 Select 语句或存储过程,并返回 DataTable 对象。 /// /// 要执行的 Sql 语句或存储过程名等。 /// CommandType 参数型,即该命令是 sql 语句,还是存储过程名等。 /// DataTable 对象。 DataTable GetDataTable(string text, CommandType type); /// /// 执行带参数的 Sql 语句或存储过程,并返回 DataTable 对象。 /// /// 要执行的 Sql 语句或存储过程名等。 /// CommandType 参数型,即该命令是 sql 语句,还是存储过程名等。 /// 参数集合。 /// DataTable 对象。 DataTable GetDataTable(string text, CommandType type, IDataParameter[] paras); /// /// 获取查询所返回的结果集中第一行第一列的值。 /// /// 要处理的 sql 语句(包含待查询的字段)。 /// 字段值。 object GetField(string sql); /// /// 获取查询所返回的结果集中第一行指定列的值。 /// /// 待查询的数据表名称。 /// 待获取字段的列名。 /// 字段值。 object GetField(string sql, string field); /// /// 获取查询所返回的结果集中第一行指定列集合的值。 /// /// 要处理的 sql 语句。 /// 待获取字段的列表。 /// 字段值集合。 object[] GetField(string sql, params string[] fields); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值