因为通过SQL 语句的方式,有时候存在脚本注入的危险,所以在大多数情况下不建议用拼接SQL语句字符串方式,希望通过SqlParameter实现来实现对数据的操 作,针对SqlParameter的方式我们同样可以将其封装成一个可以复用的数据访问类,只是比SQL语句的方式多了一个SqlParameter的参 数。

般来说,在更新DataTable或是DataSet时,如果不采用SqlParameter,那么当输入的Sql语句出现歧义时,如字符串

中含有单引号,程序就会发生错误,并且他人可以轻易地通过拼接Sql语句来进行注入攻击。

  1. string sql = "update Table1 set name = 'Pudding' where ID = '1'";//未采用SqlParameter
  2. SqlConnection conn = new SqlConnection();
  3. conn.ConnectionString = "Data Source=.\\SQLExpress;Integrated Security=true;AttachDbFilename=|DataDirectory|\\Database.mdf;User Instance=true";//连接字符串与数据库有关
  4. SqlCommand cmd = new SqlCommand(sql, conn);
  5. try
  6. {
  7. conn.Open();
  8. return(cmd.ExecuteNonQuery());
  9. }
  10. catch (Exception)
  11. {
  12. return -1;
  13. throw;
  14. }
  15. finally
  16. {
  17. conn.Close();

上述代码未采用SqlParameter,除了存在安全性问题,该方法还无法解决二进制流的更新,如图片文件。通过使用

SqlParameter可以解决上述问题,常见的使用方法有两种,Add方法和AddRange方法。

一、Add方法

  1. sp as SqlParameter  = new SqlParameter("@name", "Pudding");
  2. cmd.Parameters.Add(sp);
  3. sp = new SqlParameter("@ID", "1");
  4. cmd.Parameters.Add(sp);

该方法每次只能添加一个SqlParameter。上述代码的功能是将ID值等于1的字段name更新为Pudding(人名)。

二、AddRange方法

  1. dim  paras as new  SqlParameter() paras = new SqlParameter{    new SqlParameter("@name", "Pudding"),
  1. new SqlParameter("@ID", "1") };
  1. cmd.Parameters.AddRange(paras);

显然,Add方法在添加多个SqlParameter时不方便,此时,可以采用AddRange方法。 

下面是通过SqlParameter向D层的用户表中添加用户。

  1. Imports System.Collections
  2. Imports Entity
  3. Imports [Interface]
  4. Imports System.Configuration
  5. Imports System.Data
  6. Imports System.Data.SqlClient
  7. Imports SqlHelper
  8. '/*************************************************
  9. '类名: SqlUserDAL
  10. '作者: 韩艳坤
  11. '说明:User数据表操作类
  12. '创建日期:2013年3月5日
  13. '**********************************************/
  14. ''' <summary>
  15. ''' 用户表的操作类
  16. ''' </summary>
  17. ''' <remarks></remarks>
  18. Public Class SqlUserDAL
  19. Implements [Interface].IUser ' 实现IUser接口
  20. ''' <summary>
  21. ''' 操作数据表User,增加用户方法
  22. ''' </summary>
  23. ''' <param name="enUser">参数名称实体类</param>
  24. ''' <returns>返回boolean类型</returns>
  25. ''' <remarks></remarks>
  26. Public Function AddUser(enUser As User.UserEntity) As Boolean Implements IUser.AddUser
  27. Dim btn As Boolean = False                 ' 是否已陈宫标志
  28. Dim sqlHelper As New SqlHelper.sqlHelper   '助手类
  29. Dim strSQL As String 'SQL字符串
  30. Dim addUserFlag As Integer '受影响的函数
  31. '参数集合
  32. Dim sqlParameter As SqlParameter()
  33. Try
  34. sqlParameter = New SqlParameter() {
  35. New SqlParameter("@userID", enUser.UserID),
  36. New SqlParameter("@userName", enUser.UserName),
  37. New SqlParameter("@userPwd", enUser.UserPwd),
  38. New SqlParameter("@userRank", enUser.UserRank),
  39. New SqlParameter("@statue", enUser.Statue)
  40. }
  41. 'Sql语句
  42. strSQL = "insert into T_User(userID,userName,userPwd,userRank,status)" & "value (@userID,@userName,@userRank,@statue)"
  43. '执行带参数的过程
  44. addUserFlag = sqlHelper.ExecuteNoQuery(strSQL, CommandType.Text, sqlParameter)
  45. '标志是否成功
  46. If addUserFlag > 0 Then
  47. btn = True '标志成功
  48. End If
  49. Catch ex As Exception
  50. Throw New Exception(MsgBox("用户添加数据没有成功", MsgBoxStyle.Information))
  51. End Try
  52. '返回值btn是否成功
  53. Return btn
  54. End Function

SqlHelper类的部分代码如下

  1. ''' <summary>
  2. ''' 执行增删改三个操作,(有参)返回值为boolean类型,确认是否成功
  3. ''' </summary>
  4. ''' <param name="strSql">需要执行的语句,一般是Sql语句,也有存储过程</param>
  5. ''' <param name="cmdType">命令类型(存储过程, T-SQL语句, 等等)</param>
  6. ''' <param name="sqlParams">参数数组,无法确认有多少个参数</param>
  7. ''' <returns>返回布尔类型,成功为true,否则为false</returns>
  8. ''' <remarks></remarks>
  9. Public Function ExecuteNoQuery(ByVal strSql As String, ByVal cmdType As CommandType, ByVal sqlParams As SqlParameter()) As Boolean
  10. comd.Parameters.AddRange(sqlParams) '传入参数
  11. comd.CommandType = cmdType '传入语句类型
  12. comd.Connection = conn '设置连接
  13. comd.CommandText = strSql '设置查询语句
  14. Try
  15. conn.Open() '打开连接
  16. Return comd.ExecuteNonQuery() '执行增删改语句
  17. comd.Parameters.Clear() '清楚原有参数
  18. Catch ex As Exception
  19. Return False '如果出错,返回false 提示
  20. Finally
  21. '判断数据库连接对象是否为断开状态,如果为连接则断开
  22. '判断数据库操作命令是否存在,若存在则销毁
  23. If conn.State = ConnectionState.Open Then
  24. conn.Close()
  25. End If
  26. If Not IsNothing(comd) Then
  27. comd.Dispose() '销毁comd命令
  28. comd = Nothing
  29. End If
  30. End Try
  31. End Function

SqlParameter 基本用法的更多相关文章

  1. SqlParameter的用法

    SqlParameter的用法 关于Sql注入的基本概念,相信不需多说,大家都清楚,经典的注入语句是' or 1=1--单引号而截断字符串,“or 1=1”的永真式的出现使得表的一些信息被暴露出来,如 ...

  2. SqlParameter 用法总结

    作用 解决恶意的T-sql语句攻击第一种 //传入参数 string ProductGroupCode, string Ismaintain, int HierarchyID, string BOMN ...

  3. SqlParameter的两种用法【二】

    private void Loadprovince() { string sql = "select * from Tables where ArealdPid=@pid"; /第 ...

  4. SqlParameter用法

    if (id != null) { sql = @"update [User] set Username = @Username, Password = @Password, Type = ...

  5. sql事务(Transaction)用法介绍及回滚实例

    sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务, S ...

  6. Ibatis.net总是报:【ExecuteStoreCommand SqlParameterCollection 中已包含 SqlParameter】(转)

    今天很奇怪调用EF的ExecuteStoreCommand 出现了个这样的错误,怎么也调试不过,痛定思痛 原来 command被连着调用了而没有销毁掉   public static DataTabl ...

  7. 用SqlParameter 给SQL传递参数

    1.数据访问层 using的用法: 01.可以using System;导命名控空间 02.using 的语法结构 using(变量类型  变量名 =new 变量类型()) { } 案例: 03.us ...

  8. Sql server 事务的两种用法

    事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位. 通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便 ...

  9. ASP.NET中的ExecuteNonQuery()方法的用法

    下面我将详细讲解在机房收费系统D层中如何对数据库的增加.删除.修改,最后再来总结一下 ExecuteNonQuery(),ExecuteScalar(),ExecuteReader的用法: 一.增.删 ...

随机推荐

  1. DP:Miking Time(POJ 3616)

    2015-09-21 奶牛挤奶 题目大意就是这只Bessie的牛产奶很勤奋,某农民有一个时刻表,在N时间内分成M个时间段,每个时间段Bessie会一直产奶,然后有一定的效益,并且Bessie产奶后要休 ...

  2. VS2010设置C++包含目录和库目录

    视图-属性管理器-随便选择一个项目例如MyProject-Debug|Win32-Microsoft.Cpp.Win32.user-右键“属性”-VC++目录 Release同理

  3. c# 正则表达式 匹配回车

    1 "." 匹配除 "\n" 之外的任何单个字符,一般用".*?"匹配不包括回车的任意字符. 2 我们在用正则表达式分析html或者是xml ...

  4. python基础——使用dict和set

    python基础——使用dict和set dict Python内置了字典:dict的支持,dict全称dictionary,在其它语言中也称为map(映射),使用键-值(key-value)存储,具 ...

  5. 一、HTML和CSS基础--网页布局--网页简单布局之结构与表现原则

    结构.表现和行为分离,不仅是一项技术,更主要的是一种思想,当我们拿到一个网页时,先考虑设计图中的文字内容和内容模块之间的关系,重点放在编写html结构和语义化,然后考虑布局和表现形式.,减少HTML与 ...

  6. Asp.net MVC 利用自定义RouteHandler来防止图片盗链

    你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽.下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义Ro ...

  7. MySQL支持的列类型

     MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述. ...

  8. 字符截取 支持UTF8/GBK

    );         $n = $tn = $noc = ;          || $t ==  || ( <= $t && $t <= )) {             ...

  9. 利用OData轻易实现串流数据的可视化

    OData(开放数据协议,Open Data Protocol)一直是我喜欢一种的标准(OASIS 标准),它基于RESTful协议提供了一种强大的查询和编辑数据的访问接口.虽然是微软推出的,不过在诞 ...

  10. Android 编程下 Using ViewPager for Screen Slides

    (参考官方文档:Using ViewPager for Screen Slides | Android Developers)