Несовпадение типов в запросе к БД
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Несовпадение типов в запросе к БД Expand / Collapse
Автор
Сообщение
16.05.2007 11:53


Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum Guru

участник
Last Login: 16.05.2007 18:38
Сообщ.: 68, Visits: 382
Раньше, под Access запрос выполнялся. Теперь перешел на MS SQL и ... проблема.

Запрос примерно такой:

"UPDATE order_table SET order_name='" + strName + "', " + "order_country = " + iID_Country + " " + "WHERE order_id=" + order_item.DataKeys[objArgs.Item.ItemIndex]

order_country - это поле в таблице заказов, связанное с таблицей стран. В Primary и Foreign таблицах поле имеет тип int.

Код страницы на С#

Переменная iID_Country тоже объявлена как int. Получаю ее из функции:

int GetCountryID(string strCountry), которая по названию страны возвращает ее идентификатор из таблицы стран.

И вот, если пишу так: int iID_Country = GetCountryID(strCountry);

то в результате выполнения запроса получаю ошибку и ответ:

"The data types text and varchar are incompatible in the equal to operator.
.Net SqlClient Data Provider"

Если тупо пишу int iID_Country = 1, то запрос выполняется штатно.

Помогите, пожалуйста, разобраться с проблемой.

Сообщ. #913305
16.05.2007 12:25
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
UPDATE запрос ошибок не содержит, по моему. Скорее всего ошибка в не в нем, а в функции GetCountryID
Сообщ. #913307
16.05.2007 15:16


Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum Guru

участник
Last Login: 16.05.2007 18:38
Сообщ.: 68, Visits: 382
Вроде бы нет... Само значение функция возвращает верно. Я его проверяю выводом в контрол Label, примерно так: my_label.Text = iID_Country.ToString()

Значение идентификатора возращается верно. Поэтому я думаю, что какое-то несоответствие типов...

Возвращать и объявлять в коде Int32 я тоже пробовал. Результат тот же :-(

Сообщ. #913316
16.05.2007 16:02
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Значит вообще в другом месте ошибка возникает. SQL же ругается на невозможность сравнения text и varchar. В приведенном запросе нет такого сравнения.
Сообщ. #913317
16.05.2007 16:42


Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum Guru

участник
Last Login: 16.05.2007 18:38
Сообщ.: 68, Visits: 382
А ведь точно!

В функции GetCountryID(string strCountry) у меня есть запрос:

"SELECT * FROM country WHERE country_name='" + strCountry + "'";

Вот он и приводит к ошибке. Поле country_name в таблице имеет тип text. Вот здесь и собака порылась :-) А какой тип надо применить, чтобы с типом string нормально сравнивать?

Сообщ. #913319
16.05.2007 17:16
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Возможные варианты решения:

1) Использовать параметры

2) Изменить тип колонки country_name с text на varchar нужной длины. Неужели тебе в самом деле нужно чтобы название страны могли иметь длину до 2 Гб? С типом text связана еще одна проблема: его данные хранятся в отдельном месте файла БД, а не в строке данных. Это приводит к лишним затратам при работе с ним, что оправдано при больших объемах данных, но скорее всего не оправдано в твоем.

3) Если п.2) невозможен, то попробуй сделать в запросе явное приведение колонки к типу varchar или самого значения к типу text.

Сообщ. #913320
16.05.2007 17:28


Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum Guru

участник
Last Login: 16.05.2007 18:38
Сообщ.: 68, Visits: 382
Все получилось. Поменял тип text на varchar(MAX). Кстати, МАХ - это сколько? :-)

Спасибо за советы!

Сообщ. #913323
16.05.2007 17:48
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Много. Судя по документации 2^31-1.
Сообщ. #913330
16.05.2007 17:49
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
И кстати параметры все равно лучше использовать даже с этим изменением.