我正在尝试创建一个从数据库中读取特定字段的方法。
编译器将数据库tblName
视为@tblName
,而不是传递给方法的参数。其余的sql参数也是如此。
在我看来,编译器忽略了所有cmd.Parameters.AddWithValue()
语句。
似乎SQL查询最终成为:
SELECT [@colTarget] FROM [@tblName] WHERE [@colRef] = @refValue;
而不是类似的东西(我所期待的例子):
SELECT [FirstName] FROM [tblUser] WHERE [Email] = 'abc@gmail.com';
这就是我的目标。
public string selectField(string tblName, string colTarget, string colRef, string refValue)
{
StringBuilder query = new StringBuilder();
query.AppendLine("SELECT [@colTarget] FROM [@tblName] WHERE [@colRef] = @refValue;");
SqlCommand cmd = new SqlCommand(query.ToString(), conn);
cmd.Parameters.AddWithValue("@colTarget", colTarget);
cmd.Parameters.AddWithValue("@tblName", tblName);
cmd.Parameters.AddWithValue("@colRef", colRef);
cmd.Parameters.AddWithValue("@refValue", "'" + refValue + "'");
//open connection and execute query
//close connection
//return field value
}
如果有人能告诉我这些代码出了什么问题我很感激。
答案 0 :(得分:1)
SQL中的参数仅适用于值,而不适用于列或表的标识符。因此,在 if params.has_key?(:task_id)
@task = Task.find(params[:task_id].to_i)
else
@task = Task.new
end
语句中,只有最后一个参数是值。
同时直接指定类型并使用select
属性比Value
更好。检查一下:Can we stop using AddWithValue()
already?
像这样:
AddWithValue
答案 1 :(得分:1)
问题是SQLParameter不能用于表名和列。
您必须直接在字符串中声明'tblName'。
答案 2 :(得分:1)
这样做是为了避免SQL注入攻击https://www.owasp.org/index.php/SQL_Injection。 参数不是内联扩展的,因此您不需要引用字符串。
答案 3 :(得分:1)
您必须自己执行这些替换,类似于以下内容。请注意SQL注入的可能性,但是......
query.AppendLine(string.Format("SELECT {0} FROM {1} WHERE [@colRef] = @refValue;", colTarget, tblName);
我是否提到了SQL注入?另外,作为一个... SQL注入:)
答案 4 :(得分:1)
您只能使用值的参数,而不能替换表或列的名称。您仍然需要进行字符串格式化或连接以创建具有动态表和列名称的SQL查询。
public string selectField(string tblName, string colTarget, string colRef, string refValue)
{
string query = string.Format(
"SELECT {0} FROM {1} WHERE {2} = @refValue;",
colTarget,
tblName,
colRef);
SqlCommand cmd = new SqlCommand(query, conn);
cmd.Parameters.Add("@refValue", SqlDbType.VarChar).Value = refValue;
//open connection and execute query
//close connection
//return field value
}
此外,您不需要在refValue
周围添加单引号,而且最好避免使用AddWithValue
,而是明确指定参数的类型。因此,您可能还需要考虑将colRef
列的类型作为方法的另一个参数。