【ASP.NET-中级】SQLHelper数据访问公共类
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数据访问公共类的更多相关文章
- 数据访问公共类(BaseProvider)
using System; using System.Data; using System.Data.Common; using System.Configuration; using System. ...
- 基于SqlSugar的开发框架循序渐进介绍(4)-- 在数据访问基类中对GUID主键进行自动赋值处理
我们在设计数据库表的时候,往往为了方便,主键ID一般采用字符串类型或者GUID类型,这样对于数据库表记录的迁移非常方便,而且有时候可以在处理关联记录的时候,提前对应的ID值.但有时候进行数据记录插入的 ...
- 在 ASP.NET 中创建数据访问和业务逻辑层(转)
.NET Framework 4 当在 ASP.NET 中处理数据时,可从使用通用软件模式中受益.其中一种模式是将数据访问代码与控制数据访问或提供其他业务规则的业务逻辑代码分开.在此模式中,这两个层均 ...
- asp.net/wingtip/创建数据访问层
一. 什么是数据访问层 在wingtip项目中,数据访问层是对以下三者的总称:1. product类等数据相关的实体类(class)2. 数据库(database),对实体类成员的存储3. 上述二者的 ...
- 数据访问层的超级基类AbstractBaseDAL
using System; using System.Collections; using System.Data; using System.Data.Common; using System.Co ...
- [转]DbHelper通用数据库访问帮助类
之前我一直都是在博客园中查看各位高手的博文,确实学到了不少知识,不过比较少写博客,现在就把我自己在项目实施过程中使用到比较好的技术框架写出来,希望能让更多的人了解和学习. 通常我们在开发使用数据库访问 ...
- Spring.NET 中的 ADO.NET 数据访问的示例
Spring.NET 1.3.1 中提供了一个使用 AdoTemplate 的完整示例,包括使用泛型和使用非泛型技术进行数据访问,这个示例位于下载的压缩包中\Spring.NET-1.3.1\Spri ...
- JS设计模式(三) 数据访问对象模式
引言 HTML5 提供了两种在客户端存储数据的新方法:localStorage.sessionStorage,他们是Web Storage API 提供的两种存储机制,区别在于前者属于永久性存储,而后 ...
- C# 通用数据访问类(SqlHelper)
[转]C# 通用数据访问类(SqlHelper) 注:本文转自http://www.tzwhx.com/newOperate/html/3/31/312/13080.htmlVisual C# 动态操 ...
随机推荐
- Nacos整合Spring Cloud Gateway组件
一.什么是Spring Cloud Gateway Spring Cloud Gateway是Spring Cloud官方推出的网关框架,网关作为流量入口有着非常大的作用,常见的功能有路由转发.权限校 ...
- 【HDU6035】 Colorful Tree
题目的意思是:给定一个点带颜色的树,两点之间的距离定义为路径上不同颜色的个数.求所有点对间的距离和. 做法有点分治,还有传说中的虚树DP,树上差分. 点分治法: 考虑每个点的贡献,可以发现一个点的子树 ...
- HDU2222Keywords Search AC_自动机
http://blog.csdn.net/niushuai666/article/details/7002823 #include <iostream> #include <cstd ...
- codeforces H. Queries for Number of Palindromes(区间dp)
题目链接:http://codeforces.com/contest/245/problem/H 题意:给出一个字符串还有q个查询,输出每次查询区间内回文串的个数.例如aba->(aba,a,b ...
- Java,哈希码以及equals和==的区别
从开始学习Java,哈希码以及equals和==的区别就一直困扰着我. 要想明白equals和==的区别首先应该了解什么是哈希码,因为在jdk的类库中不管是object实现的equals()方法还是S ...
- SpringBoot使用注解的方式构建Elasticsearch查询语句,实现多条件的复杂查询
背景&痛点 通过ES进行查询,如果需要新增查询条件,则每次都需要进行硬编码,然后实现对应的查询功能.这样不仅开发工作量大,而且如果有多个不同的索引对象需要进行同样的查询,则需要开发多次,代码复 ...
- Python网络爬虫实战(一)快速入门
本系列从零开始阐述如何编写Python网络爬虫,以及网络爬虫中容易遇到的问题,比如具有反爬,加密的网站,还有爬虫拿不到数据,以及登录验证等问题,会伴随大量网站的爬虫实战来进行. 我们编写网络爬虫最主要 ...
- day02小结
数据类型的转换 1,自动类型转换 byte,short,char-->int-->long-->float-->double (1)byte与byte,short与short, ...
- ASP.NET Core SignalR:集线器Hubs
一.什么是集线器hubs 通过SignalR的集线器hubs中定义的方法,服务器可以调用连接中的客户端定义的方法,而客户端也可以调用服务器端集线器中定义的方法.SignalR负责实现了客户端和服务器之 ...
- StateListDrawable资源的使用
StateListDrawable用于组织多个Drawable对象,当使用StateListDrawable作为目标组件的 背景和前景图片时,StateListDrawable对象所显示的Drawab ...