在sql语句中使用非值项的参数

时间:2016-07-14 16:52:34

标签: c# sql tsql parameters

我正在尝试创建一个从数据库中读取特定字段的方法。

编译器将数据库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    
}

如果有人能告诉我这些代码出了什么问题我很感激。

5 个答案:

答案 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列的类型作为方法的另一个参数。