私は次の機能を持っています:
public DataTable GetRecordSet(String query, string[] parameters)
通常、次のように使用されます。
DataTable dt = GetRecordSet( "select * from objects where ob_id = @obid and ac_id = @acid", new[] { objectId, accountId });
GetRecordSet メソッドは、クエリ パラメーターを解析して @ で始まる単語を検索し、SqlCommand オブジェクトに渡される適切な SqlParameter オブジェクトを作成します。この場合、2 つのパラメーターが作成されます。
クエリ パラメーターは常に私が提供します。パラメーター配列にはユーザーからのデータが含まれる場合があります。
文字列からパラメーター名を生成しているため、SQL インジェクション対策をうっかり回避してしまうのではないかと心配しています。この方法は安全ですか?
更新: GetRecordSet は次のように選択コマンドを取得します。
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = GetSqlCommand(query, parameters);
GetSqlCommand メソッド:
private SqlCommand GetSqlCommand(string query, string[] parameters)
{
SqlCommand sq = new SqlCommand(query, myConnection);
// enum parameters
// get name of parameter from the query string and add it to the SqlCommand
SqlParameter p;
string[] paramNames = query.Split('@');
string name;
int paramCounter = 0;
if (parameters != null)
{
foreach (string param in parameters)
{
paramCounter += 1;
if (param != "")
{
try
{
if (paramNames.Length > paramCounter)
{
name = paramNames[paramCounter].Split(' ')[0];
p = new SqlParameter(name, param);
sq.Parameters.Add(p);
}
}
catch (Exception ex)
{
Console.WriteLine("Error: {0}", ex);
}
}
}
}
return sq;
}