SqlParameter 基本用法

因为通过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.         '参数集合  
  33.         Dim sqlParameter As SqlParameter()  
  34.         Try  
  35.   
  36.           
  37.         sqlParameter = New SqlParameter() {  
  38.                                             New SqlParameter("@userID", enUser.UserID),  
  39.                                             New SqlParameter("@userName", enUser.UserName),  
  40.                                             New SqlParameter("@userPwd", enUser.UserPwd),  
  41.                                             New SqlParameter("@userRank", enUser.UserRank),  
  42.                                             New SqlParameter("@statue", enUser.Statue)  
  43.             }  
  44.         'Sql语句  
  45.         strSQL = "insert into T_User(userID,userName,userPwd,userRank,status)" & "value (@userID,@userName,@userRank,@statue)"  
  46.         '执行带参数的过程  
  47.             addUserFlag = sqlHelper.ExecuteNoQuery(strSQL, CommandType.Text, sqlParameter)  
  48.             '标志是否成功  
  49.             If addUserFlag > 0 Then  
  50.                 btn = True '标志成功  
  51.             End If  
  52.   
  53.         Catch ex As Exception  
  54.   
  55.             Throw New Exception(MsgBox("用户添加数据没有成功", MsgBoxStyle.Information))  
  56.         End Try  
  57.         '返回值btn是否成功  
  58.         Return btn  
  59.     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 StringByVal 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.   
  15.     Try  
  16.         conn.Open() '打开连接  
  17.         Return comd.ExecuteNonQuery() '执行增删改语句  
  18.         comd.Parameters.Clear() '清楚原有参数  
  19.   
  20.     Catch ex As Exception  
  21.         Return False '如果出错,返回false 提示  
  22.     Finally  
  23.         '判断数据库连接对象是否为断开状态,如果为连接则断开  
  24.         '判断数据库操作命令是否存在,若存在则销毁  
  25.         If conn.State = ConnectionState.Open Then  
  26.             conn.Close()  
  27.         End If  
  28.         If Not IsNothing(comd) Then  
  29.             comd.Dispose() '销毁comd命令  
  30.             comd = Nothing  
  31.         End If  
  32.     End Try  
  33.   
  34. End Function  

 

你可能感兴趣的:(parameter)