ADO.NET Accessのホームへ戻る

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

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

 

このサンプルは、SQLSelectステートメントにパラメータ(?)を指定して、AccessNwind.mdbデータベースの得意先テーブルからレコードを抽出しています。実行結果として得意先IDと得意先名を表示します。レコードが見つからないときは、エラーメッセージを表示します。

 

このサンプルでは、以下のノウハウを習得することができます。

 

  SQLSelectステートメントにパラメータ(Positional Parameter)を指定する方法

  パラメータ(Positional Parameter)に値を設定する方法

  OleDbCommandExecuteReader()メソッドの使い方

  OleDbDataReaderRead()メソッドの使い方

  Read()メソッドで取り込んだレコードのフィールド(カラム)を表示する方法

 

サンプルのPage_Load()イベントでは、AccessNwind.mdbデータベースの得意先テーブルからレコードを抽出しています。行7-8では、SQLSelectステートメントを生成しています。フィールド名には、*を指定して得意先テーブルのすべてのフィールドを抽出します。Where句には、パラメータとして?を指定しています。

 

Select * From Customers
Where CompanyName=?

ここで指定してパラメータの値は、ParametersコレクションのAdd()/Valueで設定します。パラメータに値を設定するときは、Selectステートメントに記述した順番に行います。

 

13-14では、CompanyNameのパラメータ値を設定しています。行13では、OleDbCommandParametersコレクションのAdd()メソッドでパラメータ変数@CompanyNameを追加しています。引数には、パラメータ変数、データ型、サイズを指定します。行14では、パラメータ変数@CompanyNameに値を設定しています。

 

16では、OleDbConnectionOpen()メソッドでAccessNwind.mdbデータベースを開いています。行17では、OleDbCommandExecuteReader()メソッドでSelectステートメントを実行して得意先テーブルから検索条件と一致するレコードを抽出しています。ExecuteReader()メソッドは、得意先テーブルのOleDbDataReaderを生成して返します。行18-22If…End Ifでは、OleDbDataReaderRead()メソッドで得意先テーブルの先頭レコードを読み込みます。レコードが読み込まれたときは、LabelTextプロパティにレコードの得意先IDと得意先名を設定して表示します。レコードが見つからないときは、LabelTextにエラーメッセージを設定して表示します。行23では、OleDbDataReaderClose()メソッドで得意先テーブルを閉じます。行24では、OleDbConnectionClose()メソッドでAccessNwind.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

AccessSQLにパラメータを使用するメリット

 

AccessJetエンジンは、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()

 

 

ADO.NET Accessのホームへ戻る