自己写的一个DBHelper,由于是一个底层的东西(自己也是第一次搞),主要是用在Web程序中,请大家指出不足

烟波钓 2011-12-09 02:11:58
代码大体如下:

public class DbHelper
{
#region 私有构造和私有变量
/// <summary>
/// 私有构造函数
/// </summary>
private DbHelper()
{
}
/// <summary>
/// 默认的数据库连接字串,此连接字串在此类第一次初始化的时候进行初始化
/// </summary>
private static string connString = ConfigurationManager.ConnectionStrings["ConnString"].ToString();
#endregion

#region 返回受影响的行数
/// <summary>
/// 按照指定的语句对数据表进行操作,返回受影响的行数
/// </summary>
/// <param name="sqlStr">操作语句</param>
/// <returns>受影响的行数</returns>
public static int ExecuteNonQuery(string sqlStr)
{
int mark = 0;
using (SqlConnection con = new SqlConnection(connString))
{
SqlCommand cmd = new SqlCommand(sqlStr, con);
try
{
if (con.State != ConnectionState.Open)
con.Open();
mark = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
PubFunction.ErrorLogPrint(sqlStr, ex.ToString());
}
finally
{
if (con.State != ConnectionState.Closed)
con.Close();
}
return mark;
}
}
/// <summary>
/// 按照指定的语句对数据表进行操作,返回受影响的行数
/// </summary>
/// <param name="sqlStr">操作语句</param>
/// <param name="conString">非默认的数据连接字符串</param>
/// <returns>受影响的行数</returns>
public static int ExecuteNonQuery(string sqlStr, string conString)
{
using (SqlConnection myCon = new SqlConnection(conString))
{
int mark = 0;
SqlCommand cmd = new SqlCommand(sqlStr, myCon);
try
{
if (myCon.State != ConnectionState.Open)
myCon.Open();
mark = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
PubFunction.ErrorLogPrint(sqlStr, ex.ToString());
}
finally
{
if (myCon.State != ConnectionState.Closed)
myCon.Close();
}
return mark;
}
}
/// <summary>
/// 按照指定的语句对数据表进行操作,返回受影响的行数
/// </summary>
/// <param name="sqlStr">操作语句</param>
/// <param name="isProc">是否是存储过程,true:是;fale:不是</param>
/// <param name="parameter">参数列表,可缺失</param>
/// <returns>受影响的行数</returns>
public static int ExecuteNonQuery(string sqlStr, bool isProc, params SqlParameter[] parameter)
{
int mark = 0;
using (SqlConnection con = new SqlConnection(connString))
{
SqlCommand cmd = new SqlCommand(sqlStr, con);
if (isProc)
{
cmd.CommandType = CommandType.StoredProcedure;
}
if (parameter != null && parameter.Length > 0)
{
foreach (SqlParameter item in parameter)
{
cmd.Parameters.Add(item);
}
}
try
{
if (con.State != ConnectionState.Open)
con.Open();
mark = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
PubFunction.ErrorLogPrint(sqlStr, ex.ToString());
}
finally
{
if (con.State != ConnectionState.Closed)
con.Close();
}
return mark;
}
}
/// <summary>
/// 按照指定的语句对数据表进行操作,返回受影响的行数
/// </summary>
/// <param name="sqlStr">操作语句</param>
/// <param name="conString">非默认的数据连接字符串</param>
/// <param name="isProc">是否是存储过程,true:是;fale:不是</param>
/// <param name="parameter">参数列表,可缺失</param>
/// <returns>受影响的行数</returns>
public static int ExecuteNonQuery(string sqlStr, string conString, bool isProc, params SqlParameter[] parameter)
{
using (SqlConnection myCon = new SqlConnection(conString))
{
int mark = 0;
SqlCommand cmd = new SqlCommand(sqlStr, myCon);
if (isProc)
{
cmd.CommandType = CommandType.StoredProcedure;
}
if (parameter != null && parameter.Length > 0)
{
foreach (SqlParameter item in parameter)
{
cmd.Parameters.Add(item);
}
}
try
{
if (myCon.State != ConnectionState.Open)
myCon.Open();
mark = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
PubFunction.ErrorLogPrint(sqlStr, ex.ToString());
}
finally
{
if (myCon.State != ConnectionState.Closed)
myCon.Close();
}
return mark;
}
}
#endregion
}

