none
パラメタライズドクエリでの、パラメータ宣言について教えてください。 RRS feed

  • 質問

  • 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 DataTable 

            dtcmb = dscmb.Tables(0)       ’---この行で、「変数’@FLG_Branch’の宣言が必要です。」とエラーコメント表示。

    よろしく、お願いします。

    YKsaila

    2012年5月2日 2:14

回答

  • まず、質問内容では「変数: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
    2012年5月2日 2:25

すべての返信

  • まず、質問内容では「変数: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
    2012年5月2日 2:25
  • aviator__さんの回答で正解だと思いますが、念のために補足しておきます。
    もし、sqlのConnectionプロパティの設定をしていなければ必要ですので注意して下さい。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年5月2日 3:07
    モデレータ
  • aviator_さんへ

    成功しました! ありがとうございます!

    要するに、下記のNew以下の二行が良くなかったのですね。 パラメータ無しではうまくいっていたのですが、それだとパラメータを受けないということが理解できました。

         adapter.SelectCommand = New SqlClient.SqlCommand(sql.CommandText, Con)
            adapter.SelectCommand.CommandType = CommandType.Text

    YKsaila

    2012年5月2日 3:38
  • trapemiyaさんへ

    成功しました! ありがとうございます!

    Yksaila

    2012年5月2日 3:39
  • aviator_さんへ

    成功しました! ありがとうございます!

    要するに、下記のNew以下の二行が良くなかったのですね。 パラメータ無しではうまくいっていたのですが、それだとパラメータを受けないということが理解できました。

         adapter.SelectCommand = New SqlClient.SqlCommand(sql.CommandText, Con)
            adapter.SelectCommand.CommandType = CommandType.Text

    YKsaila

    パラメータを受けないのではなく、パラメータを渡していないというのが正確な表現だと思います。

    New SqlClient.SqlCommand(sql.CommandText, Con)

    が表す通り、sql.CommandText と Con を元に、新しいSqlCommandのインスタンスを生成し直してる訳ですから、

    sqlインスタンスが保持するCommandText以外の情報は一切引き継がれません。

    2012年5月2日 7:27
  • aviatorさんへ

    >パラメータを受けないのではなく、パラメータを渡していないというのが正確な表現だと思います。

    たしかに、その通りでした。 

    うっかりしていました。 おかげさまで、少しわかってきました(数%??)。

    今後も、よろしくお願いします。

    YKsaila

    2012年5月2日 10:52