SQLのInsertにパラメータを指定してレコードを追加するサンプル

図 SQLのInsertにパラメータを指定してレコードを追加するサンプル
このサンプルは、SQLのInsertステートメントにパラメータ(Positional Parameter)として疑問符(?)を指定して、AccessのNwind.mdbデータベースの得意先テーブルにレコードを追加します。実行結果として追加したレコードの得意先IDを表示します。
このサンプルでは、以下のノウハウを習得することができます。
▲ SQLのInsertステートメントにパラメータ(Positional Parameter)を指定する方法
▲ パラメータ(Positional Parameter)に値を設定する方法
サンプルのPage_Load()イベントでは、AccessのNwind.mdbデータベースの得意先テーブルにレコードを追加します。行7-8では、SQLのInsertステートメントを生成しています。InsertのValues()には、パラメータとして?を指定しています。
OleDbのNamespaceを使用するときは、パラメータ(Positional Parameter)として?を使用します。SqlClientのNamespaceを使用するときは、パラメータ(Named Parameter)として名前を使用します。
System.Data.OleDb使用時のパラメータ(Positional Parameter):
Insert Into Customers
(CompanyName, ContactName, Phone) Values(?, ?, ?)
System.Data.SqlClient使用時のパラメータ(Named Parameter):
Insert Into Customers
(CompanyName, ContactName, Phone) Values(@CompanyName,
@ContactName, @Phone)
ここで指定したパラメータには、ParametersコレクションのAdd()/Valueで値を設定します。行9では、追加した得意先レコードの得意先IDを取得するSQLを生成しています。行10-12では、OleDbConnectionとOleDbCommandのインスタンスを生成しています。
行14-15では、パラメータ変数@CompanyNameを追加して値を設定しています。パラメータ変数は、OleDbCommandのParametersコレクションのAdd()メソッドで追加します。Add()メソッドの引数には、パラメータ変数名、データ型、サイズを指定します。パラメータの値は、OleDbCommandのParametersコレクションのValueプロパティに設定します。行14-15を結合させて以下のように記述することもできます。
cmd.Parameters.Add("@CompanyName", OleDbType.VarWchar, 40).Value = "フレンドリーソフト"
行16-17では、パラメータ変数@ContactNameを追加して値を設定しています。行18-19では、パラメータ変数@Phoneを追加して値を設定しています。パラメータ?に値を設定するときは、Insertステートメントで記述した順番に設定します。InsertのValues()には、3個の?が指定されていますが、CompanyName、ContactName、Phoneの順番になっています。
パラメータ変数に値を設定するには、ParametersコレクションのValueプロパティを省略してAdd()メソッドで直接設定することもできます。
cmd.Parameters.Add("@CompanyName", "フレンドリーソフト")
cmd.Parameters.Add("@ContactName", "葛西 秋雄")
cmd.Parameters.Add("@Phone", "0480-99-9999")
パラメータ変数に値を設定するときは、省略形を使用しないで明示的にデータ型とサイズを指定することをお薦めします。
行21では、OleDbConnectionのOpen()メソッドでAccessのNwind.mdbデータベースを開いています。行22では、OleDbCommandのExecuteNonQuery()メソッドでInsertステートメントを実行して得意先テーブルにレコードを追加しています。行23-24では、OleDbCommandのExecuteScalar()メソッドで直前に追加したレコードの得意先IDを取得しています。得意先IDは、オートナンバー型のフィールドですからAccessが自動採番します。行25では、OleDbConnectionのClose()メソッドでAccessのNwind.mdbデータベースを閉じています。行26-28では、LabelのTextプロパティに追加したレコードの得意先IDを設定して表示しています。
6: Sub Page_Load()
7: Dim strSqlInsert As String = "Insert
Into Customers " & _
8: "(CompanyName,
ContactName, Phone) Values(?,?,?)"
9: Dim strSqlSelect As String = "Select
@@Identity"
10: Dim con As New OleDbConnection( _
11:
ConfigurationSettings.AppSettings("conStringAccNw"))
12: Dim cmd As New
OleDbCommand(strSqlInsert, con)
13:
14:
cmd.Parameters.Add("@CompanyName", OleDbType.VarWchar, 40)
15:
cmd.Parameters("@CompanyName").Value = "フレンドリーソフト"
16:
cmd.Parameters.Add("@ContactName", OleDbType.VarWchar, 30)
17:
cmd.Parameters("@ContactName").Value = "葛西 秋雄"
18:
cmd.Parameters.Add("@Phone", OleDbType.VarWchar, 24)
19:
cmd.Parameters("@Phone").Value = "0480-99-9999"
20:
21: con.Open()
22: cmd.ExecuteNonQuery()
23: cmd.CommandText = strSqlSelect
24: Dim intCustomerID As Integer =
cmd.ExecuteScalar()
25: con.Close()
26: lblMessage.Text = _
27: String.Format("得意先ID<b>{0}</b>を追加しました.", _
28:
intCustomerID.ToString())
29: End Sub