更新SQL表中的行抛出操作数类型冲突错误

时间:2012-03-03 04:10:11

标签: c# sql

您好我的SQL数据库表的更新函数遇到错误。错误是:

Error: Operand type clash: text is incompatible with smallint

我不知道出了什么问题,任何地方都不应该有int类型的值。所有输入都是字符串,表列类型都是文本。更新功能如下:

    public static void UpdateRows(string table, string columnToGet, string columnValueGet, string columnToSet, string columnValueToSet)
{
   try
   {
   SqlConnection connection = new SqlConnection(Global.connectionString);
   string updateString = "UPDATE " + table + " " + "SET " + columnToSet + "=" + columnValueToSet + " WHERE " + columnToGet + "=" + columnValueGet;
   Console.WriteLine(updateString);

   using (SqlCommand cmd = new SqlCommand(updateString, connection))
   {
         connection.Open();
         cmd.Parameters.AddWithValue("@" + columnToSet, "'" + columnValueToSet + "'");
         cmd.Parameters.AddWithValue("@" + columnToGet, "'" + columnValueGet + "'");

         cmd.ExecuteNonQuery();
         connection.Close();
    }

}
catch (SqlException ex)
{
    Console.WriteLine("Error: " + ex.Message);
    throw;
}
}

控制台输出如下字符串:

UPDATE parentDirectory SET Child1ID=50042 WHERE ParentID=10020

然后出现错误。怎么了?我已经尝试为值变量添加“'”字符,然后我得到一个不同的错误。我的插入函数在其他地方以相同的格式排序,它工作正常。请帮忙。

1 个答案:

答案 0 :(得分:2)

列名不应该是参数。通过使参数包含列名列,将列值ValueToSet视为数字。 PS:这看起来像一个鱼腥的设计。 PPS:它还可以打开SQL注入。

public static void UpdateRows(string table, string columnToGet,
             string columnValueGet, string columnToSet, string columnValueToSet)
{
    try
    {
        SqlConnection connection = new SqlConnection(Global.connectionString);
        string updateString =
                   "UPDATE " + table + " " +
                   "SET " + columnToSet   + "= @columnValueToSet " + 
                   "WHERE " + columnToGet + "= @columnValueGet;";
        Console.WriteLine(updateString);

        using (SqlCommand cmd = new SqlCommand(updateString, connection))
        {
            connection.Open();
            cmd.Parameters.AddWithValue("@columnValueToSet", columnValueToSet);
            cmd.Parameters.Add("@columnValueGet", SqlDbType.Text).Value= columnValueGet;
            cmd.ExecuteNonQuery();
            connection.Close();
        }
    }
    catch (SqlException ex)
    {
        Console.WriteLine("Error: " + ex.Message);
        throw;
    }
 }
编辑:正如GarethD指出的那样,关键问题是parentId被定义为Text并且Text和int之间没有转换(varchar和int之间,但不是Text和int)。