SQLインジェクションなどの対策として パラメタライズドクエリ (パラメタ化クエリ、パラメータクエリ等)にしてコーディングを行ったので、メモしていく。
使用環境:
VisualStudio 2017
SQLServer
C#
必要なusing記述
using System.Data.SqlClient;
App.configからDB接続情報を指定する場合こちらも↓
using System.Configuration;
パラメータを利用してSQL文を作成する
SQL文の実行のためにDBへ接続する。
DB接続情報の記述方法↓
https://qiita.com/suzuki_q/items/e0e061c559b3f3f22a64
//データベース接続文字列を取得
string connStr = ConfigrationManager.ConnectionStrings["sqlsvrconnect"].ConnectionString;
using (var conn = new SqlConnection(connStr))
{
// データベースの接続開始
conn.Open();
using (SqlCommand command = conn.CreateCommand())
{
command.CommandText = @"INSERT INTO example_teble (ID, PASSWORD, MONEY) VALUES (@ID, @PASSWORD, @MONEY)";
command.Parameters.Add("@ID", SqlDbType.Int).Value = id;
command.Parameters.Add("@PASSWORD", SqlDbType.NVarChar).Value = password;
command.Parameters.Add("@MONEY", SqlDbType.Money).Value = money;
// SQLの実行
command.ExecuteNonQuery();
//Parameterのクリア
command.Parameters.Clear();
}
// データベースの接続終了
conn.Close();
}
SqlDbTypeでINSERTする時の型を指定できる。
おまけ
上記のコードだと可読性が低いので、縦長に書き換えてSQL文を読みやすくしてみた。
縦長に書き換える際、+を使って文字列を繋ぐと処理が重くなってしまう。
StringBuilderを利用すると、+を利用しなくても縦長に繋ぐことができる。
StringBuilder sb = new StringBuilder();
書き換え後
string connStr = ConfigrationManager.ConnectionStrings["sqlsvrconnect"].ConnectionString;
using (var conn = new SqlConnection(connStr))
{
// データベースの接続開始
conn.Open();
using (SqlCommand command = conn.CreateCommand())
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(@"INSERT INTO example_teble")
.AppendLine("(")
.AppendLine("ID,")
.AppendLine("PASSWORD,")
.AppendLine("MONEY")
.AppendLine(")")
.AppendLine("VALUES")
.AppendLine("(")
.AppendLine("@ID,")
.AppendLine("@PASSWORD,")
.AppendLine("@MONEY")
.AppendLine(")");
//sbをString型に明示的に変換する
command.CommandText = sb.ToString();
command.Parameters.Add("@ID", SqlDbType.Int).Value = id;
command.Parameters.Add("@PASSWORD", SqlDbType.NVarChar).Value = password;
command.Parameters.Add("@MONEY", SqlDbType.Money).Value = money;
// SQLの実行
command.ExecuteNonQuery();
//Parameterのクリア
command.Parameters.Clear();
}
// データベースの接続終了
conn.Close();
}
AppendLineを使うと改行が入るため、SELECT文などで文末にスペースを入れ忘れてもエラーにならず、デバッグの際見やすい。