パラメータークエリ

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

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

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

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

○ プロジェクト

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

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

サンプルダウンロード

○ 作成の準備

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

○ プログラム

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

Module1.vb

  1. Sub Main()
  2.  '接続文字列
  3.  Dim constr As String = "Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Work\Books.mdf;Integrated Security=True;Connect Timeout=30"
  4.  'SqlConnectionオブジェクトを生成
  5.  Dim con As SqlConnection = New SqlConnection(constr)
  6.  '追加する情報を入力
  7.  Console.WriteLine("登録するユーザー情報を入力してください。")
  8.  Console.Write("ID:")
  9.  Dim id As Integer = Int32.Parse(Console.ReadLine())
  10.  Console.Write("ユーザー名:")
  11.  Dim username As String = Console.ReadLine()
  12.  Console.Write("パスワード:")
  13.  Dim password As String = Console.ReadLine()
  14.  Console.Write("氏名:")
  15.  Dim name As String = Console.ReadLine()
  16.  '入力した情報をもとにSQL文を作成
  17.  Dim sql As String = "INSERT INTO Users VALUES(@id, @username, @password, @name)"
  18.  'SqlCommandオブジェクトを生成
  19.  Dim cmd As New SqlCommand(sql, con)
  20.  'パラメーターを追加する
  21.  cmd.Parameters.Add("@id", SqlDbType.Int).Value = id
  22.  Dim param As New SqlParameter("@username", SqlDbType.NVarChar)
  23.  param.Value = username
  24.  cmd.Parameters.Add(param)
  25.  cmd.Parameters.Add(New SqlParameter("@password", SqlDbType.NVarChar)).Value = password
  26.  cmd.Parameters.Add("@name", SqlDbType.NVarChar).Value = name
  27.  '実行予定のSQL文を表示
  28.  Console.WriteLine("実行するSQL文:{0}", cmd.CommandText)
  29.  'データベースを開く
  30.  con.Open()
  31.  'SQL文を実行する
  32.  Dim ret As Integer = cmd.ExecuteNonQuery()
  33.  '変更のあった行数を表示する
  34.  Console.WriteLine("変更のあった件数:{0}", ret)
  35.  'データベースを閉じる
  36.  con.Close()
  37.  Console.ReadLine()
  38. End Sub

○ 実行結果

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

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

○ 解説

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

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

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

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

前へ   次へ