2012-03-10 18 views
1

SQLコマンドを作成するために文字列連結を使用しているコードをリファクタリングしようとしています(SQLインジェクションで脆弱になります)。基本的に私がしようとしているのは、すべてのstring sqlToExecute = String.Format(..)ステートメントをSQLコマンドとOleDBパラメータのリストに置き換えることです。複雑なOleDBクエリをパラメータ化する方法は?

これは、String.Format("Select * from myTable where id = {0}", id)のような単純なケースでどのように行うことができるかを理解しています。しかし、私はより複雑なSQLクエリの良い例を見つけることができませんでした。ここで

は私がパラメータ化することができます正確にどのようにわからないクエリの一部です:

1.パラメータは、列名と別名の両方に使用されています。パラメータは、2つの変数で構成されています

selQueryBldr.AppendFormat("SELECT * FROM {0} {1} 
    INNER JOIN ColChange CC ON CC.TableRecordID = {1}.{2} and CC.EntityID='{3}'", 
    entity.StageTableName, stageTableAlias, entity.PrimaryKey, entity.EntityID); 

2.同じパラメータが句

SQLクエリで複数のSQLで使用されます。

 SELECT A.TablePrefix ... 
     FROM Entity E 
     INNER JOIN App A 
     ON A.AppID = E.AppID 
     WHERE E.AppID in (#APPIDS#) 

     UNION 

     SELECT A.TablePrefix ... 
     FROM EntityB EB 
     INNER JOIN App A 
     ON A.AppID = EB.AppID 
     WHERE EB.AppID in (#APPIDS#) 

現在のパラメータをすることで、コードに追加されますString.Replace()メソッドを使用して:

sqlQuery = sqlQuery.Replace("#APPIDS#",idList); 
パラメータ名およびパラメータ値として変数を使用

3:

StringBuilder dataQuery = new StringBuilder("Select * from {0} WHERE {1}='{2}'", 
    tableName, primaryKey[0], changeRow["TableRecordID"]); 

4変数は、Unicodeパラメータの一部を使用する:また

sSQL = string.Format("SELECT name FROM sysobjects WHERE id = object_id(N'[dbo].[{0}]')", 
    sSPName); 


、これらの例はすべてOleDbクラス(OleDbConnection/OleDbCommandなど)を使用しています。したがって、名前付きパラメータが理解できない限り、b eはここで使用されます。

+0

IN節のすべてのパラメータをindividaulyに渡すと、シナリオ#2が動作するように見えます: '...どこのEB.AppIDが(?、?、?)' –

答えて

1

異なるバックエンドでは、名前付きパラメータまたは "?"パラメータのためのプレースホルダは、あなたがどうなるのか、列が文字列を期待している場合は、文字列を確保、

OleDbCommand oCmd = new OleDbCommand(YourConnection, "select * from someTable where yourColumn = ? and otherColumn = ?"); 

oCmd.Parameters.AddWithValue("parm1", YourVariable.FormattedHoweverNeeded); 
oCmd.Parameters.AddWithValue("parm2", anotherVariable.FormattedHoweverNeeded); 

のようなクエリの何かを構築しています。数値(int型、ダブル、フロートなど)を期待している場合、あまりにもそのタイプとして残し、または他の(日付/時間、など)

ただ、注意して...という名前のパラメータを(私が持っているようにやっていない場合は「?」プレースホルダー)と同じ順序でパラメーターを追加する必要があります。 SQLコマンドに置かれます。

+0

DRapp、感謝ですが、私の質問は、私はSQLパラメータをパラメータ化する必要がある場合は、最も簡単です。私の質問は、SQLクエリの他の部分(列/テーブル名、エイリアスなど)をパラメータ化する必要がある場合です。 –