导读:在上一篇博客中,介绍了简单的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. iOS 锁的常用方法

    锁的用法在iOS中有几种方法来解决多线程访问同一个内存地址的互斥同步问题: 方法一,@synchronized(id anObject),(最简单的方法)会自动对参数对象加锁,保证临界区内的代码线程安 ...

  2. FPGA的嵌入式RAM

    FPGA中的嵌入式RAM分为两种:专用的BRAM和分布是RAM(用LUT实现的).这两种RAM又可以配置成单端口和双端口的RAM和ROM.双端口RAM又可以根据读写地址是否在同一块分为Double P ...

  3. IOS弹出视图preferredContentSize

    UIViewController.preferredContentSize代理旧方法 contentSizeForViewInPopover. self.contentSizeForViewInPop ...

  4. sql中的exsits和not exsits

    select * from table where exsits(sql语句) :  括号中sql语句有数据则返回这些相关id的数据集 select * from table where not ex ...

  5. 学习python报错处理

    1.如图所示 原因是因为没有安装火狐浏览器驱动. 解决办法:1.下载火狐浏览器驱动https://github.com/mozilla/geckodriver/releases 2.安装包解压后安装在 ...

  6. 微软爆料新型系统,Windows7,Windows10强势来袭

    本系统是10月5日最新完整版本的Windows10 安装版镜像,win10正式版,更新了重要补丁,提升应用加载速度,微软和百度今天宣布达成合作,百度成为win10 Edge浏览器中国默认主页和搜索引擎 ...

  7. 【2016新年版】年度精品 XP,32/64位Win7,32/64位Win8,32/64位Win10系统

    本系统是10月5日最新完整版本的Windows10 安装版镜像,win10正式版,更新了重要补丁,提升应用加载速度,微软和百度今天宣布达成合作,百度成为win10 Edge浏览器中国默认主页和搜索引擎 ...

  8. C++数据文件存储与加载(利用opencv)

    首先请先确认已经安装好了opencv3及以上版本. #include <opencv2/opencv.hpp>#include <iostream>#include <s ...

  9. WPF知识点全攻略07- 数据绑定(Binding)

    数据绑定是WPF不得不提,不得不会系列之一 数据绑定简言之,就是把数据源的数据绑定到目标对象的属性上.目标对象可以是承自DependencyProperty的任何可访问的属性或控件,目标属性必须为依赖 ...

  10. WPF知识点全攻略02- WPF体系结构

    WPF体系结构图: PersentationFramework.dll包含WPF顶层的类型,包括哪些表示窗口.面板以及其他类型控件的类型.他还实现了高层编程抽象,如样式.开发人员直接使用的大部分类都来 ...