导读:在上一篇博客中,介绍了简单的SQLHelper重构,即数据库链接,打开和关闭链接的优化等。现在,将介绍参数化查询和执行命令类型的改造。

一、必要性

1,参数化查询

在上篇博客中,在查询的时候,仅仅通过传入一个SQL语句,比如:insert into category(name) values('hhx'),这样做是可行的,但它会导致一个问题(SQL注入),就是,如果用户输入的是:hhx') delete  category where .......更甚至是:hhx') delete from category。这时候,虽然可以插入一条数据,但在其后,又会删除表中的数据。如果真到了这时候,那就真的只有哭的时候了。

有效解决方法之一:参数化查询!

比如,将insert intocategory(name)values(“hhx”)变为insert into category(name) values @name。那么即使我们输入的是:hhx') delete  category where ,也不会产生删除数据的情况,而仅仅是插入一条名称为:“hhx') delete  category where ” 的记录。

2,命令类型

在SQL执行语句中,我们会常看到:cmd.CommandType = CommandType.Text 或者 cmd.CommandType = CommandType.StoredProcedure,它表示的是执行的SQL语句是哪一种类型,文本型或是存储过程。PS:cmd是SQL的一个命令对象SqlCommand。

如果,我们在每一个方法中都对这个进行说明从而运用函数的重载去达到效果的话,不是不可以,但会相当的费事儿。因为既然利用重载,那么就得对方法再编写一遍。

解决方法之一:引入一个命令类型参数,在用户使用SQL语句时,确定是哪种执行类型。



二、怎样运用

1,执行无参的SQL增删改语句 

注:默认的commandtype是text型。

<span style="font-size:18px;">        #region 该方法执行传入的SQL增删改语句(无参)
/// <summary>
/// 该方法执行传入的SQL增删改语句(无参)
/// </summary>
/// <param name="cmdText">要执行的SQL增删改语句或存储过程</param>
/// <param name="ct">命令类型</param>
/// <returns>返回更新的记录数</returns>
public int ExecuteNonQuery(string cmdText, CommandType ct)
{
int res;
try
{
SqlCommand cmd = new SqlCommand(cmdText, GetConn());
cmd.CommandType = ct;
res = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{ throw ex;
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
} return res;
}
#endregion</span>

2,执行有参的SQL增删改语句  

注意:

1,使用using语句段,对于try catch语句的精简。

2,因为在SQL语句中传入的参数为1-N个,所以需要使用数组的形式。即:SQLParameter[]paras和cmd.Parameters.AddRange(paras)的运用。

<span style="font-size:18px;"><span style="font-size:24px;">       #region 执行带参数的SQL增删改语句
/// <summary>
/// 执行带参数的SQL怎删改语句
/// </summary>
/// <param name="cmdText">SQL增删改语句或存储过程</param>
/// <param name="paras">参数集合</param>
/// <param name="ct">命令类型</param>
/// <returns></returns>
public int ExecuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct)
{
int res;
using (cmd = new SqlCommand(cmdText, GetConn()))
{
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
res = cmd.ExecuteNonQuery();
}
return res;
}
#endregion</span></span>

三、完整的SQLHelper类

