パラメータークエリ

 データベースからデータを利用するとき、いつも同じSQL文を使えるわけではありません。状況によってユーザーが検索キーワードを入力し、それをもとにデータを抽出することもあります。その際、抽出するための条件をそのたびに設定しなくてはなりません。今までは次のようにSQL文に直接条件を指定しました。

string sql = “SELECT * FROM Users WHERE Id=” + iddata;
(変数iddataにユーザーが指定したIDが入っているとする)

 そのほかにも条件を指定する方法があります。それがパラメータークエリです。パラメータークエリを利用するにはSQL文の条件の部分で、「@パラメーター名」を割り当てておきます。
 ※ OleDbCommandクラスおよびOdbcCommandクラスの場合は「?」を指定します。

 後で「@パラメーター名」に値を入れることにより、その時に応じたデータを抽出することができます。CommandクラスにはParametersコレクションがあります。そこにParameterオブジェクトがセットされます。このコレクションのAddメソッドを使ってパラメーターの値を設定します。

○ プロジェクト

 プロジェクトを作成して確認してみましょう。先回作成したCommandTestプロジェクトのプログラムをパラメータークエリに変更してみましょう。

プロジェクトの種類 コンソール アプリケーション
プロジェクト名 ParameterTest

サンプルダウンロード

○ 作成の準備

 「CommandTest」プロジェクトを修正して作成しましょう。CommandTestフォルダーをコピーして、作成するプロジェクト名にフォルダー名を変更してください。

○ プログラム

 Mainメソッドを次のように記述してください。

Program.cs

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Data.SqlClient;
  7. using System.Data;
  8. namespace CommandTest
  9. {
  10.  class Program
  11.  {
  12.   static void Main(string[] args)
  13.   {
  14.    //接続文字列
  15.    string constr = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Work\Books.mdf;Integrated Security=True;Connect Timeout=30";
  16.    //SqlConnectionオブジェクトを生成
  17.    SqlConnection con = new SqlConnection(constr);
  18.    //追加する情報を入力
  19.    Console.WriteLine("登録するユーザー情報を入力してください。");
  20.    Console.Write("ID:");
  21.    int id = Int32.Parse(Console.ReadLine());
  22.    Console.Write("ユーザー名:");
  23.    string username = Console.ReadLine();
  24.    Console.Write("パスワード:");
  25.    string password = Console.ReadLine();
  26.    Console.Write("氏名:");
  27.    string name = Console.ReadLine();
  28.    //入力した情報をもとにSQL文を作成
  29.    string sql = "INSERT INTO Users VALUES(@id, @username, @password, @name)";
  30.    //SqlCommandオブジェクトを生成
  31.     SqlCommand cmd = new SqlCommand(sql, con);
  32.    //パラメータを追加する
  33.    cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
  34.    SqlParameter param = new SqlParameter("@username", SqlDbType.NVarChar);
  35.    param.Value = username;
  36.    cmd.Parameters.Add(param);
  37.    cmd.Parameters.Add(new SqlParameter("@password", SqlDbType.NVarChar)).Value = password;
  38.    cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = name;
  39.    //実行予定のSQL文を表示
  40.    Console.WriteLine("実行するSQL文:{0}", cmd.CommandText);
  41.    //データベースを開く
  42.    con.Open();
  43.    //SQL文を実行する
  44.    int ret = cmd.ExecuteNonQuery();
  45.    //変更のあった行数を表示する
  46.    Console.WriteLine("変更のあった件数:{0}", ret);
  47.    //データベースを閉じる
  48.    con.Close();
  49.    Console.ReadLine();
  50.   }
  51.  }
  52. }

○ 実行結果

登録するユーザー情報を入力してください。
ID:6
ユーザー名:yamamoto
パスワード:ypass
氏名:山本
実行するSQL文:INSERT INTO Users VALUES(@id, @username, @password, @name)
変更のあった件数:1

Usersテーブルに追加されている
Usersテーブルに追加されている

○ 解説

 33行目でパラメータークエリを作成しています。ID、ユーザー名、パスワード、氏名用のパラメーターを設定しています。それぞれのパラメーターに対して39~44行目でデータを設定しています。今回は3つの方法で指定しています。

 1つ目の方法は、39、44行目のParametersコレクションのAddメソッドを使って、SqlParameterオブジェクトを生成する方法です。引数にパラメーター名、データベースのデータ型を指定します。SqlDbType列挙体にある一覧から選びます。その後続けてValueプロパティに、パラメーターに設定したい値を代入します。

 2つ目の方法は、40行目でSqlParameterオブジェクトを生成しています。引数はParametersコレクションのAddメソッドと同じです。オブジェクトを生成してから41行目でValueプロパティに、パラメーターに設定したい値を代入しています。その後42行目にあるように、設定済みのSqlParameterオブジェクトをParametersコレクションのAddメソッドの引数に指定して追加しています。

 3つ目の方法は、43行目のParametersコレクションのAddメソッドの引数でSqlParameterオブジェクトを生成して、その後、Valueプロパティにパラメーターに設定したい値を代入しています。

前へ   次へ