首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

ADO.NET通用DBHelper类,自己这两天琢磨的,和大家分享上,主要是希望有高手能指点上,好让小弟我改进

2012-10-23 
ADO.NET通用DBHelper类,自己这两天琢磨的,和大家分享下,主要是希望有高手能指点下,好让我改进!C# codeusin

ADO.NET通用DBHelper类,自己这两天琢磨的,和大家分享下,主要是希望有高手能指点下,好让我改进!

C# code
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         




[解决办法]
这样的基类其实蛮多的,东软生成后会是微软自带的基类可以,自己写方法也有很多。
你这也收下了,顶!
[解决办法]
我不建议你在每个数据库的方法中使用泛型,这会给未来的调用带来一点点繁琐。。。。 为什么你不考虑使用System.Data.Common 下的类呢。。。。给你一个例子希望能对你有用(为了避免喧宾夺主,我吧析构等都去掉了)

C# code
using System;using System.Collections.Generic;using System.Text;using System.Data;using System.Data.Common;using System.Reflection;namespace DBAnalyzer{    /// <summary>    /// 数据库服务类    /// </summary>    public class DbProvider : IDisposable    {        #region 属性        /// <summary>        /// 数据库连接        /// </summary>        protected DbConnection Connection        {            get;            set;        }        /// <summary>        /// 数据库命令对象        /// </summary>        protected DbCommand Command        {            get;            set;        }        /// <summary>        /// 数据库适配器对象        /// </summary>        protected DbDataAdapter Adapter        {            get;            set;        }        #endregion        /// <summary>        /// 错误信息        /// </summary>        public string ErrorMessage        {            get;            set;        }              #region 方法        /// <summary>        /// 创建类对象(System.Data.dll)        /// </summary>        /// <param name="dbType">SqlClient.Sql;OleDb.OleDb;Odbc.Odbc</param>        /// <param name="classType">Connection;DataAdapter</param>        /// <returns></returns>        private object CreateInstance(string dbType, string classType)        {            return Assembly.LoadFile(string.Format("{0}\\System.Data.dll", Global.PhysicalPath))                .CreateInstance(string.Format("System.Data.{0}{1}", dbType, classType));        }        public bool Connect(string dbType, string connectionString)        {            this.ErrorMessage = string.Empty;            try            {                //利用反射创建实例                this.Connection = (DbConnection)this.CreateInstance(dbType, "Connection");                this.Connection.ConnectionString = connectionString;                //打开                this.Connection.Open();                #region 生成一系列对象                this.Command = this.Connection.CreateCommand();                this.Adapter = (DbDataAdapter)this.CreateInstance(dbType, "DataAdapter");                this.Adapter.SelectCommand = this.Command;                #endregion                return true;            }            catch (Exception error)            {                this.ErrorMessage = error.Message;                return false;            }        }        #region 查询        /// <summary>        /// 查询        /// </summary>        /// <param name="type"></param>        /// <param name="timeout">超时(秒)</param>        /// <param name="sql"></param>        /// <param name="parameters"></param>        /// <returns></returns>        private DataTable Query(CommandType type, int timeout, string sql, params DbParameter[] parameters)        {            this.ErrorMessage = string.Empty;            try            {                //命令                this.Command.CommandText = sql;                this.Command.CommandType = type;                this.Command.CommandTimeout = timeout;                this.Command.Parameters.Clear();                if (parameters.Length > 0)                {                    this.Command.Parameters.AddRange(parameters);                }                //填充数据集                DataTable result = new DataTable();                this.Adapter.Fill(result);                //返回                return result;            }            catch (Exception error)            {                this.ErrorMessage = error.Message;                return null;            }        }        /// <summary>        /// SQL查询        /// </summary>        /// <param name="sql"></param>        /// <param name="timeout">超时(秒)</param>        /// <param name="parameters"></param>        /// <returns></returns>        public DataTable Query(string sql, int timeout, params DbParameter[] parameters)        {            return this.Query(CommandType.Text, timeout, sql, parameters);        }        public DataTable Query(string sql, params DbParameter[] parameters)        {            return this.Query(CommandType.Text, 30, sql, parameters);        }        #endregion        #endregion    }} 


[解决办法]
4楼的不错,更简洁
[解决办法]
不错,收藏了
[解决办法]
学习了,顶一下!
[解决办法]
我早上回复了一个帖子,参考:http://topic.csdn.net/u/20110925/09/8f715b25-adde-46a4-97f9-4cfc42d832f9.html

热点排行
Bad Request.