<span style="font-size:18px;">/**********************************************
'类名:SQLHelper
'命名空间:DAL
'创建时间:2015/3/7 16:32:46
'创建人:HXX
'修改时间:
'修改人:
'版本号:4.0.30319.18449
'版权:HHX
'说明:SQLHelper助手类,简化D层增删改查。
**********************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration; namespace DAL
{
/// <summary>
/// SQLHelper操作类
/// </summary>
public class SQLHelper
{
private SqlCommand cmd = null;
private SqlDataReader sdr = null;
private SqlConnection conn = null; #region 通过构造函数,给SQLHelper的属性附初值
/// <summary>
/// 通过构造函数,给SQLHelper的属性附初值
/// </summary>
public SQLHelper()
{
string connStr = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
conn = new SqlConnection(connStr);
}
#endregion private SqlConnection GetConn()
{
//如果数据库关闭,则打开
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
return conn;
} #region 该方法执行传入的SQL增删改语句(无参)
/// <summary>
/// 该方法执行传入的SQL增删改语句(无参)
/// </summary>
/// <param name="cmdText">要执行的SQL增删改语句或存储过程</param>
/// <param name="ct">命令类型</param>
/// <returns>返回更新的记录数</returns>
public int ExecuteNonQuery(string cmdText, CommandType ct)
{
int res;
try
{
SqlCommand cmd = new SqlCommand(cmdText, GetConn());
cmd.CommandType = ct;
res = cmd.ExecuteNonQuery();
}
catch (Exception ex)
{ throw ex;
}
finally
{
if (conn.State == ConnectionState.Open)
{
conn.Close();
}
} return res;
}
#endregion #region 执行带参数的SQL增删改语句
/// <summary>
/// 执行带参数的SQL怎删改语句
/// </summary>
/// <param name="cmdText">SQL增删改语句或存储过程</param>
/// <param name="paras">参数集合</param>
/// <param name="ct">命令类型</param>
/// <returns></returns>
public int ExecuteNonQuery(string cmdText, SqlParameter[] paras, CommandType ct)
{
int res;
using (cmd = new SqlCommand(cmdText, GetConn()))
{
cmd.CommandType = ct;
cmd.Parameters.AddRange(paras);
res = cmd.ExecuteNonQuery();
}
return res;
}
#endregion #region 该方法执行传入的SQL查询语句(无参)
/// <summary>
/// 该方法执行传入的SQL查询语句(无参)
/// </summary>
/// <param name="cmdText">SQL查询语句或存储过程</param>
/// <param name="ct">命令类型</param>
/// <returns></returns>
public DataTable ExecuteQuery(string cmdText, CommandType ct)
{
DataTable dt = new DataTable();
SqlCommand cmd = new SqlCommand(cmdText, GetConn());
cmd.CommandType = ct;
using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
dt.Load(sdr);
}
return dt;
}
#endregion #region 执行带参数的SQL查询语句
/// <summary>
/// 执行带参数的SQL查询语句
/// </summary>
/// <param name="cmdText">SQL查询语句或存储过程</param>
/// <param name="paras">参数集合</param>
/// <param name="ct"></param>
/// <returns></returns>
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;
}
#endregion }
}
</span>

四、学习感受

在这一次的学习中,我总算是把这个SQLHelper给理解了。这之中的学习,不可厚非的会得益于我刚看到这个东西时的初步学习,那时候也是查了很多资料,VB编写的,C编写的,Java编写的都看过,但也都是要懂不懂。脑袋里装了一堆这玩意儿,但就是没有一个是清晰的。很苦恼,幸得师傅指点说先放放,我可能是钻进死胡同了。

现在的感受是:对于学习,初次见面,认识它;再次见面,了解它;三次见面,征服它。

牛腩新闻发布系统(二):SQLHelper重构(二)的更多相关文章

  1. 牛腩新闻发布系统--学习Web的小技巧汇总

    2014年11月10日,是个难忘的日子,这一天,小编的BS学习开始了,BS的开头,从牛腩新闻发布系统开始,之前学习的内容都是CS方面的知识,软考过后,开始学习BS,接触BS有几天的时间了,跟着牛腩老师 ...

  2. DRP PK 牛腩新闻发布系统

    一.JSP与ASP (1)Web服务器的支持:大多数通用的Web服务器如:Apache.Netscape和Microsoft IIS都支持JSP页面,只有微软本身的Microsoft IIS和Pers ...

  3. 牛腩新闻发布系统(一):SQLHelper重构(一)

    导读:在机房重构的时候,就用到了SQLHelper,但那时候即使把代码反复看了很多遍,也看了注释,还和同学交流,也依然是半懂不懂.现在,我再次用到了SQLhelper这个东西,就来说说SQLHelpe ...

  4. 使用JSP/Servlet技术开发新闻发布系统---JSP数据交互(二)

    JSP内置对象application application对象 JSP常用的内置对象 对象的作用域 作用的分类 对象的作用域 page作用域 实例 //页面1 <% String name = ...

  5. 牛腩新闻发布系统(五):VS网站发布及常见问题

    导读:在千万个回眸中,终于看见了牛腩的归途.好吧,牛腩该整合的都整合完毕了,到了发布的时候了.这时候,不得不再次感慨那句不知道感慨了多少次的感慨:为什么,我要遭遇这么多的坎坷?下面,结合自己的情况,说 ...

  6. 牛腩新闻发布系统(三):CSS盒子模型及其基本内容

    导读: 这些天一直在做牛腩的网页,比如什么首页.出错页.新闻内容页等.在学习的不断推进中,一些刚开始理解的不是很好的东西,也逐渐的深刻了起来.下面,就对这一段时间的学习,做一个总结.主要总结内容有:盒 ...

  7. WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping——牛腩新闻发布系统

    VS2011使用验证控件出现" WebForms UnobtrusiveValidationMode 需要"jquery"ScriptResourceMapping.请添 ...

  8. 牛腩新闻公布系统--学习Web的小技巧汇总

    2014年11月10日,是个难忘的日子.这一天.小编的BS学习開始了.BS的开头,从牛腩新闻公布系统開始.之前学习的内容都是CS方面的知识,软考过后.開始学习BS,接触BS有几天的时间了,跟着牛腩老师 ...

  9. 【NodeJS 学习笔记04】新闻发布系统

    前言 昨天,我们跟着这位大哥的博客(https://github.com/nswbmw/N-blog/wiki/_pages)进行了nodeJS初步的学习,最后也能将数据插入数据库了 但是一味的跟着别 ...

随机推荐

  1. [BZOJ2982]combination Lucas定理

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2982 $C(N,M)\% P = C(N\% P,M\% P) * C(N/P,M/P)\ ...

  2. this的三个要点

    1.this的指向是什么? 指向对象 2.this可以书写在哪里? 可以写在全局,也可以写在函数里 三种写在函数里的方式: 2.1  this可变 function f() { this.name = ...

  3. 动画 iOS基础

    动画 iOS基础 1.     basic animation  基础动画 一个基础动画 在一个开始值和一个结束值之间运动   messageLabel.alpha=0.0; [UIView  ani ...

  4. Windows定时任务管理以及服务管理

    1.NSSM.exe https://nssm.cc/ 2.Topshelf 引用地址:https://www.cnblogs.com/guogangj/p/10093102.html#4136330

  5. urlrrtrieve()实例_下载微博短视频

    1.确定目标 在微博页面找一想要下载的短视频,通过审查元素找到视频的url. 如://f.us.sinaimg.cn/00150tBNlx07l0qjoSJi01040201m7z90k010.mp4 ...

  6. Web项目之Django基础

    Django目录: python项目Django(web服务) python项目Django(HTTP协议) python项目Django(Django的安装与使用) python项目Django(U ...

  7. python基础一 day10(2)

    复习: # 三元运算符# 接收结果的变量 = 条件为真的结果 if 条件 else 条件为假的结果# 接收结果的变量 = “真结果” if 条件 else “假结果”## 命名空间 和 作用域# 三种 ...

  8. python_110_反射

    class Dog(object): def __init__(self,name): self.name=name def eat(self): print('%s is eating '%self ...

  9. hrbust-1545-基础数据结构——顺序表(2)

    http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1545 基础数据结构——顺序表(2) ...

  10. 连接器前置挂载U盾

    连接器前置挂载U盾 1. 宿主机配置及其信息 虚拟化软件版本 主机名 宿主机IP 账号及其密码 WorkStation windows idca- vm01 172.16.6.30 * Qemu-kv ...