Создание правильной SQL-строки

Вопросы программирования и использования MSEide + MSEgui.

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

Ответить
t-ea
новенький
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

Создание правильной SQL-строки

Сообщение t-ea »

Есть ли в mse (или в fpc) стандартная функция которая из поданной ей на вход простой строки формирует синтаксически правильную SQL-строку, то есть дублирует кавычки/апострофы, экранирует escape-символы и т.п.?
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

1) sql_str:= tmsesqlquery.fieldtosql(tmse{type}field);
2) sql_str:= tmse{type}field.assql;

Ессно, адаптирповано под синтаксис кокретного БД-сервера.
Из опыта : вариант 1) надежнее.

ПС:
Для записи BLOB-значений "голый" SQL-не проканает - придется "заливать" бинарные данные через параметрический SQL-запроc.
t-ea
новенький
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

Сообщение t-ea »

Нет, у меня строки читаются из файла а не из DB-полей, и сейчас столкнулся с такой ситуацией, что в некоторых строках содержится много обратных сплешей с апострофами. Пока написал свою функцию, но она просто удваивает встречающиеся служебные символы.
Хотелось бы пользоваться стандартными функциями если они есть.

P.S.: А чем .asSQL ненадёжна? А то для формирования строки из полей я использую именно её.
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Ну тогда самописка под кокретный синтаксис, хотя в принципе можно взять за прототип код вышеуказанных функций.

P.S.: А чем .asSQL ненадёжна?

Во млин, не помню уже - вроде был какой-то прикол и Мартин вариант 1) посоветовал тогда :)

А то для формирования строки из полей я использую именно её.

Для строк она подходит, но вот для других типов есть зависимости от сервера, например :
1) BOOLEAN= 't'/'f' (PostgreSQL), 1/0(SQlite3)
2) NUMERIC/BCD = value*10000 (SQlite3)
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

t-ea
а параметизированные запросы не помогут ? или у тебя в файле готовый SQL запрос ?
t-ea
новенький
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

Сообщение t-ea »

Оказавается что это скорее всего из-за MSSQL, так как в Firebird записи вставляются нормально. Почему-то MSSQL строки нечётным количеством обратных слешей не хочет вставлять в базу. Буду искать дальше что не так…

По параметризированным запросам: раньше какие-то запросы тоже не обрабатывались, и чтобы не гадать стал сам собирать SQL-запрос, а сейчас так и осталось.
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

t-ea писал(а):По параметризированным запросам: раньше какие-то запросы тоже не обрабатывались,

не верю (с) или использовал бажные компоненты
t-ea
новенький
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

Сообщение t-ea »

Attid писал(а):не верю

Чему? Тому что SQL-команда не выполнялась?
Было такое, и для того чтобы видеть побуквенно какая команда получается, пришлось оставить самостоятельную сборку SQL-строки, и искать что где не так, а потом руки не дошли — работает и ладно… Тем более что раньше я параметрами вообще не пользовался.

А по поводу моей проблемы:
Как оказалось проблема в таком коде mse (msedb.pas):

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

           if p^='\' then Inc(p,2) // make sure we handle \' and \\ correct
           else Inc(p);


Теперь меня интересует как сказать mse что обрабатывать SQL-команду ему не надо, а надо её просто выполнить?
Переключение параметра ParseSQL у msesqlquery не помогло, а дальше не знаю.
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Теперь меня интересует как сказать mse что обрабатывать SQL-команду ему не надо, а надо её просто выполнить?

Connection.ExecuteDirect(<ваша команда>);

Кстати, этой же командой удобно заказывать блокировки таблиц в событии BeforeApplyUpdate.

Переключение параметра ParseSQL у msesqlquery не помогло, а дальше не знаю.

AFAIK, эта команда предназначена для IDE - чтобы оно выделило 1) параметры 2) названия и типы полей и 3) название таблицы - чтобы автоматом выстроить SQL-команды модификации этой таблицы (тогда пользователю не надо париться с обновлениями -все будет сделано автоматом по ApplyUpdates+Commit[Retaining]). Если запрос многотабличный, то автоматом команды модификации не построишь - поэтому датасет переводится в ReadOnly, если не заданы SQL(Insert/DElete/UPdate) OnApplyRecUpdate (то есть когда программер говорит "сам пропишу модификации").
hibaaryan
незнакомец
Сообщения: 1
Зарегистрирован: 07.01.2015 14:40:30

Сообщение hibaaryan »

либо создавать через .create(self)
и копировать все свойства

печально, столько "лишних" строк ...
Ответить