这只是一部分,敬请指出这样写可能出现的问题,谢谢大家
...全文
2218 66 打赏 收藏 转发到动态 举报
写回复
用AI写文章
66 条回复
切换为时间正序
请发表友善的回复…
发表回复
烟波钓 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 47 楼 microtry 的回复:]
引用 45 楼 sunzongbao2007 的回复:
异常捕获的有点早。throw it

41楼的建议是比较合理的,不处理就不要catch,catch了就不要throw,在应用程序边界catch
[/Quote]
3Q very much

开始研究动软自动生成的Dbhelper了
烟波钓 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 cmhua 的回复:]
数据库最重要的“事务处理”呢?
[/Quote]
 /// <summary>
/// 执行事务
/// </summary>张辉 2011.09.21
/// <param name="cmdList">需要按事务执行的Sql语句集合</param>
/// <returns>返回true:执行成功;返回false:执行失败</returns>
public static bool ExecuteTran(List<string> cmdList)
{
bool mark = false;
using (SqlConnection con = new SqlConnection(connString))
{
if (con.State != ConnectionState.Open)
con.Open();
SqlTransaction tran = con.BeginTransaction();
try
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.Transaction = tran;
foreach (string item in cmdList)
{
cmd.CommandText = item;
cmd.ExecuteNonQuery();
}
mark = true;
tran.Commit();
}
catch (Exception ex)
{
PubFunction.ErrorLogPrint("事务执行", ex.Message);
tran.Rollback();
}
return mark;
}
}
/// <summary>
/// 执行事务,可自定义连接字符串
/// </summary>张辉 2011.09.21
/// <param name="cmdList">需要按事务执行的Sql语句集合</param>
/// <param name="conStr">自定义的连接字符串</param>
/// <returns>返回true:执行成功;返回false:执行失败</returns>
public static bool ExecuteTran(List<string> cmdList, string conStr)
{
using (SqlConnection myCon = new SqlConnection(conStr))
{
bool mark = false;
if (myCon.State != ConnectionState.Open)
myCon.Open();
SqlTransaction tran = myCon.BeginTransaction();
try
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = myCon;
cmd.Transaction = tran;
foreach (string item in cmdList)
{
cmd.CommandText = item;
cmd.ExecuteNonQuery();
}
mark = true;
tran.Commit();
}
catch (Exception ex)
{
PubFunction.ErrorLogPrint("事务执行", ex.Message);
tran.Rollback();
}
return mark;
}
}
/// <summary>
/// 带参数的存储过程执行
/// </summary>张辉 2011.09.28 添加
/// <param name="cmdList">执行命令和参数列表集合列表</param>
/// <returns>true:执行成功 false:执行失败</returns>
public static bool ExecuteTran(List<SqlStrWithParameter> cmdList)
{
bool mark = false;
using (SqlConnection con = new SqlConnection(connString))
{
if (con.State != ConnectionState.Open)
con.Open();
SqlTransaction tran = con.BeginTransaction();
try
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.Transaction = tran;
foreach (SqlStrWithParameter item in cmdList)
{
cmd.Dispose();
cmd.CommandText = item.SqlStr;
foreach (SqlParameter p in item.Parameters)
{
cmd.Parameters.Add(p);
}
cmd.ExecuteNonQuery();
}
mark = true;
tran.Commit();
}
catch (Exception ex)
{
PubFunction.ErrorLogPrint("事务执行", ex.Message);
tran.Rollback();
}
return mark;
}
}

/// <summary>
/// 封装带参数的Sql语句
/// </summary>张辉 2011.9.28 添加
public class SqlStrWithParameter
{
/// <summary>
/// 重定义的构造函数,用于初始化自己的操作字串和参数列表
/// </summary>
/// <param name="sqlStr">操作字串</param>
/// <param name="parameter">参数列表数组</param>
public SqlStrWithParameter(string sqlStr, SqlParameter[] parameter)
{
sqlstr = sqlStr;
parameters = parameter;
}
string sqlstr;
SqlParameter[] parameters;
/// <summary>
/// Sql命令语句
/// </summary>
public string SqlStr
{
get
{
return sqlstr;
}
set
{
sqlstr = value;
}
}
/// <summary>
/// 该Sql命令语句所带的参数
/// </summary>
public SqlParameter[] Parameters
{
get
{
return parameters;
}
set
{
parameters = value;
}
}
}


