при обновлении строки в таблице SQL выдается ошибка типа операнда Clash - PullRequest
1 голос
/ 03 марта 2012

Здравствуйте! У меня возникла ошибка для функции обновления таблицы базы данных 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 Ответ

2 голосов
/ 03 марта 2012

Имя столбца не должно быть параметром.При включении параметра имя столбца columnValueToSet обрабатывается как число.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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...