SQLのSelectにパラメータを指定してレコードを抽出するサンプル

図 SQLのSelectにパラメータを指定してレコードを抽出するサンプル
このサンプルは、SQLのSelectステートメントにパラメータ(?)を指定して、AccessのNwind.mdbデータベースの得意先テーブルからレコードを抽出しています。実行結果として得意先IDと得意先名を表示します。レコードが見つからないときは、エラーメッセージを表示します。
このサンプルでは、以下のノウハウを習得することができます。
▲ SQLのSelectステートメントにパラメータ(Positional Parameter)を指定する方法
▲ パラメータ(Positional Parameter)に値を設定する方法
▲ OleDbCommandのExecuteReader()メソッドの使い方
▲ OleDbDataReaderのRead()メソッドの使い方
▲ Read()メソッドで取り込んだレコードのフィールド(カラム)を表示する方法
サンプルのPage_Load()イベントでは、AccessのNwind.mdbデータベースの得意先テーブルからレコードを抽出しています。行7-8では、SQLのSelectステートメントを生成しています。フィールド名には、*を指定して得意先テーブルのすべてのフィールドを抽出します。Where句には、パラメータとして?を指定しています。
Select * From Customers
Where CompanyName=?
ここで指定してパラメータの値は、ParametersコレクションのAdd()/Valueで設定します。パラメータに値を設定するときは、Selectステートメントに記述した順番に行います。
行13-14では、CompanyNameのパラメータ値を設定しています。行13では、OleDbCommandのParametersコレクションのAdd()メソッドでパラメータ変数@CompanyNameを追加しています。引数には、パラメータ変数、データ型、サイズを指定します。行14では、パラメータ変数@CompanyNameに値を設定しています。
行16では、OleDbConnectionのOpen()メソッドでAccessのNwind.mdbデータベースを開いています。行17では、OleDbCommandのExecuteReader()メソッドでSelectステートメントを実行して得意先テーブルから検索条件と一致するレコードを抽出しています。ExecuteReader()メソッドは、得意先テーブルのOleDbDataReaderを生成して返します。行18-22のIf…End Ifでは、OleDbDataReaderのRead()メソッドで得意先テーブルの先頭レコードを読み込みます。レコードが読み込まれたときは、LabelのTextプロパティにレコードの得意先IDと得意先名を設定して表示します。レコードが見つからないときは、LabelのTextにエラーメッセージを設定して表示します。行23では、OleDbDataReaderのClose()メソッドで得意先テーブルを閉じます。行24では、OleDbConnectionのClose()メソッドでAccessのNwind.mdbデータベースを閉じます。
6: Sub Page_Load()
7: Dim strSqlDelete As String = "Select
* From Customers " & _
8: "Where CompanyName=?"
9: Dim con As New OleDbConnection( _
10:
ConfigurationSettings.AppSettings("conStringAccNw"))
11: Dim cmd As New
OleDbCommand(strSqlDelete, con)
12:
13:
cmd.Parameters.Add("@CompanyName", OleDbType.VarWchar, 40)
14: cmd.Parameters("@CompanyName").Value
= "フレンドリーソフト"
15:
16: con.Open()
17: Dim dr As OleDbDataReader =
cmd.ExecuteReader()
18: If dr.Read() Then
19: lblMessage.Text =
dr("CustomerID") & ":" & dr("CompanyName")
20: Else
21: lblMessage.Text = "No
Records Found"
22: End If
23: dr.Close()
24: con.Close()
25: End Sub
Tip
|
AccessのSQLにパラメータを使用するメリット AccessのJetエンジンは、SQL Serverのようにストアドプロシージャをサポートしていません。このため、SQLコマンドにパラメータを使用してもあまり効果がありません。ところが、セキュリティを考慮するとランタイム時にSQLを生成するよりもパラメータを使用した方が安全です。 SQLをランタイム時に生成するときは、テキストボックスに「フレンドリーソフト”Or “”=”」のようなデータを入力すると得意先テーブルのすべてのレコードが表示されます。 Dim strSqlSelect As String = "Select * From Customers " & _ "Where CompanyName='" & txtCustomerName.Text.Trim() & "'" ところがパラメータを使用したときは、テキストボックスに「フレンドリーソフト’”Or “”’=”」のようなデータを入力しても得意先テーブルのレコードが抽出されません。 Dim strSqlDelete As String = "Select * From Customers " & _ "Where CompanyName=?" cmd.Parameters.Add("@CompanyName", OleDbType.VarWchar, 40) cmd.Parameters("@CompanyName").Value = txtCustomerName.Text.Trim() |