oocean 2011-12-15
  • 打赏
  • 举报
回复
if (con.State != ConnectionState.Open)
con.Open();

这不蛋痛吗?
灵雨飘零 2011-12-15
  • 打赏
  • 举报
回复
挑粪编码员 2011-12-15
  • 打赏
  • 举报
回复
我只能说大同小异吧
gw6328 2011-12-14
  • 打赏
  • 举报
回复
我看了楼上的,为什么不能用try catch.我看微软写的也都用的try catch,没有用的一些方法都用了using
所以楼主用了using的方法可以不用try catch.但是其它的应该都要用try catch吧。
luoyanqing119 2011-12-13
  • 打赏
  • 举报
回复
05年以经搞了,你这个应该是在网上COPY来改改的。
镜花水月之楠 2011-12-13
  • 打赏
  • 举报
回复
写这么多,很多时候都用不上。。。帅哥
懒虫虫 2011-12-13
  • 打赏
  • 举报
回复
是基本的用法,还少了些通用的调用数据库方法!!
JXFLYfly 2011-12-13
  • 打赏
  • 举报
回复
一个SQLHelper 楼主应该做些扩展工作
erwei1111 2011-12-13
  • 打赏
  • 举报
回复
叫sqlhelp不叫dbhelp
cmHua 2011-12-13
  • 打赏
  • 举报
回复
数据库最重要的“事务处理”呢?
缪军 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 sunzongbao2007 的回复:]
异常捕获的有点早。throw it
[/Quote]
41楼的建议是比较合理的,不处理就不要catch,catch了就不要throw,在应用程序边界catch
缪军 2011-12-12
  • 打赏
  • 举报
回复
比如说:public static int ExecuteNonQuery(string sqlStr, bool isProc, params SqlParameter[] parameter)
其实command对象封装的很好了,你硬是要把属性拆散成多个参数传入
这样的话,你的接口关注的都是细节,难以适应变化

微软为我们搭建了一个宽泛的优秀的DAL框架,
你要做的就是在这个基础上扩展,让他更加适应你们的开发组织所从事的业务领域
比如,你应该扩展Command,扩展Parameter
铜臂阿铁木 2011-12-12
  • 打赏
  • 举报
回复
异常捕获的有点早。throw it
烟波钓 2011-12-12
  • 打赏
  • 举报
回复
呵呵 突然发现自己还有一个用动软生成的项目 看看它生成的DBHelper也不错 在这个基础上进行一些修改吧 谢谢大家了 结贴了
烟波钓 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 microtry 的回复:]
我觉得楼主的设计还可以改进:
1.ado的编程模型已经很优秀了,你不应该放弃这个设计,而是应该扩展这个设计
很多编写Dal的设计者都自作聪明的创造一些方法和对象,但其结果都是设计上的倒退
2.应该考虑应用程序可以同时访问多个数据库,这是商业企业应用最基本的需求
用对象属性去指代数据连接字串,而不是明文通讯数据链接字串
真正理解ado的设计思想,才能设计出更专业的DAL;


……
[/Quote]对不起 我现在有点乱了 不是很理解您的意思
烟波钓 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 qldsrx 的回复:]
异常处理有问题,全部执行代码都使用try语句,那么调用者就不知道这个SQL是否正确执行了,即使有日志,如果不能及时在出错时将程序停住,后面就回继续执行下去,因此这里的异常是不应该直接捕获掉的。
[/Quote]3Q 呵呵 受教了
Tears_cheng 2011-12-12
  • 打赏
  • 举报
回复
很不错
jAmEs_ 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ssp2009 的回复:]

引用 6 楼 yanbuodiao 的回复:
引用 4 楼 return_false 的回复:
基本的东西都是大同小异,只不过是细节的变化而已
我想问一下,这种写法能否适应几千人同时访问网站,因为怕几千人同时访问这个网站时,由于这个dbhelper成为网站访问速度慢的一个瓶颈
网站访问跟你的服务器,数据库处理速度有关,dbhelper毫无关系
[/Quote]对头
加载更多回复(38)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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