ASP.NET开发中的三层开发思想指的是UI层(界面显示层),BLL层(业务逻辑层),DAL层(数据访问层)三层,三层之间通过函数的调用来达到降低耦合,易于系统维护的目的,SQLHelper助手类的主要作用在于接收并执行来自各个数据表累传来的sql语句或存储过程。一般的SQLHelper类中主要包括以下几个函数功能:

1.执行不带参数的增删改方法

2.执行带参数的增删改方法。

3.执行不带参数的查询方法。

4.执行带参数的查询方法。

作为一个程序员SQLHelper类编写的好坏不仅影响着系统的可维护性的强弱,而且它更体现的是一个编程人员的职业素质。一个程序员的成长过程中必然要经过代码的锤炼,代码见证了一个编程人员的成长历程,下面通过不同版本的SQLHelper类来向大家展示一个良好的SQLHelper助手类是怎样炼成的:

一、初涉江湖版(A级代码)

[csharp] view plain copy
namespace dal
{
public class SQLHelper
{
/// 执行带参数的增删改方法
public int ExecuteNonQuery(string sqltext,CommandType ct,SqlParameter [] paras)
{
string strconn ="server=YCH-PC;database=newssystem;uid=sa;pwd=1314517";
SqlConnection conn = new SqlConnection(strconn); //定义一个数据库连接对象(下同)
conn.Open(); //打开数据库连接(下同)
SqlCommand cmd = new SqlCommand(sqltext , conn ); //实例化一个命令对象(下同)
cmd.CommandType = ct; //指定命令类型(下同)
cmd.Parameters.AddRange(paras); //增加参数(下同)
int res = cmd.ExecuteNonQuery(); //执行命令(下同)
conn .Close (); //关闭数据库连接(下同)
return res; //返回执行结果(下同)
}
/// 执行不带参数的增删改方法
public int ExecuteNonQuery(string sqltext, CommandType ct)
{
string strconn = "server=YCH-PC;database=newssystem;uid=sa;pwd=123456";
SqlConnection conn = new SqlConnection(strconn);
conn.Open();
SqlCommand cmd = new SqlCommand(sqltext, conn);
cmd.CommandType = ct;
int res = cmd.ExecuteNonQuery();
conn.Close();
return res;
}
/// 执行不带参数的查询方法
public DataTable ExecuteQuery(string sqltext, CommandType ct)
{
string strconn = "server=YCH-PC;database=newssystem;uid=sa;pwd=123456";
SqlConnection conn = new SqlConnection(strconn);
conn.Open();
SqlDataReader sdr ;
DataTable dt=new DataTable ();
SqlCommand cmd = new SqlCommand(sqltext, conn);
cmd.CommandType = ct;
sdr = cmd.ExecuteReader();
dt.Load(sdr);
conn.Close();
return dt ;
}
/// 执行带参数的查询操作
public DataTable ExecuteQuery(string sqltext, CommandType ct, SqlParameter[] paras)
{
string strconn = "server=YCH-PC;database=newssystem;uid=sa;pwd=123456";
SqlConnection conn = new SqlConnection(strconn);
conn.Open();
SqlDataReader sdr;
DataTable dt = new DataTable();
SqlCommand cmd = new SqlCommand(sqltext, conn);
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
sdr = cmd.ExecuteReader();
dt.Load(sdr);
conn.Close();
return dt ;
}
}
}

二、血雨腥风版(AA级代码)

从上面的代码中我们可以很明显的看出,各个函数中数据库连接字符串、连接对象以及数据库连接的打开和关闭都是相同的,代码的重复往往是糟糕代码的标志,下面我们就通过代码改造来减少代码冗余,提高代码的复用率。代码的主要改动部分就是针对上述相同的代码片段进行的:

