导读:在上一篇博客中,介绍了简单的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. Scrapy框架的基本组成及功能使用

    1.什么是scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架.框架的本质就是集成各种功能.具有很强通用性的项目模板. 2.安装 Linux:       pip3 in ...

  2. Android:Service通知Activity更新界面

    Android有四大组件,其中包括service和activity,那么在使用的过程中,我们最常遇到的问题是他们之间的通信问题. 1.首先Activity调用Service 这个是比较基础的,它有两种 ...

  3. Openjudge 2.5 6264:走出迷宫

    总时间限制:  1000ms 内存限制:  65536kB 描述 当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单. 假设你已经得到了一个n* ...

  4. jni 开发

    创建android工程 -> 添加native 函数 添加库之后: 1. 用javah 生成c语言.h头文件时, 在cmd 窗口中cd 到bin/classes 目录下执行下代码无效: java ...

  5. 树形dp——Tree2cycle

    一.问题描述(题目链接) 给你一棵树,删除或添加一条边的费用都是1,问使它变成一个环的最小费用. 二.解题思路 回溯法,然后回溯的时候的当前节点度数>2(如果是成环的话肯定就是2或者小于2)就把 ...

  6. mysql的备份与恢复详解

    一.为什么要备份 在日常运维工作中,对于mysql数据库的备份是至关重要的!数据库对于网站的重要性使得我们对mysql数据的管理不容有失!然后,是人总难免会犯错误,说不定哪天大脑短路了来个误操作把数据 ...

  7. 关于highchts X时间轴比设置时间相差好几个小时的解决

    经过一番查询和研究发现,在曲线图里,x轴的UNIX时间戳是要乘以1000的(通过在线的UNIX转换,结果与原来没有乘以1000的时间戳相差甚远),不然显示的时间会有很大的误差,真是百思不得其解. 另外 ...

  8. idea下使用码云插件进行git提交

    1)下载插件 file->setting->plugins->右侧搜索gitee->安装->重启ide 2)配置版本控制 file->setting->Ver ...

  9. SniperOj-shorter-shellcode-x86

    shell-storm 这里可以有一些可以用的shellcode,不过自己写才是biner的骄傲 /奋斗 0x00 不会写shellcode(和一条咸鱼有什么区别/哭) 0x01 这题目前有俩种解法 ...

  10. jquery动态实现填充下拉框

    当点下拉框时动态加载后台数据. 后台代码 protected void doPost(HttpServletRequest request, HttpServletResponse response) ...