6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

パラメータを利用してSQL文を作成する

Last updated at Posted at 2023-01-26

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文などで文末にスペースを入れ忘れてもエラーにならず、デバッグの際見やすい。


参考

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?