[csharp] view plain copy
namespace dal
{
public class SQLHelper
{
private SqlConnection conn = null;
private SqlCommand cmd = null;
/// 实例化SQLHelper类的时候便实例化一个数据库连接
public SQLHelper()
{
string connStr = "server=YCH-PC;database=newssystem;uid=sa;pwd=123456";
conn = new SqlConnection(connStr);
}
/// 打开数据库连接
private SqlConnection GetConn()
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
return conn;
}
/// 关闭数据库连接
private void OutConn()
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
/// 执行不带参数的增删改操作
public int ExecuteNonQuery(string cmdText, CommandType ct)
{
cmd = new SqlCommand(cmdText, GetConn());
cmd.CommandType = ct;
int res = cmd.ExecuteNonQuery();
OutConn();
return res;
}
/// 执行带参数的增删改方法
public int ExecuteNonQuery(string sqltext, CommandType ct, SqlParameter[] paras)
{
SqlCommand cmd = new SqlCommand(sqltext, GetConn());
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
int res = cmd.ExecuteNonQuery();
OutConn();
return res;
}
/// 执行不带参数的查询方法
public DataTable ExecuteQuery(string sqltext, CommandType ct)
{
DataTable dt = new DataTable();
SqlCommand cmd = new SqlCommand(sqltext, GetConn());
cmd.CommandType = ct;
SqlDataReader sdr = cmd.ExecuteReader();
dt.Load(sdr);
sdr.Close();
OutConn();
return dt;
} /// 执行带参数的查询操作
public DataTable ExecuteQuery(string sqltext, CommandType ct, SqlParameter[] paras)
{
DataTable dt = new DataTable();
SqlCommand cmd = new SqlCommand(sqltext, GetConn());
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
SqlDataReader sdr = cmd.ExecuteReader();
dt.Load(sdr);
sdr.Close();
OutConn();
return dt ;
}
}
}

三、炉火纯青版(AAA级代码)

通过”瘦身行动“,现在的代码是不是比第一版代码清晰了很多呢?但这还不是最后的结果。有的人会提出这样的问题:把连接字符串写在SQLHelper类中,如果我现在要更换数据库,那岂不是要对SQLHelper助手类进行更改,这样似乎不符合我们”开放扩展,关闭修改“的要求。另外在执行查询过程时需要先关闭SqlDataReader再关闭数据库连接,这样在代码中也出现了重复,能不能再进一步对代码进行改造来解决这两个问题呢?下面我们就上述两个问题对代码进行进一的步改造: 解决更换数据库的问题我们采取的方法是将连接字符串写在配置文件中,具体步骤为:

1. 双击web层中Web.config文件,配置文件中的相关内容将会出现。
2. 找到<connectionStrings>和</connectionStrings>,在二者之间添加如下内容:<add name=<add name=连接字符串 connectionString ="server=YCH-PC;database=newssystem;uid=sa;pwd=具体的登陆密码"/>
3. 修改SQLHelper类中的相关代码如下:

[csharp] view plain copy
namespace dal
{
public class SQLHelper
{
private SqlConnection conn = null;
private SqlCommand cmd = null;
private SqlDataReader sdr = null;
public SQLHelper()
{
string strconn = ConfigurationManager.ConnectionStrings["strconn"].ConnectionString;
conn = new SqlConnection(strconn );
} private SqlConnection GetConn()
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
return conn;
} //关闭数据库连接
private void OutConn()
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
}
/// 执行不带参数的增删改SQL语句或存储过程
public int ExecuteNonQuery(string cmdText, CommandType ct)
{
int res;
try
{
cmd = new SqlCommand(cmdText, GetConn());
cmd.CommandType = ct;
res = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
OutConn();
}
return res;
}
/// 执行带参数的增删改SQL语句或存储过程
public int ExecuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct)
{
int res;
try
{
cmd = new SqlCommand(cmdText, GetConn());
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
res = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
throw ex;
}
finally
{
OutConn();
}
return res;
} /// 执行不带参数的查询SQL语句或存储过程
public DataTable ExecuteQuery(string cmdText, CommandType ct)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(cmdText, GetConn());
cmd.CommandType = ct;
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}
/// 执行带参数的查询SQL语句或存储过程
public DataTable ExecuteQuery(string cmdText, SqlParameter[] paras, CommandType ct)
{
DataTable dt = new DataTable();
cmd = new SqlCommand(cmdText, GetConn());
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}
}
}

经过对代码的再次改造,不但代码的重复率大大降低,而且如需更换数据库,只要在配置文件中更改相应的连接字符串就可完。在编写查询(包括带参数的和不带参数的查询方法)方法时,用using方法,在关闭SqlDataReader对象的时候同时关闭与之相关联的数据库连接,避免了try catch语句的使用,代码更加简洁。经过三次改造,SQLHelper助手类的变身就此完成。

