SqlCommand AddWithValue无法正常工作

时间:2014-04-21 17:20:50

标签: c# sql

我有以下代码块... fieldCount总是返回0。

我怀疑AddWithValue没有正确形成SELECT声明......任何想法为什么?从手表中可以看出,他们(fieldfieldId)具有有效值。

public void deleteRows(string table, string field, string fieldId)
{
    int fieldCount;
     using (SqlCommand command = new SqlCommand(String.Format("SELECT COUNT(*) FROM {0} WHERE @field IN (@fieldId)", table), connection))
    {
        command.Parameters.AddWithValue("@field", field);
        command.Parameters.AddWithValue("@fieldId", fieldId);
        fieldCount = (int)command.ExecuteScalar();
    }
    if (fieldCount > 0)
    {

Debug screen

1 个答案:

答案 0 :(得分:2)

您的代码中有两个错误:

首先,您不能使用参数来表达表名或列名。因此,您的字段参数在此上下文中无效。

其次,您不能使用参数来表示IN子句的整个值集。在您的示例中,参数@fieldID将在

中翻译
WHERE ..... IN ('1,2,3,4')

它将被视为字符串,而不是要包含在您的where上下文中的各个值 -

对于字段部分,,如果您完全确定,传递给您的方法的string field参数不是由您的用户直接输入,那么您可以使用字符串连接表达式(以及您已经为表执行此操作,因此警告也适用于该值)

String.Format("SELECT COUNT(*) FROM {0} WHERE {1} IN (....)", table, field);

对于IN部分,我建议不要传递字符串,而是在调用函数中构建要在查询中添加的参数列表。

public void deleteRows(string table, string field, List<SqlParameter> inParameters)
{

    StringBuilder sb new StringBuilder();
    sb.AppendFormat("SELECT COUNT(*) FROM {0} WHERE {1} IN (", table, field));
    using(SqlCommand cmd = new SqlCommand())
    {
        cmd.Connection = connection;
        // Loop over the parameter list, adding the parameter name to the 
        // IN clause and the parameter to the SqlCommand collection
        foreach(SqlParameter p in inParameters)
        {
            sb.Append(p.Name + ",");
            cmd.Parameters.Add(p);
        }

        // Trim out the last comma
        sb.Length--;
        // Close the IN clause
        sn.Append(")";
        cmd.CommandText = sb.ToString();
        fieldCount = (int)command.ExecuteScalar();
    }

}