0

私の出力クエリは次のようになります。

select * from Calls where CallerID = "User.Name" and Endpoint in ("C,D,V") order by JoinTime desc;

パラメータを含む私のC#クエリ文字列は次のようになります。

string SQLQuery = "select * from Calls where CallerID = @UserName and EndpointType in ({0}) order by JoinTime desc";

パラメータを追加するコードは次のようになります。

...

string[] Endpoints = new string[] {"C","D","V"}; //EXAMPLE string array
string UserNameStr = "User.Name"; //EXAMPLE string UserNameStr value

...

string[] paramNames = Endpoints.Select((s, i) => "@endpoint" + i.ToString()).ToArray();

string inClause = string.Join(",", paramNames);


using (cmd = new MySqlCommand((string.Format(SQL, inClause)),connection))
{
    for (int i = 0; i < paramNames.Length; i++)
    {
        cmd.Parameters.AddWithValue(paramNames[i], Endpoints[i]);
    }
}

cmd.Parameters.Add("@UserName", MySqlDbType.String).Value = UserNameStr;

MySqlDataReader dataReader = cmd.ExecuteReader(); 

...

しかし、出力クエリが次のようになるように別のIN演算子を追加したい場合はどうなりますか。

select * from Calls where CallerID = "User.Name" and Endpoint in ("C","D","V") and ConferenceCall in ("D","C") order by JoinTime desc;

それ、どうやったら出来るの?使用できるLinqの機能はありますか?

4

1 に答える 1

0

初めて行うのと同じ方法:

// endpoints = comma-delimited list of endpoints
// conferenceCalls = comma-delimited list of conference calls

string SQLQuery = "select * from Calls " + 
                  "where CallerID = @UserName and " + 
                  "EndpointType in ({0}) and " + 
                  "ConferenceCall in ({1}) " + 
                  "order by JoinTime desc";

cmd = new MySqlCommand((string.Format(SQL, endpoints, conferenceCalls)),connection);

コメントに記載されているように、SQLインジェクション攻撃を回避するために、文字列を検証することに十分注意してください。コレクションをSQLパラメーターとして渡す直接的な方法はありません。それを行う方法はいくつかありますが(区切り文字列を渡して解析するのが私が見た中で最も一般的です)、値の設定とデータの検証を制御している場合は問題ありません。

于 2013-03-01T22:15:20.537 に答える