トップ回答者
パラメタライズドクエリでの、パラメータ宣言について教えてください。

質問
-
SQL文を、パラメタライズドクエリに書き換える勉強をしています。 NET、Google、MSDNLibrary等で、調べてやってみたのですが、うまくいきません。
見本を参考に他ではうまくいっているのですが、下記コードが駄目なのです。 問題点を指摘していただければ、幸いです。
VB2010Express、SQLサーバー2003を使用しています。
下記コードの最終行で、「変数’@FLG_Branch’の宣言が必要です。」と、エラー表示されます。
Dim dscmb = New DataSet
Dim FLG_Branch As Integer = 0
Dim ShortName As String = "%" & SHN & "%"
sql.CommandText = "SELECT T_M_Client.Client_ID, T_M_Client.ClientCode, T_M_Client.ShortName FROM T_M_Client " _
& "Where FLG_Branch= @FLG_Branch and ShortName Like @ShortName order by Kanacode"
sql.Parameters.AddWithValue("@FLG_Branch", FLG_Branch)
sql.Parameters.AddWithValue("@ShortName", ShortName)adapter.SelectCommand = New SqlClient.SqlCommand(sql.CommandText, Con)
adapter.SelectCommand.CommandType = CommandType.Text
adapter.Fill(dscmb)
Dim dtcmb As New DataTabledtcmb = dscmb.Tables(0) ’---この行で、「変数’@FLG_Branch’の宣言が必要です。」とエラーコメント表示。
よろしく、お願いします。
YKsaila
回答
-
まず、質問内容では「変数:sql , adapter」 の型が不明です。
※恐らくはSystem.Data.SqlClient.SqlCommandクラスとDataAdapterクラスのインスタンスでしょうが・・・本題ですが、下記の様にしたらどうなりますか?
Dim dscmb = New DataSet Dim FLG_Branch As Integer = 0 Dim ShortName As String = "%" & SHN & "%" sql.CommandText = "SELECT T_M_Client.Client_ID, T_M_Client.ClientCode, T_M_Client.ShortName FROM T_M_Client " _ & "Where FLG_Branch= @FLG_Branch and ShortName Like @ShortName order by Kanacode" sql.CommandType = CommandType.Text sql.Parameters.AddWithValue("@FLG_Branch", FLG_Branch) sql.Parameters.AddWithValue("@ShortName", ShortName) adapter.SelectCommand = sql adapter.Fill(dscmb) Dim dtcmb As New DataTable dtcmb = dscmb.Tables(0)
見た所、SelectCommand をセットする時に新たなCommandを生成しており、
その前にセットしたパラメーターが引き継がれていません。
- 回答としてマーク yksaila 2012年5月2日 3:34
すべての返信
-
まず、質問内容では「変数:sql , adapter」 の型が不明です。
※恐らくはSystem.Data.SqlClient.SqlCommandクラスとDataAdapterクラスのインスタンスでしょうが・・・本題ですが、下記の様にしたらどうなりますか?
Dim dscmb = New DataSet Dim FLG_Branch As Integer = 0 Dim ShortName As String = "%" & SHN & "%" sql.CommandText = "SELECT T_M_Client.Client_ID, T_M_Client.ClientCode, T_M_Client.ShortName FROM T_M_Client " _ & "Where FLG_Branch= @FLG_Branch and ShortName Like @ShortName order by Kanacode" sql.CommandType = CommandType.Text sql.Parameters.AddWithValue("@FLG_Branch", FLG_Branch) sql.Parameters.AddWithValue("@ShortName", ShortName) adapter.SelectCommand = sql adapter.Fill(dscmb) Dim dtcmb As New DataTable dtcmb = dscmb.Tables(0)
見た所、SelectCommand をセットする時に新たなCommandを生成しており、
その前にセットしたパラメーターが引き継がれていません。
- 回答としてマーク yksaila 2012年5月2日 3:34
-
aviator_さんへ
成功しました! ありがとうございます!
要するに、下記のNew以下の二行が良くなかったのですね。 パラメータ無しではうまくいっていたのですが、それだとパラメータを受けないということが理解できました。
adapter.SelectCommand = New SqlClient.SqlCommand(sql.CommandText, Con)
adapter.SelectCommand.CommandType = CommandType.TextYKsaila
パラメータを受けないのではなく、パラメータを渡していないというのが正確な表現だと思います。
New SqlClient.SqlCommand(sql.CommandText, Con)
が表す通り、sql.CommandText と Con を元に、新しいSqlCommandのインスタンスを生成し直してる訳ですから、
sqlインスタンスが保持するCommandText以外の情報は一切引き継がれません。