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文をつなぎ合わせることで注入攻撃ができます.
SQL文では、シナリオ注入の危険性がありますので、SQL文の文字列をつなぎ合わせてはいけません.Sql Parameeterを通じてデータの操作を実現したいです.Sql Parameeterの方式に対しても、多重化できるデータアクセスクラスにパッケージ化できます.SQL文よりSql Parameeterのパラメータが多くなりました.
一般的に、DataTableまたはDataSetを更新する際に、Sql Parameeterを使用しないと、入力されたSql文にエラーが発生すると、文字列のようになります.
の中にシングルクォーテーションマークが含まれていると、プログラムにエラーが発生し、他の人が簡単にSql文をつなぎ合わせることで注入攻撃ができます.
- string sql = "update Table1 set name = 'Pudding' where ID = '1'";//未采用SqlParameter
- SqlConnection conn = new SqlConnection();
- conn.ConnectionString = "Data Source=.\\SQLExpress;Integrated Security=true;AttachDbFilename=|DataDirectory|\\Database.mdf;User Instance=true";//连接字符串与数据库有关
- SqlCommand cmd = new SqlCommand(sql, conn);
- try
- {
- conn.Open();
- return(cmd.ExecuteNonQuery());
- }
- catch (Exception)
- {
- return -1;
- throw;
- }
- finally
- {
- conn.Close();
上述代码未采用SqlParameter,除了存在安全性问题,该方法还无法解决二进制流的更新,如图片文件。通过使用
SqlParameter可以解决上述问题,常见的使用方法有两种,Add方法和AddRange方法。
一、Add方法
- sp as SqlParameter = new SqlParameter("@name", "Pudding");
- cmd.Parameters.Add(sp);
- sp = new SqlParameter("@ID", "1");
- 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