Создание правильной SQL-строки
Модератор: Модераторы
Создание правильной SQL-строки
Есть ли в mse (или в fpc) стандартная функция которая из поданной ей на вход простой строки формирует синтаксически правильную SQL-строку, то есть дублирует кавычки/апострофы, экранирует escape-символы и т.п.?
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
1) sql_str:= tmsesqlquery.fieldtosql(tmse{type}field);
2) sql_str:= tmse{type}field.assql;
Ессно, адаптирповано под синтаксис кокретного БД-сервера.
Из опыта : вариант 1) надежнее.
ПС:
Для записи BLOB-значений "голый" SQL-не проканает - придется "заливать" бинарные данные через параметрический SQL-запроc.
2) sql_str:= tmse{type}field.assql;
Ессно, адаптирповано под синтаксис кокретного БД-сервера.
Из опыта : вариант 1) надежнее.
ПС:
Для записи BLOB-значений "голый" SQL-не проканает - придется "заливать" бинарные данные через параметрический SQL-запроc.
Нет, у меня строки читаются из файла а не из DB-полей, и сейчас столкнулся с такой ситуацией, что в некоторых строках содержится много обратных сплешей с апострофами. Пока написал свою функцию, но она просто удваивает встречающиеся служебные символы.
Хотелось бы пользоваться стандартными функциями если они есть.
P.S.: А чем .asSQL ненадёжна? А то для формирования строки из полей я использую именно её.
Хотелось бы пользоваться стандартными функциями если они есть.
P.S.: А чем .asSQL ненадёжна? А то для формирования строки из полей я использую именно её.
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Ну тогда самописка под кокретный синтаксис, хотя в принципе можно взять за прототип код вышеуказанных функций.
Во млин, не помню уже - вроде был какой-то прикол и Мартин вариант 1) посоветовал тогда
Для строк она подходит, но вот для других типов есть зависимости от сервера, например :
1) BOOLEAN= 't'/'f' (PostgreSQL), 1/0(SQlite3)
2) NUMERIC/BCD = value*10000 (SQlite3)
P.S.: А чем .asSQL ненадёжна?
Во млин, не помню уже - вроде был какой-то прикол и Мартин вариант 1) посоветовал тогда
А то для формирования строки из полей я использую именно её.
Для строк она подходит, но вот для других типов есть зависимости от сервера, например :
1) BOOLEAN= 't'/'f' (PostgreSQL), 1/0(SQlite3)
2) NUMERIC/BCD = value*10000 (SQlite3)
Оказавается что это скорее всего из-за MSSQL, так как в Firebird записи вставляются нормально. Почему-то MSSQL строки нечётным количеством обратных слешей не хочет вставлять в базу. Буду искать дальше что не так…
По параметризированным запросам: раньше какие-то запросы тоже не обрабатывались, и чтобы не гадать стал сам собирать SQL-запрос, а сейчас так и осталось.
По параметризированным запросам: раньше какие-то запросы тоже не обрабатывались, и чтобы не гадать стал сам собирать SQL-запрос, а сейчас так и осталось.
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
- Откуда: Ташкент (Узбекистан)
Теперь меня интересует как сказать mse что обрабатывать SQL-команду ему не надо, а надо её просто выполнить?
Connection.ExecuteDirect(<ваша команда>);
Кстати, этой же командой удобно заказывать блокировки таблиц в событии BeforeApplyUpdate.
Переключение параметра ParseSQL у msesqlquery не помогло, а дальше не знаю.
AFAIK, эта команда предназначена для IDE - чтобы оно выделило 1) параметры 2) названия и типы полей и 3) название таблицы - чтобы автоматом выстроить SQL-команды модификации этой таблицы (тогда пользователю не надо париться с обновлениями -все будет сделано автоматом по ApplyUpdates+Commit[Retaining]). Если запрос многотабличный, то автоматом команды модификации не построишь - поэтому датасет переводится в ReadOnly, если не заданы SQL(Insert/DElete/UPdate) OnApplyRecUpdate (то есть когда программер говорит "сам пропишу модификации").
либо создавать через .create(self)
и копировать все свойства
печально, столько "лишних" строк ...
и копировать все свойства
печально, столько "лишних" строк ...
