我有以下功能:
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 方法分析查询参数以查找以 @ 开头的单词,并创建适当的 SqlParameter 对象,这些对象传递到 SqlCommand 对象中。在这种情况下,将创建两个参数。
查询参数将始终由我提供,参数数组可能有来自用户的数据。
我担心因为我是从字符串生成参数名称,所以我可能会在不经意间规避反 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;
}