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