ADO.NETでデータベースにSQLを発行する際にSQLインジェクション対策でSqlParameterを使用しますが、パラメーターの数が多いとコードの見通しが悪くなる傾向にあります。拡張メソッド(エクステンション)を使用するとシンプルで見やすくなります。
一般的なSqlParameterの生成例
パラメータ一毎に変数定義が必要で、コピーアンドペーストで追加していくと変数名を直し忘れてしまうことがあります。 Valueを渡せるイニシャライザもありますが引数の数が多く、一行が長くなってしまいます。-
C#
// SQLパラメータ設定 SqlParameter param1 = new SqlParameter("@type1", SqlDbType.VarChar); param1.Value = "S"; command.Parameters.Add(param1); SqlParameter param2 = new SqlParameter("@type2", SqlDbType.VarChar); param2.Value = "U"; command.Parameters.Add(param2); SqlParameter param3 = new SqlParameter("@type3", SqlDbType.VarChar); param3.Value = "PK"; command.Parameters.Add(param3);
-
VB.NET
' SQLパラメータ設定 Dim param1 As New SqlParameter("@type1", SqlDbType.VarChar) param1.Value = "S" command.Parameters.Add(param1) Dim param2 As New SqlParameter("@type2", SqlDbType.VarChar) param2.Value = "U" command.Parameters.Add(param2) Dim param3 As New SqlParameter("@type3", SqlDbType.VarChar) param3.Value = "PK" command.Parameters.Add(param3)
拡張メソッド(エクステンション)を使用
コードがシンプルになりパラメータ毎の変数定義もないため、コピーアンドペーストで追加してもミスが起こりにくくなります。-
C#
// usingが必要 using Extensions; // 省略 // SQLパラメータ設定 List<SqlParameter> sqlParameters = new List<SqlParameter>(); sqlParameters.AddSqlParameter(new SqlParameter("@type1", SqlDbType.VarChar)).Value = "S"; sqlParameters.AddSqlParameter(new SqlParameter("@type2", SqlDbType.VarChar)).Value = "U"; sqlParameters.AddSqlParameter(new SqlParameter("@type3", SqlDbType.VarChar)).Value = "PK"; command.Parameters.AddParams(sqlParameters);
拡張メソッド本体(SqlParameterExtension.cs)
using System.Collections.Generic; using System.Data.SqlClient; namespace Extensions { public static class SqlParameterExtension { /// <summary> /// ListにSqlParameterを追加し、追加したSqlParameterを返す /// 使用例 /// List<SqlParameter> sqlParameters = new List<SqlParameter>(); /// sqlParameters.AddSqlParameter(new SqlParameter("@type1", SqlDbType.VarChar)).Value = "S"; /// </summary> public static SqlParameter AddSqlParameter(this List<SqlParameter> list, SqlParameter parameter) { list.Add(parameter); return parameter; } /// <summary> /// SqlParameterCollectionにList<SqlParameter>を追加 /// </summary> public static void AddParams(this SqlParameterCollection collection, List<SqlParameter> list) { foreach (SqlParameter parameter in list) { collection.Add(parameter); } } } }
-
VB.NET
' Importsが必要。XXXはルート名前空間(規定値はプロジェクト名) Imports XXX.Extensions ' 省略 ' SQLパラメータ設定 Dim sqlParameters As List(Of SqlParameter) = New List(Of SqlParameter)() sqlParameters.AddSqlParameter(New SqlParameter("@type1", SqlDbType.VarChar)).Value = "S" sqlParameters.AddSqlParameter(New SqlParameter("@type2", SqlDbType.VarChar)).Value = "U" sqlParameters.AddSqlParameter(New SqlParameter("@type3", SqlDbType.VarChar)).Value = "PK" command.Parameters.AddParams(sqlParameters)
拡張メソッド本体(SqlParameterExtension.vb)
Imports System.Data.SqlClient Imports System.Runtime.CompilerServices Namespace Extensions Public Module SqlParameterExtension ''' <summary> ''' ListにSqlParameterを追加し、追加したSqlParameterを返す ''' 使用例 ''' Dim sqlParameters As List(Of SqlParameter) = New List(Of SqlParameter)() ''' sqlParameters.AddSqlParameter(New SqlParameter("@type1", SqlDbType.VarChar)).Value = "S" ''' </summary> <Extension()> _ Public Function AddSqlParameter(ByVal list As List(Of SqlParameter), ByVal parameter As SqlParameter) As SqlParameter list.Add(parameter) Return parameter End Function ''' <summary> ''' SqlParameterCollectionにList(Of SqlParameter)を追加 ''' </summary> <Extension()> _ Public Sub AddParams(ByVal collection As SqlParameterCollection, ByVal list As List(Of SqlParameter)) For Each parameter As SqlParameter In list collection.Add(parameter) Next End Sub End Module End Namespace
サンプルコードのダウンロード
サンプルコードの実行には Microsoft Visual Studio 2008 以上のバージョンが必要です。 2008以外のバージョンではプロジェクトを開いた際にファイルの変換が必要な場合があります。その場合は変換後に実行してください。検証環境
- Microsoft Visual Studio 2008 Version 9.0.30729.4462 QFE Edition: Professional
- Microsoft .NET Framework Version 3.5 SP1
- Microsoft SQL Server Express Edition (64-bit) プラットフォーム:NT x64 バージョン:10.0.6556.0
- Microsoft Windows 7 Professional Service Pack 1 (Microsoft Windows NT 6.1 (7601))