Проблема с SQLQuery кирилица в тексе запроса.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Проблема с SQLQuery кирилица в тексе запроса.

Сообщение jsa » 30.11.2017 18:10:05

Подскажите пожалуйста, как забороть проблему.
Код: Выделить всё
SQLQuery1.SQL.Text:='insert into Table (ID, Fam, Im, Ot) select 1, '+#39+'Иванов'+#39+' , '+#39+'Иван'+#39+' , '+#39+'Иванович'+#39


Выполнение вылетает с ошибкой.
В профайлере обнаруживается обрывок запроса
Код: Выделить всё
insert into Table (ID, Fam, Im, Ot) select 1, '

т.е. обрыв на первом символе Кириллицы.
В Delphi7 проблемы с кодировкой ни разу не встречал, как с такой проблемой в Lazarus работают?
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: Проблема с SQLQuery кирилица в тексе запроса.

Сообщение vitaly_l » 30.11.2017 18:30:26

jsa писал(а):Подскажите пожалуйста, как забороть проблему.
КОД: ВЫДЕЛИТЬ ВСЁ
SQLQuery1.SQL.Text:='insert into Table (ID, Fam, Im, Ot) select 1, '+#39+'Иванов'+#39+' , '+#39+'Иван'+#39+' , '+#39+'Иванович'+#39

:shock: :arrow: select :?:

А так?
Код: Выделить всё
SQLQuery1.SQL.Text:='INSERT INTO `Table` (ID, Fam, Im, Ot) VALUES (1, ''Иванов'', ''Иван'', ''Иванович'') ;';

Или так?
Код: Выделить всё
SQLQuery1.SQL.Text:='INSERT INTO `Table` (ID, Fam, Im, Ot) VALUES (1, '#39'Иванов'#39', '#39'Иван'#39', '#39'Иванович'#39') ;';
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Проблема с SQLQuery кирилица в тексе запроса.

Сообщение jsa » 30.11.2017 20:07:48

:shock: :arrow: select :?:

Стандартная конструкция в T-SQL
А так? Или так?

Суть не в расстановке апострофов, а в кодировке. Если заменить на Ivanov Ivan Ivanovich , то всё работает без проблем.
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: Проблема с SQLQuery кирилица в тексе запроса.

Сообщение Лекс Айрин » 30.11.2017 20:38:46

jsa, так подбери. Есть подозрение, что в проге utf8 а в базе cp1251. Кажется, даже, что при запросе можно выбрать нужную кодировку.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Проблема с SQLQuery кирилица в тексе запроса.

Сообщение vitaly_l » 30.11.2017 21:16:42

jsa писал(а):а в кодировке

SET NAMES utf8 <= ?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Проблема с SQLQuery кирилица в тексе запроса.

Сообщение jsa » 01.12.2017 10:39:32

