ASP アプリで使用される既存の C# クラスで、"動的な" SQL ビルドをパラメーター化しようとすると問題が発生します。環境は次のとおりです。
- ウィンサーバー 2008
- .NET 3.0
- C#
- DB2 9.x ([IBM][CLI ドライバー][DB2])
既存のコードは、SQL と param 文字列を長い SQL 文字列に連結するだけです。これはもちろん、SQL インジェクションのリスクがあります。これを見るたびに、私はコードを変更してパラメーターを使用する傾向があります。しかし、このコードでは失敗しています。「@」と「?」を試しました。-後者は、ODBCに必要であると私が理解しているものです。
これは、私がコンパイルして実行した簡略化されたコードスニペットです(正しくフォーマットされていない場合は許してください-これが私の最初の質問です):
private DataSet test(String schemaName )
{
String sortField = "TABLE_NAME.COLUMN_NAME";
String sortDirection = "ASC";
OdbcConnection conn = new OdbcConnection();
DataSet ds = new DataSet();
string connStr = ConfigurationManager.AppSettings[schemaName] + dbUser;
try
{
conn.ConnectionString = connStr;
OdbcCommand cmd = new OdbcCommand("SELECT * FROM TABLE_NAME ORDER BY ? ? ");
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add(sortField);
cmd.Parameters.Add(sortDirection);
logger.log("cmd SQL = \t" + cmd.CommandText );
OdbcDataAdapter da = new OdbcDataAdapter(cmd);
da.Fill(ds);
return ds;
}
catch (Exception ex)
{
ex.Data.Add("Location:", "test()");
ex.Data.Add("Connection", conn.ConnectionString);
logger.logException(ex);
throw ex;
}
finally
{
conn.Close();
}
}
ログ出力:
cmd SQL = SELECT * FROM TABLE_NAME ORDER BY ? ?
TABLE_NAME はもちろん、クエリしているテーブルです。
私が見返りに得るのはこれです(一部の独自情報は削除されました:
4/26/2012 12:29:41 PM ERROR [42601] [IBM][CLI Driver][DB2] SQL0104N 予期しないトークン "?" で例外が発生しました "" の後に見つかりました。予想されるトークンには、「MICROSECONDS MICROSECOND SECONDS SECOND MINUTES MINUTE HOURS」が含まれる場合があります。System.Data.Odbc.OdbcConnection.HandleError(OdbcHandle hrHandle, RetCode retcode)Connection Driver={IBM DB2 ODBC DRIVER} での SQLSTATE=42601; .....
これをストアド プロシージャに変更することはできません。
新しいバージョンの .NET へのアップグレードは許可されていません。
ODBC ドライバーの変更/アップグレードは許可されていません。
私が見ているのは、「?」パラメータは置き換えられていません。
AddWithValue() を試し、 Add(OdbcType.VarChar).Value = sortField (またはその効果のあるもの) を試しました。
ここでのグーグル検索と検索はすべて、上記のコードが機能するはずであることを示していますが、これまでのところ、変数で置換された SQL のパラメーターを取得できませんでした。
前もって感謝します。