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

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

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

jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

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

Сообщение jsa »

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

Код: Выделить всё

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 работают?
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

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') ;'; 
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

:shock: :arrow: select :?:

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

Суть не в расстановке апострофов, а в кодировке. Если заменить на Ivanov Ivan Ivanovich , то всё работает без проблем.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

jsa, так подбери. Есть подозрение, что в проге utf8 а в базе cp1251. Кажется, даже, что при запросе можно выбрать нужную кодировку.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

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

SET NAMES utf8 <= ?
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

Нагуглил наконец на этом же форуме.
Только 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 -> Создать новую зависимость.
wadman
постоялец
Сообщения: 122
Зарегистрирован: 18.10.2016 14:54:28
Контактная информация:

Сообщение wadman »

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

Сообщение Лекс Айрин »

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


По возможности, аккуратнее с этой возможностью. Иначе потом могут выйти ошибки дублирования путей. Вообще, должно добавляться автоматически, когда добавляешь пакет в uses.
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

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

Не кошерно, не халяльно и просто не годно.
По моему опыту, с параметрами куда больше проблем появляется чем они позволяют решать.
В одном проекте помню, так задолбался с типами и их не соответствием, что решил просто более никогда не пользоваться.
Особенно проблем доставляли дробные числа которые просто теряли точность, и даты которые никогда без плясок с бубном не соответствовали нужному формату.
(но это отступление от темы).
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

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

Вот комп говорит - не стреляй в ногу. Но - всё равно СМОГЁМ!
Собирать вот так запросы - очень опасно. Самое первое, что приходит в голову, SQL инекции.
Ну и прочее.
Есть же нормальный метод работы с данными - Query + DataSourse + DBEdit. Зачем свой велосипед писать?
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

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

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

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

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

Сообщение Лекс Айрин »

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


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

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


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

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


Здесь как бы принято давать реальный код. Причем, иногда полностью весь проект. А так как телепатов мало, то приходится смотреть то, что дают.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

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

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

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

PS: можете называть меня злобным ментором, но я это делаю ради того, чтобы меньше падало самолётов и прочих поломок автопилотов из-за некомпетентного программирования, а не ради показа гениальности, т.к. понятие "гениальность" придумали ради получения халявы на халяву.
.
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

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

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

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

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

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

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

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

Это так, вот только не могу найти как это сделать в MS SQL , среди параметров SET нет такого чтобы можно было установить кодировку на сессию. А в данной ситуации утилита делается для конкретной базы, так что проблема универсальности не стоит.
можете называть меня злобным ментором, но я это делаю ради того, чтобы меньше падало самолётов и прочих поломок автопилотов из-за некомпетентного программирования, а не ради показа гениальности
Отличная мотивация. При хорошей мотивации, хорошие методы, тогда будет хороший результат. Презрительно брошенные заявления о самостреле в ногу и изобретении велосипеда, метод бесполезный.
т.к. понятие "гениальность" придумали ради получения халявы на халяву.
не понял мысль.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

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


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


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


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

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


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

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


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

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


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

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

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