1

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 のパラメーターを取得できませんでした。

前もって感謝します。

4

1 に答える 1

2

?が予期しないトークンである理由は、句でそれを使用しているためです(ORDER BYこれは許可されていないと思います)。

パラメータを使用する理由は、ユーザー入力のリスクを軽減するためです。クエリを作成するときに、ORDER BYフィールドと方向がユーザー入力を介して取得されていない場合は、連結を使用してクエリを作成しても安全です。

句でのみ使用し?てください:WHERE

OdbcCommand cmd = new OdbcCommand("SELECT * FROM TABLE_NAME WHERE ID = ? ORDER BY " + sortField + " " + sortDirection);
于 2012-04-26T20:46:42.150 に答える