【ASP.NET-中级】SQLHelper数据访问公共类的更多相关文章

  1. 数据访问公共类(BaseProvider)

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

  2. 基于SqlSugar的开发框架循序渐进介绍(4)-- 在数据访问基类中对GUID主键进行自动赋值处理

    我们在设计数据库表的时候,往往为了方便,主键ID一般采用字符串类型或者GUID类型,这样对于数据库表记录的迁移非常方便,而且有时候可以在处理关联记录的时候,提前对应的ID值.但有时候进行数据记录插入的 ...

  3. 在 ASP.NET 中创建数据访问和业务逻辑层(转)

    .NET Framework 4 当在 ASP.NET 中处理数据时,可从使用通用软件模式中受益.其中一种模式是将数据访问代码与控制数据访问或提供其他业务规则的业务逻辑代码分开.在此模式中,这两个层均 ...

  4. asp.net/wingtip/创建数据访问层

    一. 什么是数据访问层 在wingtip项目中,数据访问层是对以下三者的总称:1. product类等数据相关的实体类(class)2. 数据库(database),对实体类成员的存储3. 上述二者的 ...

  5. 数据访问层的超级基类AbstractBaseDAL

    using System; using System.Collections; using System.Data; using System.Data.Common; using System.Co ...

  6. [转]DbHelper通用数据库访问帮助类

    之前我一直都是在博客园中查看各位高手的博文,确实学到了不少知识,不过比较少写博客,现在就把我自己在项目实施过程中使用到比较好的技术框架写出来,希望能让更多的人了解和学习. 通常我们在开发使用数据库访问 ...

  7. Spring.NET 中的 ADO.NET 数据访问的示例

    Spring.NET 1.3.1 中提供了一个使用 AdoTemplate 的完整示例,包括使用泛型和使用非泛型技术进行数据访问,这个示例位于下载的压缩包中\Spring.NET-1.3.1\Spri ...

  8. JS设计模式(三) 数据访问对象模式

    引言 HTML5 提供了两种在客户端存储数据的新方法:localStorage.sessionStorage,他们是Web Storage API 提供的两种存储机制,区别在于前者属于永久性存储,而后 ...

  9. C# 通用数据访问类(SqlHelper)

    [转]C# 通用数据访问类(SqlHelper) 注:本文转自http://www.tzwhx.com/newOperate/html/3/31/312/13080.htmlVisual C# 动态操 ...

随机推荐

  1. JS核心之DOM操作 下

    目录: 1.节点类型之Document类型 2.节点类型之Element类型 3.节点类型之Text类型 4.综合小示例 -- 动态添加外部样式文件 5.查找元素的扩展方法 接上篇,我们先来看常用的三 ...

  2. Asp.net之MsChart控件动态绑定温度曲线图

    <div> <div style="position: absolute; z-index: 200; background-color: #FFFFFF; height: ...

  3. javascript 基础知识汇总(一)

    1.<script> 标签 1) 可以通过<script> 标签将javaScript 代码添加到页面中 (type 和language 属性不是必须的) 2)外部的脚本可以通 ...

  4. spring-cloud-kubernetes的服务发现和轮询实战(含熔断)

    本文是<spring-cloud-kubernetes实战系列>的第四篇,主要内容是在kubernetes上部署两个应用:Web-Service和Account-Service,通过spr ...

  5. px和dp(内含大量的像素单位详解)

    1.前言: 读完本文你会学到什么: dp(device pixels) px(css pixels) pt(point) ppi(pixels per inch) dpi(dots per inch) ...

  6. 2019dx#7

    Solved Pro.ID Title Ratio(Accepted / Submitted)   1001 A + B = C 10.48%(301/2872)   1002 Bracket Seq ...

  7. P2154 [SDOI2009]虔诚的墓主人 树状数组

    https://www.luogu.org/problemnew/show/P2154 题意 在一个坐标系中,有w(1e5)个点,这个图中空点的权值是正上,正下,正左,正右各取k个的排列组合情况.计算 ...

  8. Problem : 这个题如果不是签到题 Asm.Def就女装(积性函数dp

    https://oj.neu.edu.cn/problem/1460 思路:若n=(p1^a1)*(p2^a2)...(pn^an),则f(n,0)=a1*a2*...*an,显然f(n,0)是积性函 ...

  9. CodeForces-768B-Code For 1+DFS类似线段树思想

    Code For 1 题意:对于一个n,可以将它分解为n/2,n%2,n/2三个数字,重复上述操作知道虽有值为1或0为止: 求L---R区间数列的和: 思路:首先画着画着可以发现这是一个类似线段数的结 ...

  10. HDU-2795Billboard+对宽度建立线段树

    参考:  https://blog.csdn.net/qiqi_skystar/article/details/49073309 传送门:http://acm.hdu.edu.cn/showprobl ...