アプリ版:「スタンプのみでお礼する」機能のリリースについて

度々お世話になります

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


と書いております

よろしくお願いします

A 回答 (3件)

> ですが、KEN_IDをシングルコーテーションで囲むのを忘れてました;


> ありがとうございます
それはまずい気がする。。。
SqlParameter クラスの中で、SqlDbType に応じて文字列を必要な形式に
変換してくれるはずだから、SQL の本文にシングルコーテーションを
つけると動作が変わってしまいそうに思います。
データにシングルコーテーションを含む場合など、十分にパターンテスト
して確認しておきましょう。

#1の方は SQL 文内の(パラメータ)変数と VB.NET の変数を混同している
ようです。
#2の方が言うようにデータベースにそのまま渡ってから処理されるので
自力で置き換えるか、むしろ CommandText はそのまま出力して、それとは
別に Command.Parameters コレクションをループで回してパラメータの
値を全部書き出せばいいような気もします。

どちらにしろ、Common.DB という自作クラスを前提に質問されても
こちらでは理解できませんので、そのクラスを設計された方に相談して
ください。
    • good
    • 0
この回答へのお礼

ありがとうございます
''はすいません
型変換してくれるのでつい忘れてしまいがちです;
パラメータ変数を使えば'がついても正常に動作してくれるので便利ですね

command.Parameters.itemの中にパラメータが入っていたので、conを受け取ってcommandに入れて、パラメータを出力する方向で決まりました

ありがとうございました

お礼日時:2011/05/20 09:31

Common.DBクラスが何をしているのかわかりませんが,


パラメータを最終的に処理するのはSQL Serverエンジンになります。
# Sql Profilerで確認すると@KEN_IDがそのままエンジンまで届いていることが確認できます。

このため,@KEN_IDがクライアント側で展開されることはありません。
また,エラー処理中でSql.ToString()を出力していますが,
StringBuilderクラスは汎用クラスのため,パラメータを置き換えるような処理は当然ながらありません。

基本的には,
・自力で展開する
・パラメータを別途出力する
のどちらかになると思います。私であれば後者を選択します。
ただし,どうもCommon.DBクラスに処理を委譲しているようなので,Common.DBクラスがこのための処理をある程度代行する必要があると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
DBクラスは、コネクションの接続やSQL実行をしている部分です

DBクラスのconnectionを受け取り、command内のパラメータを出力する方向で決まりました
ありがとうございました

お礼日時:2011/05/20 09:27

> sql.Append(" KEN_ID = @KEN_ID")




変数をダブルクォートの中にいれたら

変数も文字列として扱われます。

sql.Append(" KEN_ID = '" & @KEN_ID & "'")

この回答への補足

回答ありがとうございます

@KEN_ID を""からはずすとエラーになってしまいます
@KEN_ID自体は文字列で、.AddParameterで変換するので文字列からはずすことはできません・・・

ですが、KEN_IDをシングルコーテーションで囲むのを忘れてました;
ありがとうございます

補足日時:2011/05/12 13:31
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!