【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# 动态操 ...
随机推荐
- MSIL实用指南-生成内部类
生成内部类用TypeBuilder的DefineNestedType方法,得到另一个TypeBuilder.内部类的可访问性都是TypeAttributes的“Nested”开头一些成员.实例代码:y ...
- ASP.NET Core中使用Csp标头对抗Xss攻击
内容安全策略(CSP)是一个增加的安全层,可帮助检测和缓解某些类型的攻击,包括跨站点脚本(XSS)和数据注入攻击.这些攻击用于从数据窃取到站点破坏或恶意软件分发的所有内容(深入CSP) 简而言之,CS ...
- HDU 1018 Big Number 斯特林公式
Big Number 题意:算n!的位数. 题解:对于一个数来算位数我们一般都是用while去进行计算,但是n!这个数太大了,我们做不到先算出来在去用while算位数. while(a){ cnt++ ...
- 杭电多校第四场 Problem K. Expression in Memories 思维模拟
Problem K. Expression in Memories Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262 ...
- 牛客小白月赛 G 异或 找规律
链接:https://www.nowcoder.com/acm/contest/135/G来源:牛客网 题目描述 从前,Apojacsleam家的水族箱里,养了一群热带鱼. 在这几条热带鱼里,Apoj ...
- codeforces 764 C. Timofey and a tree(dfs+思维)
题目链接:http://codeforces.com/contest/764/problem/C 题意:给出一个树,然后各个节点有对应的颜色,问是否存在以一个点为根节点子树的颜色都一样. 这里的子树颜 ...
- Linux音频编程(一)ALSA介绍
Linux下的音频编程中有OSS和ALSA,本篇文章将对ALSA进行相关介绍.ALSA提供一系列基于命令行的工具集,比如混音器(mixer),音频文件播放器(aplay),以及控制特定声卡特定属性的工 ...
- odoo12从零开始:三、1)创建你的第一个应用模型(module)
前言 以前,我一直都不知道为什么好多框架的入门都是“hello world”开始,当我思前想后我要如何介绍odoo的model.record.template等继承等高级特性时,发现在那之前便需要清楚 ...
- 用.NET写“算命”程序
用.NET写"算命"程序 "算命",是一种迷信,我父亲那一辈却执迷不悟,有时深陷其中,有时为求一"上上签",甚至不惜重金,向"天神 ...
- 【Offer】[18-1] 【在O(1)时间内删除链表节点】
题目描述 思路分析 测试用例 代码链接 题目描述 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 思路分析 一般我们删除单链表中的节点是需要遍历链表,找到要删除节点的前一个 ...