牛腩新闻发布系统(二):SQLHelper重构(二)
导读:在上一篇博客中,介绍了简单的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重构(二)的更多相关文章
- 牛腩新闻发布系统--学习Web的小技巧汇总
2014年11月10日,是个难忘的日子,这一天,小编的BS学习开始了,BS的开头,从牛腩新闻发布系统开始,之前学习的内容都是CS方面的知识,软考过后,开始学习BS,接触BS有几天的时间了,跟着牛腩老师 ...
- DRP PK 牛腩新闻发布系统
一.JSP与ASP (1)Web服务器的支持:大多数通用的Web服务器如:Apache.Netscape和Microsoft IIS都支持JSP页面,只有微软本身的Microsoft IIS和Pers ...
- 牛腩新闻发布系统(一):SQLHelper重构(一)
导读:在机房重构的时候,就用到了SQLHelper,但那时候即使把代码反复看了很多遍,也看了注释,还和同学交流,也依然是半懂不懂.现在,我再次用到了SQLhelper这个东西,就来说说SQLHelpe ...
- 使用JSP/Servlet技术开发新闻发布系统---JSP数据交互(二)
JSP内置对象application application对象 JSP常用的内置对象 对象的作用域 作用的分类 对象的作用域 page作用域 实例 //页面1 <% String name = ...
- 牛腩新闻发布系统(五):VS网站发布及常见问题
导读:在千万个回眸中,终于看见了牛腩的归途.好吧,牛腩该整合的都整合完毕了,到了发布的时候了.这时候,不得不再次感慨那句不知道感慨了多少次的感慨:为什么,我要遭遇这么多的坎坷?下面,结合自己的情况,说 ...
- 牛腩新闻发布系统(三):CSS盒子模型及其基本内容
导读: 这些天一直在做牛腩的网页,比如什么首页.出错页.新闻内容页等.在学习的不断推进中,一些刚开始理解的不是很好的东西,也逐渐的深刻了起来.下面,就对这一段时间的学习,做一个总结.主要总结内容有:盒 ...
- WebForms UnobtrusiveValidationMode 需要“jquery”ScriptResourceMapping——牛腩新闻发布系统
VS2011使用验证控件出现" WebForms UnobtrusiveValidationMode 需要"jquery"ScriptResourceMapping.请添 ...
- 牛腩新闻公布系统--学习Web的小技巧汇总
2014年11月10日,是个难忘的日子.这一天.小编的BS学习開始了.BS的开头,从牛腩新闻公布系统開始.之前学习的内容都是CS方面的知识,软考过后.開始学习BS,接触BS有几天的时间了,跟着牛腩老师 ...
- 【NodeJS 学习笔记04】新闻发布系统
前言 昨天,我们跟着这位大哥的博客(https://github.com/nswbmw/N-blog/wiki/_pages)进行了nodeJS初步的学习,最后也能将数据插入数据库了 但是一味的跟着别 ...
随机推荐
- Java基础教程(25)--I/O
一.I/O流 I/O流表示输入源或输出目标.流可以表示许多不同类型的源和目标,例如磁盘文件.设备.其他程序等. 流支持许多不同类型的数据,包括字节.原始数据类型.字符和对象等.有些流只传递数据 ...
- 关于一个app中数据库的问题
如果是不同名字的数据库,可以有多个数据库操作dao 如果是同样名字的数据库,只能有一个数据库操作dao,创建表的语句可以写在一个oncreate方法里面 例如 public class Address ...
- SQL server 数据库基础语句 子查询 基础函数
上一章 说了下 子查询的意义是 把一条查询语句当做值来使用 select *from car //查询汽车的信息 假设我知道一个汽车的编号是 c021 但是我要查询 比这个汽车价格高的汽车信息 ...
- CloudFoundry命令行和Kubernetes命令行的Restful API消费方式
先说CloudFoundry的命令行工具CLI.我们在CloudFoundry环境下工作,第一个使用的命令就是cf login. 如果在环境变量里维护CF_TRACE的值为true: 则我们能发现,诸 ...
- 使用python批量建立文件
for i in range(101,110): n = repr(i) + '.txt' file = open('c:\\ip\\' + n, 'w')
- Java面试题全集(下)
这部分主要是开源Java EE框架方面的内容,包括hibernate.MyBatis.spring.Spring MVC等,由于Struts 2已经是明日黄花,在这里就不讨论Struts 2的面试题, ...
- python基础一 day13 迭代器
# 双下方法# print([1].__add__([2]))# print([1]+[2]) # 迭代器# l = [1,2,3]# 索引# 循环 for# for i in l:# i## for ...
- JSONP 跨域请求 - 获取JSON数据
如何用原生方式使用JSONP? 下边这一DEMO实际上是JSONP的简单表现形式,在客户端声明回调函数之后,客户端通过script标签向服务器跨域请求数据,然后服务端返回相应的数据并动态执行回调函数. ...
- 多进程Queue
进程间通讯 不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法: Queues 使用方法跟threading里的queue差不多 from multiprocessing impo ...
- 真爱 vs. 种姓:新一代印度人的婚恋观
今日导读 “自由恋爱”是所有世界上所有有情人共同的心愿,而在印度,因为其根深蒂固的种姓制度,仍然有大批情侣只能听从父母的“包办婚姻”,被迫与心爱的人分离.但是最新的一项调查表明,印度的年轻一代开始出现 ...