|
|
|
Forum 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, то запрос выполняется штатно. Помогите, пожалуйста, разобраться с проблемой.
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| UPDATE запрос ошибок не содержит, по моему. Скорее всего ошибка в не в нем, а в функции GetCountryID
|
|
|
|
|
Forum Guru
      
участник
Last Login: 16.05.2007 18:38
Сообщ.: 68,
Visits: 382
|
|
| Вроде бы нет... Само значение функция возвращает верно. Я его проверяю выводом в контрол Label, примерно так: my_label.Text = iID_Country.ToString() Значение идентификатора возращается верно. Поэтому я думаю, что какое-то несоответствие типов... Возвращать и объявлять в коде Int32 я тоже пробовал. Результат тот же :-(
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| Значит вообще в другом месте ошибка возникает. SQL же ругается на невозможность сравнения text и varchar. В приведенном запросе нет такого сравнения.
|
|
|
|
|
Forum 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 нормально сравнивать?
|
|
|
|
|
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.
|
|
|
|
|
Forum Guru
      
участник
Last Login: 16.05.2007 18:38
Сообщ.: 68,
Visits: 382
|
|
| Все получилось. Поменял тип text на varchar(MAX). Кстати, МАХ - это сколько? :-) Спасибо за советы!
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
|
|
|
|
Supreme Being
модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240,
Visits: 65 445
|
|
| И кстати параметры все равно лучше использовать даже с этим изменением.
|
|
| |