Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Delphi, firebird, fibplus, русские буквы в параметрах запроса

Дмитрий Золотарев Профи (687), на голосовании 10 лет назад
Так соединяемся с базой: FIBDB.DBParams.Values['lc_ctype'] := 'WIN1251';

Имеется вот такой запрос:
with DM.RunFIBSQL do
begin
SQL.Clear;
SQL.Add('update SPBASEGROUPS set SOLIDTEXT=coalesce(SOLIDTEXT, '''')||:ST where ');
SQL.Add('((NAME) CONTAINING :LATEXT) and ');
SQL.Add('((COALESCE(SOLIDTEXT, '''')) NOT CONTAINING :LATEXT)');
ParamByName('ST').AsString := dlgEditGroupSolid.LB.Items[i-1]+#13#10;
ParamByName('LATEXT').AsString := dlgEditGroupSolid.LB.Items[i-1];
ExecQuery;
end;

Он дописывает в поле (SOLIDTEXT) фразу, если другое поле (NAME) эту фразу содержит (в нем для ListBox собирается перечень некоторых фраз, поэтому в тексте
#13#10
). SOLIDTEXT - это BLOB sub_type 1 segment size 32 COLLATE WIN1251
В чем проблема. Запрос в IBExpert работает. Появляется диалог с запросом параметров, вписываю, например "1000 в" - все срабатывает. Из программы не работает. Точнее, если написать "1000" - то срабатывает, а "1000 в" - уже не срабатывает. Если исправить:
SQL.Add('((NAME) CONTAINING '''+dlgEditGroupSolid.LB.Items[i-1]+''') and ');
SQL.Add('((COALESCE(SOLIDTEXT, '''')) NOT CONTAINING '''+dlgEditGroupSolid.LB.Items[i-1]+''')');

То начинает срабатывать, но так оставлять нельзя. Подозрение падает в сторону всяких там Ansi, Unicode и прочих локалайзов, но не знаю куда копать. В других местах, где используется русский текст, все работает, параметры нормально передаются.
Голосование за лучший ответ
Алексей Кузьминов Мудрец (11132) 10 лет назад
Попробуйте проконтролировать тип передаваемых параметров: ParamByName('LATEXT').DataType.
Для нормальной передачи строк рекомендую использовать ftWideString (присвоить заранее) и ParamByName('LATEXT').AsWideString
Возможно потребуется извратить запрос, чтобы Unicode преобразовать в WIN1251 явно.
Надеюсь, поможет.
Похожие вопросы