Sql Parameeterの基本的な使い方

8253 ワード

本の出所http://developer.51cto.com/art/201105/263535.htm ,一部の変更が少ないです
SQL文では、シナリオ注入の危険性がありますので、SQL文の文字列をつなぎ合わせてはいけません.Sql Parameeterを通じてデータの操作を実現したいです.Sql Parameeterの方式に対しても、多重化できるデータアクセスクラスにパッケージ化できます.SQL文よりSql Parameeterのパラメータが多くなりました.
 
一般的に、DataTableまたはDataSetを更新する際に、Sql Parameeterを使用しないと、入力された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方法

 

 
  

dim  paras as new  SqlParameter() paras = new SqlParameter{    new SqlParameter("@name", "Pudding"),   
                       new SqlParameter("@ID", "1") };  
 cmd.Parameters.AddRange(paras);  
 
明らかに、Add方法は、Sql Parameeterを複数追加する際に不便であり、この場合、AddRange方法を採用することができる. 
 
以下は、Sql Parameeterを介してD層のユーザテーブルにユーザを追加します.
Imports System.Collections
Imports Entity
Imports [Interface]
Imports System.Configuration
Imports System.Data
Imports System.Data.SqlClient
Imports SqlHelper
'/************************************************* 
'  : SqlUserDAL
'  :    
'  :User      
'    :2013 3 5 
'**********************************************/
''' 
'''        
''' 
''' 
Public Class SqlUserDAL
    Implements [Interface].IUser '   IUser  
    ''' 
    '''      User,      
    ''' 
    '''        
    '''   boolean  
    ''' 
    Public Function AddUser(enUser As User.UserEntity) As Boolean Implements IUser.AddUser
        Dim btn As Boolean = False                 '        
        Dim sqlHelper As New SqlHelper.sqlHelper   '   
        Dim strSQL As String 'SQL   
        Dim addUserFlag As Integer '      

        '    
        Dim sqlParameter As SqlParameter()
        Try

        
        sqlParameter = New SqlParameter() {
                                            New SqlParameter("@userID", enUser.UserID),
                                            New SqlParameter("@userName", enUser.UserName),
                                            New SqlParameter("@userPwd", enUser.UserPwd),
                                            New SqlParameter("@userRank", enUser.UserRank),
                                            New SqlParameter("@statue", enUser.Statue)
            }
        'Sql  
        strSQL = "insert into T_User(userID,userName,userPwd,userRank,status)" & "value (@userID,@userName,@userRank,@statue)"
        '        
            addUserFlag = sqlHelper.ExecuteNoQuery(strSQL, CommandType.Text, sqlParameter)
            '      
            If addUserFlag > 0 Then
                btn = True '    
            End If

        Catch ex As Exception

            Throw New Exception(MsgBox("          ", MsgBoxStyle.Information))
        End Try
        '   btn    
        Return btn
    End Function
 
Sql Helper類の部分コードは以下の通りです.
 
    ''' 
    '''          ,(  )    boolean  ,      
    ''' 
    '''        ,   Sql  ,      
    '''     (    , T-SQL  ,   )
    '''     ,          
    '''       ,   true,   false
    ''' 
    Public Function ExecuteNoQuery(ByVal strSql As String, ByVal cmdType As CommandType, ByVal sqlParams As SqlParameter()) As Boolean
        comd.Parameters.AddRange(sqlParams) '    
        comd.CommandType = cmdType '      
        comd.Connection = conn '    
        comd.CommandText = strSql '      

        Try
            conn.Open() '    
            Return comd.ExecuteNonQuery() '       
            comd.Parameters.Clear() '      

        Catch ex As Exception
            Return False '    ,  false   
        Finally
            '                ,        
            '             ,      
            If conn.State = ConnectionState.Open Then
                conn.Close()
            End If
            If Not IsNothing(comd) Then
                comd.Dispose() '  comd  
                comd = Nothing
            End If
        End Try

    End Function