我有以下代码块... fieldCount
总是返回0。
我怀疑AddWithValue
没有正确形成SELECT
声明......任何想法为什么?从手表中可以看出,他们(field
,fieldId
)具有有效值。
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)
{
答案 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();
}
}