- ベストアンサー
SQLパラメーターの表示について
- Windows7、VB2010(Windowsフォーム)、SQL Server で開発し、XPと7で画面を動かします。SQLでパラメータを使っており、エラー処理で困っています。
- SQLのパラメータの内容が表示されない問題について。SQLが「~~~~ WHERE KEN_ID = @KEN_ID」そのままになり、「~~~~ KEN_ID = '01'」等にならない。
- 別プロジェクトにおいて、SQLパラメータの内容を設定している部分でエラーが発生しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> ですが、KEN_IDをシングルコーテーションで囲むのを忘れてました; > ありがとうございます それはまずい気がする。。。 SqlParameter クラスの中で、SqlDbType に応じて文字列を必要な形式に 変換してくれるはずだから、SQL の本文にシングルコーテーションを つけると動作が変わってしまいそうに思います。 データにシングルコーテーションを含む場合など、十分にパターンテスト して確認しておきましょう。 #1の方は SQL 文内の(パラメータ)変数と VB.NET の変数を混同している ようです。 #2の方が言うようにデータベースにそのまま渡ってから処理されるので 自力で置き換えるか、むしろ CommandText はそのまま出力して、それとは 別に Command.Parameters コレクションをループで回してパラメータの 値を全部書き出せばいいような気もします。 どちらにしろ、Common.DB という自作クラスを前提に質問されても こちらでは理解できませんので、そのクラスを設計された方に相談して ください。
その他の回答 (2)
- Yune-Kichi
- ベストアンサー率74% (465/626)
Common.DBクラスが何をしているのかわかりませんが, パラメータを最終的に処理するのはSQL Serverエンジンになります。 # Sql Profilerで確認すると@KEN_IDがそのままエンジンまで届いていることが確認できます。 このため,@KEN_IDがクライアント側で展開されることはありません。 また,エラー処理中でSql.ToString()を出力していますが, StringBuilderクラスは汎用クラスのため,パラメータを置き換えるような処理は当然ながらありません。 基本的には, ・自力で展開する ・パラメータを別途出力する のどちらかになると思います。私であれば後者を選択します。 ただし,どうもCommon.DBクラスに処理を委譲しているようなので,Common.DBクラスがこのための処理をある程度代行する必要があると思います。
お礼
ありがとうございます。 DBクラスは、コネクションの接続やSQL実行をしている部分です DBクラスのconnectionを受け取り、command内のパラメータを出力する方向で決まりました ありがとうございました
- o_chi_chi
- ベストアンサー率45% (131/287)
> sql.Append(" KEN_ID = @KEN_ID") 変数をダブルクォートの中にいれたら 変数も文字列として扱われます。 sql.Append(" KEN_ID = '" & @KEN_ID & "'")
補足
回答ありがとうございます @KEN_ID を""からはずすとエラーになってしまいます @KEN_ID自体は文字列で、.AddParameterで変換するので文字列からはずすことはできません・・・ ですが、KEN_IDをシングルコーテーションで囲むのを忘れてました; ありがとうございます
お礼
ありがとうございます ''はすいません 型変換してくれるのでつい忘れてしまいがちです; パラメータ変数を使えば'がついても正常に動作してくれるので便利ですね command.Parameters.itemの中にパラメータが入っていたので、conを受け取ってcommandに入れて、パラメータを出力する方向で決まりました ありがとうございました