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



SQLインジェクションなどの対策として パラメタライズドクエリ (パラメタ化クエリ、パラメータクエリ等)にしてコーディングを行ったので、メモしていく。

使用環境：
VisualStudio 2017
SQLServer
C#

**必要なusing記述**
```c#
using System.Data.SqlClient;
```
App.configからDB接続情報を指定する場合こちらも↓
```C#
using System.Configuration;
```


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

SQL文の実行のためにDBへ接続する。

DB接続情報の記述方法↓
https://qiita.com/suzuki_q/items/e0e061c559b3f3f22a64

```C#
//データベース接続文字列を取得
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を利用すると、＋を利用しなくても縦長に繋ぐことができる。
```C#
StringBuilder sb = new StringBuilder();
```



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

<br>


#### 参考
- [C# で SQL Server に パラメタライズドクエリ を 実行する](https://garafu.blogspot.com/2016/05/cs-sqlserver-use-parameterizedquery.html#:~:text=C%2523%2520%25E3%2581%25A7%2520SQL%2520Server%2520%25E3%2581%25AB%25E5%25AF%25BE%25E3%2581%2597%25E3%2581%25A6,%25E3%2583%2591%25E3%2583%25A9%25E3%2583%25A1%25E3%2582%25BF%25E3%2583%25A9%25E3%2582%25A4%25E3%2582%25BA%25E3%2583%2589%25E3%2582%25AF%25E3%2582%25A8%25E3%2583%25AA%2520%25E3%2582%2592%25E5%2588%25A9%25E7%2594%25A8%25E3%2581%2599%25E3%2582%258B%25E9%259A%259B%25E3%2581%25AF%2520%2540%25E3%2583%2591%25E3%2583%25A9%25E3%2583%25A1%25E3%2583%25BC%25E3%2582%25BF%25E5%2590%258D%2520%25E3%2581%25A7%25E3%2583%2591%25E3%2583%25A9%25E3%2583%25A1%25E3%2583%25BC%25E3%2582%25BF%25E6%258C%2587%25E5%25AE%259A%25E3%2581%2597%25E3%2581%25BE%25E3%2581%2599%25E3%2580%2582%2520Command%2520%25E3%2582%2592%25E5%2586%258D%25E5%2588%25A9%25E7%2594%25A8%25E3%2581%2599%25E3%2582%258B%25E5%25A0%25B4%25E5%2590%2588%25E3%2580%2581%25E3%2583%2591%25E3%2583%25A9%25E3%2583%25A1%25E3%2583%25BC%25E3%2582%25BF%25E3%2581%258C%25E4%25BF%259D%25E5%25AD%2598%25E3%2581%2595%25E3%2582%258C%25E3%2581%259F%25E3%2581%25BE%25E3%2581%25BE%25E3%2581%25A8%25E3%2581%25AA%25E3%2582%258B%25E3%2581%25AE%25E3%2581%25A7%25E3%2583%2591%25E3%2583%25A9%25E3%2583%25A1%25E3%2583%25BC%25E3%2582%25BF%25E6%258C%2587%25E5%25AE%259A%25E3%2581%2599%25E3%2582%258B%25E3%2582%25AD%25E3%2583%25BC%25E5%2590%258D%25E3%2581%258C%25E8%25A2%25AB%25E3%2582%2589%25E3%2581%25AA%25E3%2581%2584%25E3%2582%2588%25E3%2581%2586%25E3%2581%25AB%25E6%25B3%25A8%25E6%2584%258F%25E3%2581%2597%25E3%2581%25BE%25E3%2581%2599%25E3%2580%2582)
- [[C#] SQL文に埋め込みパラメータを使用する](https://csharp.programmer-reference.com/db-sql-parameter/)