这是我最近研究ADO.NET写的一个DBHelper类,其中有自己写的东西,也有套用他人的东西,发上来以来与大家分享下,二来想求高手指点,能是改进!!!

jdc71264 2011-09-21 03:10:43
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();
result = Convert.ToInt32(cmd.ExecuteNonQuery());
}
}
}
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
}
...全文
106 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jdc71264 2011-09-21
  • 打赏
  • 举报
回复
真的都没人关注这方面的东西吗难道 在线等待中。。。
posefooler 2011-09-21
  • 打赏
  • 举报
回复
jdc71264 2011-09-21
  • 打赏
  • 举报
回复
希望各位高手多多提意见,找毛病,我好改进!!!小弟谢谢了!!!
jdc71264 2011-09-21
  • 打赏
  • 举报
回复
自己抢了 哈哈
诺维斯基 2011-09-21
  • 打赏
  • 举报
回复
顶一下、10分!!
小珩 2011-09-21
  • 打赏
  • 举报
回复
沙花被抢了,只能看代码了
Gemini Dean 2011-09-21
  • 打赏
  • 举报
回复

顶顶!
jdc71264 2011-09-21
  • 打赏
  • 举报
回复
自己先顶下

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