Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.08.2015, 15:12   #1
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию Delphi + SQL + кириллица

Всем доброго времени суток!

Суть проблемы: имеется запрос, в котором идет сравнение значений со значениями на кириллице, но он не хочет работать. Знаю, что вся загвоздка в кириллице и да, знаю, что не рекомендуется вовсе использовать кириллицу, но бд, с которой я работаю - создана не мной и ее менять не будут.
Примерно такой запрос:
Код:
SELECT inId FROM [Тяжмаш].[dbo].[vwTypesAndTypes]
where stParentType = 'Маршрут' and stChildType <> 'Элемент маршрута'
Как правильно использовать значения для сравнения на кириллице? Подскажите, пожалуйста.

Пробовал так - не выходит.
Код:
ADOQuery1.Parameters.ParamByName('s1').value := 'Маршрут';
ADOQuery1.Parameters.ParamByName('s2').value := 'Элемент маршрута';
nactyx вне форума Ответить с цитированием
Старый 24.08.2015, 15:22   #2
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

чё то я совсем не понял что нужно сделать в в приведённом коде
1. SELECT inId FROM - выбирает только поле inId (скорее всего целое)
2. какие строки должны сравниваться и где, если см. п 1
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 24.08.2015, 15:30   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
SELECT inId FROM [Тяжмаш].[dbo].[vwTypesAndTypes]
where :s1= "Маршрут" and :s2 <> "Элемент маршрута"
И кириллица тут ни при чем. Ты просто неверно запрос составил )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.08.2015, 15:38   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Автор, а что за структура таблицы, покажи
Цитата:
Stilet
Абракадабристо как-то
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.08.2015, 15:46   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Абракадабристо как-то
Студенты не ищут легких путей
Да и действительно кириллица в БД не приводит к краху. К краху приводит неправильное ее использование. Просто с кириллическими названиями объектов путаются чаще чем с латинскими.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.08.2015, 15:51   #6
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Код:
SELECT inId FROM [Тяжмаш].[dbo].[vwTypesAndTypes]
where :s1= "Маршрут" and :s2 <> "Элемент маршрута"
Не то совсем. Мне нужно, чтобы значение ячейки столбца stParentType равнялось конкретной строке "Маршрут", а значение ячейки столбца stChildType было не равно строке "Элемент маршрута". В SQL Server Management Studio все отрабатывает как надо. Занимаюсь выводом результата запроса в Excel - столкнулся с такой проблемой.

Вот в таком случае все хорошо, сравнил с единицей. А в случае с кириллицей - не удается.
Код:
SELECT 1 FROM [Тяжмаш].[dbo].[uit_vwTechProc] c
	      [Тяжмаш].[dbo].[uit_ActiveTP] b
where b.idTP = c.idTP and active = 1 and a.idElm = c.idElm

