Страница 1 из 1

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

СообщениеДобавлено: 28.07.2009 17:55:23
t-ea
Есть ли в mse (или в fpc) стандартная функция которая из поданной ей на вход простой строки формирует синтаксически правильную SQL-строку, то есть дублирует кавычки/апострофы, экранирует escape-символы и т.п.?

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

СообщениеДобавлено: 28.07.2009 21:43:53
debi12345
1) sql_str:= tmsesqlquery.fieldtosql(tmse{type}field);
2) sql_str:= tmse{type}field.assql;

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

ПС:
Для записи BLOB-значений "голый" SQL-не проканает - придется "заливать" бинарные данные через параметрический SQL-запроc.

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

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

P.S.: А чем .asSQL ненадёжна? А то для формирования строки из полей я использую именно её.

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

СообщениеДобавлено: 29.07.2009 01:17:46
debi12345
Ну тогда самописка под кокретный синтаксис, хотя в принципе можно взять за прототип код вышеуказанных функций.

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

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

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

Для строк она подходит, но вот для других типов есть зависимости от сервера, например :
1) BOOLEAN= 't'/'f' (PostgreSQL), 1/0(SQlite3)
2) NUMERIC/BCD = value*10000 (SQlite3)

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

СообщениеДобавлено: 29.07.2009 09:14:21
Attid
t-ea
а параметизированные запросы не помогут ? или у тебя в файле готовый SQL запрос ?

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

СообщениеДобавлено: 30.07.2009 00:02:53
t-ea
Оказавается что это скорее всего из-за MSSQL, так как в Firebird записи вставляются нормально. Почему-то MSSQL строки нечётным количеством обратных слешей не хочет вставлять в базу. Буду искать дальше что не так…

По параметризированным запросам: раньше какие-то запросы тоже не обрабатывались, и чтобы не гадать стал сам собирать SQL-запрос, а сейчас так и осталось.

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

СообщениеДобавлено: 30.07.2009 11:53:57
Attid
t-ea писал(а):По параметризированным запросам: раньше какие-то запросы тоже не обрабатывались,

не верю (с) или использовал бажные компоненты

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

СообщениеДобавлено: 31.07.2009 00:44:32
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 не помогло, а дальше не знаю.

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

СообщениеДобавлено: 31.07.2009 11:20:49
debi12345
Теперь меня интересует как сказать mse что обрабатывать SQL-команду ему не надо, а надо её просто выполнить?

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

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

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

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

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

СообщениеДобавлено: 07.01.2015 16:07:38
hibaaryan
либо создавать через .create(self)
и копировать все свойства

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