
度々お世話になります
Windows7、VB2010(Windowsフォーム)、SQL Server で開発し、XPと7で画面を動かします
今、SQLでパラメータを使っており、エラー処理で困っております
SQLのパラメータの内容が表示されない(SQLが、「~~~~ WHERE KEN_ID = @KEN_ID」そのままになり、「~~~~ KEN_ID = '01'」等にならない)
です
Dim sql As New StringBuilder
Dim ds As DataSet
Using con As New Common.DB(Common.Values.ConnectionString)
Try
sql.Append("SELECT KEN_NAM FROM KEN_M")
sql.Append(" WHERE")
sql.Append(" KEN_ID = @KEN_ID")
con.ClearParameter()
con.AddParameter("KEN_ID", strKenName)
ds = con.GetDataSet(sql.ToString)
Return dt
Catch ex As Exception
'Throw New Exception(ex.ToString & vbCrLf & sql.ToString)
MsgBox("県取得処理" & vbcrlf & Sql.Tostring)
End Try
End Using
---- ↓ 別プロジェクト ↓ ---
Public Function GetDataSet(ByVal sql As String) As DataSet
Command.CommandText = sql
If String.IsNullOrEmpty(Command.CommandText) Then
Throw New Exception("SQLが指定されていません")
End If
Dim adapter As New SqlDataAdapter(Command)
Try
adapter.Fill(ds)
Return ds
Catch ex As Exception
Throw New Exception("DataSetオブジェクトの取得に失敗しました。", ex)
End Try
と書いております
よろしくお願いします
No.3ベストアンサー
- 回答日時:
> ですが、KEN_IDをシングルコーテーションで囲むのを忘れてました;
> ありがとうございます
それはまずい気がする。。。
SqlParameter クラスの中で、SqlDbType に応じて文字列を必要な形式に
変換してくれるはずだから、SQL の本文にシングルコーテーションを
つけると動作が変わってしまいそうに思います。
データにシングルコーテーションを含む場合など、十分にパターンテスト
して確認しておきましょう。
#1の方は SQL 文内の(パラメータ)変数と VB.NET の変数を混同している
ようです。
#2の方が言うようにデータベースにそのまま渡ってから処理されるので
自力で置き換えるか、むしろ CommandText はそのまま出力して、それとは
別に Command.Parameters コレクションをループで回してパラメータの
値を全部書き出せばいいような気もします。
どちらにしろ、Common.DB という自作クラスを前提に質問されても
こちらでは理解できませんので、そのクラスを設計された方に相談して
ください。
ありがとうございます
''はすいません
型変換してくれるのでつい忘れてしまいがちです;
パラメータ変数を使えば'がついても正常に動作してくれるので便利ですね
command.Parameters.itemの中にパラメータが入っていたので、conを受け取ってcommandに入れて、パラメータを出力する方向で決まりました
ありがとうございました
No.2
- 回答日時:
Common.DBクラスが何をしているのかわかりませんが,
パラメータを最終的に処理するのはSQL Serverエンジンになります。
# Sql Profilerで確認すると@KEN_IDがそのままエンジンまで届いていることが確認できます。
このため,@KEN_IDがクライアント側で展開されることはありません。
また,エラー処理中でSql.ToString()を出力していますが,
StringBuilderクラスは汎用クラスのため,パラメータを置き換えるような処理は当然ながらありません。
基本的には,
・自力で展開する
・パラメータを別途出力する
のどちらかになると思います。私であれば後者を選択します。
ただし,どうもCommon.DBクラスに処理を委譲しているようなので,Common.DBクラスがこのための処理をある程度代行する必要があると思います。
ありがとうございます。
DBクラスは、コネクションの接続やSQL実行をしている部分です
DBクラスのconnectionを受け取り、command内のパラメータを出力する方向で決まりました
ありがとうございました
No.1
- 回答日時:
> sql.Append(" KEN_ID = @KEN_ID")
変数をダブルクォートの中にいれたら
変数も文字列として扱われます。
sql.Append(" KEN_ID = '" & @KEN_ID & "'")
この回答への補足
回答ありがとうございます
@KEN_ID を""からはずすとエラーになってしまいます
@KEN_ID自体は文字列で、.AddParameterで変換するので文字列からはずすことはできません・・・
ですが、KEN_IDをシングルコーテーションで囲むのを忘れてました;
ありがとうございます
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python3 各引数の意味と、引数...
-
LV_ITEM構造体のメンバlParamに...
-
DirectInputが上手く動きません;
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
レコード件数の表示
-
オブジェクト参照がオブジェク...
-
変数名の付け方
-
複数のクラスで共通した関数を...
-
c++,ある関数のクラスから別の...
-
JSPで<SELECT>の中にDBから持っ...
-
EXCEL VBAにて動的にCheckBOXを...
-
Fileの読み取り専用の解除
-
VBScriptからストアドプロシー...
-
Timestamp型への変換について(J...
-
servletからjspへオブジェクト...
-
ワードで画像をドロップすると...
-
VBPをダブルクリックするとたま...
-
Java初級 引数に適用できません
-
VB.Net Object型 空かどうか
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MFCで水平スクロールバー
-
4バイト整数を使っているため
-
Varianntメモリリークについて
-
SQL パラメーターの表示について
-
DirectInputが上手く動きません;
-
DirectX C++/CLIで作成したDLL...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
レコード件数の表示
-
private static という変数の修飾
-
変数名の付け方
-
複数の変数を宣言する時、同時...
-
僕の出身中学校は200人同級生が...
-
インスタンス参照でアクセスで...
-
Java初級 引数に適用できません
-
配列のメソッド
-
今日は こどもの日 で、良い天...
-
mainメソッドのthrows節で設定...
-
生成したインスタンスを削除す...
-
VB.NETでフォーム上にExcelのよ...
おすすめ情報