Нагуглил наконец на этом же форуме.
Только UTF8ToWinCP не сработало.
Сработало
SQLQuery1.SQL.Text := UTF8ToAnsi( 'insert into Table (ID, Fam, Im, Ot) select 1, '+#39+'Иванов'+#39+' , '+#39+'Иван'+#39+' , '+#39+'Иванович'+#39 );

Uses LazUTF8 выдавал ошибку
тут viewtopic.php?f=5&t=11363#p101666 нашел как подключить
Проект -> Инспектор проекта -> Правый клик по Требуемые пакеты -> Добавить -> ищем в Имя пакета LazUtils -> Создать новую зависимость.
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: Проблема с SQLQuery кирилица в тексе запроса.

Сообщение wadman » 01.12.2017 12:40:45

Параметры нынче не кошерно применять?
Много проблем получается с ними избежать.
wadman
постоялец
 
Сообщения: 122
Зарегистрирован: 18.10.2016 15:54:28

Re: Проблема с SQLQuery кирилица в тексе запроса.

Сообщение Лекс Айрин » 01.12.2017 13:13:06

jsa писал(а):Проект -> Инспектор проекта -> Правый клик по Требуемые пакеты -> Добавить -> ищем в Имя пакета LazUtils -> Создать новую зависимость.


По возможности, аккуратнее с этой возможностью. Иначе потом могут выйти ошибки дублирования путей. Вообще, должно добавляться автоматически, когда добавляешь пакет в uses.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Проблема с SQLQuery кирилица в тексе запроса.

Сообщение jsa » 01.12.2017 16:12:00

wadman писал(а):Параметры нынче не кошерно применять?
Много проблем получается с ними избежать.

Не кошерно, не халяльно и просто не годно.
По моему опыту, с параметрами куда больше проблем появляется чем они позволяют решать.
В одном проекте помню, так задолбался с типами и их не соответствием, что решил просто более никогда не пользоваться.
Особенно проблем доставляли дробные числа которые просто теряли точность, и даты которые никогда без плясок с бубном не соответствовали нужному формату.
(но это отступление от темы).
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: Проблема с SQLQuery кирилица в тексе запроса.

Сообщение alexs » 01.12.2017 17:53:37

jsa писал(а):В одном проекте помню, так задолбался с типами и их не соответствием, что решил просто более никогда не пользоваться.

Вот комп говорит - не стреляй в ногу. Но - всё равно СМОГЁМ!
Собирать вот так запросы - очень опасно. Самое первое, что приходит в голову, SQL инекции.
Ну и прочее.
Есть же нормальный метод работы с данными - Query + DataSourse + DBEdit. Зачем свой велосипед писать?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4051
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Проблема с SQLQuery кирилица в тексе запроса.

Сообщение jsa » 01.12.2017 18:35:27

Меня всегда удивляют менторы, который приходят в тему только чтобы показать свой гений.
Не вникая в суть вопроса. И считая себя умнее всех остальных.
И да, менторы (с гением), за реальный код принимают сляпанные на скорую руку приводимые примеры (сляпанные чисто для иллюстрации проблемы), и на их основе оценивают умение и способность того кого поучают.
У меня консольное приложение там нет никаких DataSourse + DBEdit, а в реальности вставляется строка с автоматически сгенерированным комментарием.

Если серьезно, и я действительно стреляю себе в ногу, можете показать как можно что-то инъектнуть в собираемый текст запроса без параметров, и чем запрос с параметрами безопаснее?

Добавлено спустя 6 минут 31 секунду:
Лекс Айрин писал(а):Вообще, должно добавляться автоматически, когда добавляешь пакет в uses.

Появилась ошибка, поэтому нашел такое решение.
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: Проблема с SQLQuery кирилица в тексе запроса.

Сообщение Лекс Айрин » 01.12.2017 19:11:47

jsa писал(а):Меня всегда удивляют менторы, который приходят в тему только чтобы показать свой гений.


Если что, то он один из разрабов Лазаруса, так что он реально может помочь. Станет ли он это делать теперь большой вопрос. Причем, он очень много работает с БД.

jsa писал(а):Появилась ошибка, поэтому нашел такое решение.


Это очень плохо. Значит, где-то при сборке/компиляции/настройке среды (или проекта, но я бы в первую очередь проверил лазарус и компилятор) допущена ошибка. И как минимум еще раз ошибка вылетит.

jsa писал(а):И да, менторы (с гением), за реальный код принимают сляпанные на скорую руку приводимые примеры (сляпанные чисто для иллюстрации проблемы), и на их основе оценивают умение и способность того кого поучают.


Здесь как бы принято давать реальный код. Причем, иногда полностью весь проект. А так как телепатов мало, то приходится смотреть то, что дают.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Проблема с SQLQuery кирилица в тексе запроса.

Сообщение vitaly_l » 01.12.2017 19:40:19

jsa писал(а):Меня всегда удивляют менторы, который приходят в тему только чтобы показать свой гений.
Не вникая в суть вопроса. И считая себя умнее всех остальных.
И да, менторы (с гением), за реальный код принимают сляпанные на скорую руку приводимые примеры (сляпанные чисто для иллюстрации проблемы), и на их основе оценивают умение и способность того кого поучают.
У меня консольное приложение там нет

Я вообще не люблю обучать и поучать программистов, т.к. они слишком часто заблуждаются из-за неправильного образования. И если уж говорить о гениальности (в вопросах SQL запросов), и даже с учётом того что у Вас консольное приложение, то Вы должны ясно понимать, что базы данных - не всегда бывают в Ansi кодировке. Соответственно, наиболее оптимальным решением является указание базе данных, перед запросом, в какой кодировке ей принимать SQL-запрос, а не декодирование SQL-запроса в Ansi. Иначе, при смене кодировки в базе или при подключении к другой базе - приложение уже не сможет работать с базой.

Кроме того, не забывайте, что форум общий и этот топик будут читать многие плохо обученные программисты. Соответственно совет alexs, так или иначе будет востребован (наверно не Вами, но кем-то другим). И уверен, они скажут спасибо alexs, т.к. по вышеизложенным причинам - Ваше решение далеко от правильного, хотя и будет работать в частном случае. ИМХО

PS: можете называть меня злобным ментором, но я это делаю ради того, чтобы меньше падало самолётов и прочих поломок автопилотов из-за некомпетентного программирования, а не ради показа гениальности, т.к. понятие "гениальность" придумали ради получения халявы на халяву.
.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Проблема с SQLQuery кирилица в тексе запроса.

Сообщение jsa » 02.12.2017 04:48:31

Лекс Айрин писал(а):Если что, то он один из разрабов Лазаруса, так что он реально может помочь. Станет ли он это делать теперь большой вопрос. Причем, он очень много работает с БД.

Разработчикам Lazarus-а премногия благодарности. Но от помощи в виде попреканий - "стрельба в ногу", и "изобретение" велосипеда" всем лучше воздерживаться. Не помощь это, а сарказм.

Лекс Айрин писал(а):
jsa писал(а):Появилась ошибка, поэтому нашел такое решение.

Это очень плохо. Значит, где-то при сборке/компиляции/настройке среды (или проекта, но я бы в первую очередь проверил лазарус и компилятор) допущена ошибка. И как минимум еще раз ошибка вылетит.
[/quote]
Я на этом же форуме нашел как подключить LazUTF8 и просто его скопировал. Много вы знаете людей которые "проверяют лазарус и компилятор"? Я и сам не умею это колдунство и в среди знакомых нет специалистов.

Лекс Айрин писал(а):Здесь как бы принято давать реальный код. Причем, иногда полностью весь проект. А так как телепатов мало, то приходится смотреть то, что дают.
Очень странно тут принято. Я не вижу смысла, давать весь текст запроса, только для того чтобы проиллюстрировать и так понятный вопрос.

Добавлено спустя 1 час 33 минуты:
Я вообще не люблю обучать и поучать программистов
я как и многие пользователи Delphi/Lazarus по образованию не программист, самоучка-недоучка.

базы данных - не всегда бывают в Ansi кодировке. Соответственно, наиболее оптимальным решением является указание базе данных, перед запросом, в какой кодировке ей принимать SQL-запрос, а не декодирование SQL-запроса в Ansi.

Это так, вот только не могу найти как это сделать в MS SQL , среди параметров SET нет такого чтобы можно было установить кодировку на сессию. А в данной ситуации утилита делается для конкретной базы, так что проблема универсальности не стоит.
можете называть меня злобным ментором, но я это делаю ради того, чтобы меньше падало самолётов и прочих поломок автопилотов из-за некомпетентного программирования, а не ради показа гениальности
Отличная мотивация. При хорошей мотивации, хорошие методы, тогда будет хороший результат. Презрительно брошенные заявления о самостреле в ногу и изобретении велосипеда, метод бесполезный.
т.к. понятие "гениальность" придумали ради получения халявы на халяву.
не понял мысль.
jsa
постоялец
 
Сообщения: 261
Зарегистрирован: 28.11.2017 13:46:04

Re: Проблема с SQLQuery кирилица в тексе запроса.

Сообщение Лекс Айрин » 02.12.2017 09:33:46

jsa писал(а): Но от помощи в виде попреканий - "стрельба в ногу", и "изобретение" велосипеда" всем лучше воздерживаться. Не помощь это, а сарказм.


Вот ты раз на десятый вопишь от раздражения... а у него таких споров было на порядки больше. И он не попрекал. Он констатировал. Это реально стрельба в ногу и велосипед. Причем, я столько таких велосипедов в своей проге убрал, что даже страшно становится... а потом еще больше, после переделки проги в модульную. А как подумаю сколько еще не увидел.


jsa писал(а): Много вы знаете людей которые "проверяют лазарус и компилятор"? Я и сам не умею это колдунство и в среди знакомых нет специалистов.


Не поверишь. На ЭТОМ форуме таких половина как минимум. Да и остальные знают как это сделать. Тебе же не надо по коду шастать -- просто проверить/пересчитать настройки.

jsa писал(а):Очень странно тут принято. Я не вижу смысла, давать весь текст запроса, только для того чтобы проиллюстрировать и так понятный вопрос.


В этот то вся и проблема... в мелочах. Ко мне, например, даже по удаленке заходили, когда надо было проверить. Поверь, твой код других интересует только как сборник рецептов и справка.

jsa писал(а): А в данной ситуации утилита делается для конкретной базы, так что проблема универсальности не стоит.


Пропущено одно слово. -- "пока". Потом захочется, но будет поздно.

jsa писал(а):При хорошей мотивации, хорошие методы, тогда будет хороший результат.


Вообще-то мотивация у тебя есть. Тебе предложили подумать и пошукать в справке/примерах.

jsa писал(а):Я на этом же форуме нашел как подключить LazUTF8 и просто его скопировал.

Мало просто тупо скопировать -- надо понять зачем и почему что-то делается. Указанный механизм нужен для подключения внешних невизуальных пакетов. Стандартные должны подключаться Лазарусом, т. к. все его компоненты располагаются по стандартным четко прописанным путям.
И, кстати, неизвестно что еще не подключилось. В этом случае проще всего переустановить компилятор, среду и сформировать проект заново. Гемор еще тот, если честно. Надеюсь, что не все так страшно. (мне приходилось делать после бездумного подключения зависимостей -- больше неохота)
Если тебе необходимо что-то странное, то стоит сначала скопировать файл пакета к себе в проект и работать с "локальной копией", тогда в случае проблем измененный вариант удаляется и используется стандартный.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google Adsense [Bot] и гости: 14

Рейтинг@Mail.ru