Последний раз редактировалось nactyx; 24.08.2015 в 15:57.
nactyx вне форума Ответить с цитированием
Старый 24.08.2015, 15:57   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
но он не хочет работать
В чем это не хотение выражается - ошибка или возвращает не то, что хочется?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 24.08.2015, 16:01   #8
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Видимо куском запроса не удастся отделаться, т.к. друг друга не понимаем.
Код:
33 ADOQuery1.SQL.Clear;
34 ADOQuery1.SQL.Add('SELECT p._PRODUCT, v.value, e.stValue');
35 ADOQuery1.SQL.Add('FROM [Тяжмаш].[dbo].[uit_vwTechProc] a,');
36 ADOQuery1.SQL.Add('     [Тяжмаш].[dbo].[stLinks] b,');
37 ADOQuery1.SQL.Add('     [Тяжмаш].[dbo].[vwObjects] c,');
38 ADOQuery1.SQL.Add('     [Тяжмаш].[dbo].[stLinks] d,');
39 ADOQuery1.SQL.Add('     [Тяжмаш].[dbo].[vwObjects] p,');
40 ADOQuery1.SQL.Add('     [Тяжмаш].[dbo].[rvwAttributes] v,');
41 ADOQuery1.SQL.Add('     [Тяжмаш].[dbo].[vwAttrValues] e');
42 ADOQuery1.SQL.Add('where not exists ( SELECT 1 FROM [Тяжмаш].[dbo].[uit_vwTechProc] c,');
43 ADOQuery1.SQL.Add('                   [Тяжмаш].[dbo].[uit_ActiveTP] b');
44 ADOQuery1.SQL.Add('                   where b.idTP = c.idTP and active = 1');
45 ADOQuery1.SQL.Add('                   and a.idElm = c.idElm');
46 ADOQuery1.SQL.Add('                 )');
47 ADOQuery1.SQL.Add('  and a.idElm = b.inIdChild');
48 ADOQuery1.SQL.Add('  and b.inIdParent = c._ID and c._TYPE = 'Маршрут'');
49 ADOQuery1.SQL.Add('  and c._ID =d.inIdParent and d.inIdTypeRel in ( SELECT inId FROM [Тяжмаш].[dbo].[vwTypesAndTypes]');
50 ADOQuery1.SQL.Add('                                                 where stParentType = 'Маршрут' and stChildType <> 'Элемент маршрута'');
51 ADOQuery1.SQL.Add('                                               )');
52 ADOQuery1.SQL.Add('  and d.inIdChild = p._ID');
53 ADOQuery1.SQL.Add('  and d.inIdChild = v.idversion and v.idattr = 2');
54 ADOQuery1.SQL.Add('  and a.idElm = e.inIdVersion and e.inIdAttribute = 162');
55 ADOQuery1.Active := True;
Сперва на уровне делфи:
[DCC Error] Unit1.pas(48): E2029 ')' expected but identifier 'Маршрут' found
[DCC Error] Unit1.pas(48): E2029 'END' expected but string constant found
В строке:
Код:
ADOQuery1.SQL.Add('  and b.inIdParent = c._ID and c._TYPE = 'Маршрут'');

Последний раз редактировалось nactyx; 24.08.2015 в 16:06.
nactyx вне форума Ответить с цитированием
Старый 24.08.2015, 16:05   #9
nactyx
Форумчанин
 
Регистрация: 11.10.2010
Сообщений: 152
По умолчанию

Дописываю к коду:
Код:
ADOQuery1.Parameters.ParamByName('s1').value := 'Маршрут';
ADOQuery1.Parameters.ParamByName('s2').value := 'Элемент маршрута';
Меняю обращение:
Код:
ADOQuery1.SQL.Add('  and b.inIdParent = c._ID and c._TYPE = :s1');
и
Код:
ADOQuery1.SQL.Add('                                                 where stParentType = :s1 and stChildType <> :s2');
Выдает ошибку:
Неправильно определен объект Parameter. Предоставлены несогласованные или неполные сведения.
nactyx вне форума Ответить с цитированием
Старый 24.08.2015, 16:07   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Ошибка с выделением слова Маршрут!

Вы же строку ЗАКАНЧИВАЕТЕ.

везде, где есть слово Маршрут попробуйте в двойные кавычки обрамить:
Код:
ADOQuery1.SQL.Add('  and b.inIdParent = c._ID and c._TYPE = '+QuotedStr('Маршрут'));
ADOQuery1.SQL.Add('  and c._ID =d.inIdParent and d.inIdTypeRel in ( SELECT inId FROM [Тяжмаш].[dbo].[vwTypesAndTypes]');
ADOQuery1.SQL.Add('                                                 where stParentType = '+QuotedStr('Маршрут')+' and stChildType <> '+QuotedStr('Элемент маршрута'));
...
ошибка понятна?
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
IdMultipartFormData и кириллица Delphi 2010 Shouldercannon Работа с сетью в Delphi 6 21.04.2013 21:00
SQL и кириллица GenniY БД в Delphi 11 01.11.2012 17:02
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26