[решено] Отсутствует ID, SQLQuery как сохранять?

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

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

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение debi12345 » 27.02.2016 20:35:36

т.к. априори понятно, что я сделаю - всё тоже самое, что уже сделано разработчиками Лазарус

Увы, эта (автогенерация запросов на обновление) схема работает только для выборок из одиночных таблиц - чтобы не перегружать интеллектом БД-драйвер и SQLDB. Малейший JOIN чтобы сопоставить 2+ таблицы (код из одной, имя для этого кода - из другой) - и вариант Севера (вручную прописывать (Insert/Update/Delete)SQL) становится неизбежным.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение vitaly_l » 27.02.2016 20:52:29

debi12345 писал(а):Малейший JOIN чтобы сопоставить 2+ таблицы (код из одной, имя для этого кода - из другой) - и вариант Севера (вручную прописывать (Insert/Update/Delete)SQL) становится неизбежным.

Ага, о таких запросах, кстати, я даже и не подумал, но они реально возможны. Пожалуй, программисты правы (в том числе и 8+) - нужно запретить редактирование, из грида. Круто, спасибо, теперь ясно вижу опасность бесконтрольного обновления в гриде, а чтобы обойти... по любому придётся написать свои insert и update. Ну и ладно, подумаешь: свои запросы к базе - это в принципе не сложно.
Спасибо.

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

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение debi12345 » 27.02.2016 21:22:45

Пожалуй, программисты правы (в том числе и 8+) - нужно запретить редактирование, из грида.

ИМХО, если заказчик требует такого редактирования - нужно его сделать (проблем нет - важно только следить за фиксацией данных в БД при закрытии формы или программы, если например оператор забыл нажать ENTER). Не требует - избегать.
В одном из моих проектов (клон устаревшей FoxPro-проги) требование "редактировать в гриде" было ультимативным - оно ускоряет скорость и надежность работы операторов в РАЗЫ (так как не нужно "плясать" между полями редактирования, теряя время и утомляя внимание)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение vitaly_l » 27.02.2016 21:32:47

debi12345 писал(а):В одном из моих проектов (клон устаревшей FoxPro-проги) требование "редактировать в гриде" было ультимативным - оно ускоряет скорость и надежность работы операторов в РАЗЫ (так как не нужно "плясать" между полями редактирования, теряя время и утомляя внимание)

Так ведь грид не даёт редактировать текстовое поле TEXT и пишет там (MEMO) и я читал на форуме отменить это никак нельзя.

Или можно как-то разрешить редактировать поля системы TEXT в гриде?



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

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение debi12345 » 27.02.2016 21:39:50

Так ведь грид не даёт редактировать текстовое поле TEXT и пишет там (MEMO)

Это особенность MySQL, у него тип TEXT- бинарное поле. Взамен него можно использовать VARCHAR(N)- но оно фиксированной длины. Можно приводить тип к нужному в самой SQL-выборке :

CAST(<text_field> AS VARCHAR(25)) AS <text_field>

А например в PostgreSQL или SQLITE3 тип TEXT означает именно текст, причем неограниченной длины (но не уверен на 100%,что FPC SQLDB это учитывает).

ПС: для проектов с локальной БД очень рекомендую SQLITE3 c использованием транзакций - очень надежная БД, ни одного "падения" БД на 6..7 компах на 5 ..6 лет, при этом компы нещадно вирусовались, бились файловые системы из-за моргания света, компы выключались или резетились во время незавершенной записи в БД,...
Даже не ожидал такой надежности, тьфу-тьфу.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение vitaly_l » 27.02.2016 22:08:11

debi12345 писал(а):SQLITE3

Я с ней работал, я думал что это упрощённая MySQL.
нда... а это оказывается разные базы... я как всегда "впереди планеты всей"... в смысле - не знал, что это разные базы.
Так это меняет всё: SQLITE3 - я знаю и умею подключать, правда локально я её тестировал, а тут стал пробовать и подключил MySQL.
Спасибо, большое.

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

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение debi12345 » 27.02.2016 22:31:49

SQLITE3 - я знаю и умею подключать, правда локально я её тестировал

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

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение resident » 27.02.2016 23:57:35

debi12345 писал(а):Вероятно через Indi-компоненты под OpenSSL?

Не знаю.
Есть работающие платные компоненты (на забугорном форуме отписывались о положительном результате), но моя информация стоит меньше чем они.
К примеру эти:
https://www.devart.com/pgdac/

debi12345 писал(а):а расследовать кто "пошутил" нетрудно - от фамилии того, за кого например заплатили

Ведь так могут и подставить кого-нить.

debi12345 писал(а):Привычка полагаться на отладку приводит к весьма тяпляпному стили програмированния в духе "лишь бы хоть как-то запустилось, а выправим по ходу"

Собралось? Релиз! :mrgreen:

debi12345 писал(а):1) сниффером...
2) системно...
3) одноразово...

4) встроенный инструмент логирования:
http://wiki.freepascal.org/SqlDBHowto
Секция "Troubleshooting: TSQLConnection logging"
Как показал лог, Лазарус таки использует префикс OLD_
Но сам я пробовал его задействовать и что-о оно не заработало. Может кто знает как использовать префиксы?
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение debi12345 » 28.02.2016 00:25:00

Но сам я пробовал его задействовать и что-о оно не заработало. Может кто знает как использовать префиксы?

АФАЙК, в параметр ":OLD_<field_name>" для "UpdateSQL" & DeleteSQL передается значения поля "<field_name>", запомненное сразу после SQL SELECT.
В параметр ":NEW_<field_name>" для "UpdateSQL" & InsertSQL передается значение, прочитанное из связанного (при SELECTе) с данным полем компонента редактирования, или, если привязка "БД-поле + компонент" не делалась - копия ":OLD_<field_name>".

Собралось? Релиз!

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

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение resident » 28.02.2016 00:31:59

vitaly_l
Кстати, там же по ссылке в секции "How to change data in a table?" объяснили про Post и ApplyUpdates.
Сначала Post - внесение изменения в набор данных
После ApplyUpdates - отправка изменений набора на сервер
В итоге Commit* - сохранение изменений на сервере
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение debi12345 » 28.02.2016 00:34:32


1) чем не угодил штатный клиент (по опупения оптимизированная малышка LIBPQ) ?
2) если нет встроенного шифрования,то в чем фишка ?

Кстати, там же по ссылке в секции "How to change data in a table?" объяснили про Post и ApplyUpdates.

Кошмарное ХауТу, хорошему не научит (ИМХО)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение resident » 28.02.2016 00:46:30

debi12345
Пробовал, не работает. Убираешь префикс - работает.
debi12345 писал(а): "UpdateSQL" & DeleteSQL передается значения поля "<field_name>", запомненное сразу после SQL SELECT

Я выбирал множество записей, т.е. id (у меня это первичный ключ) не был задан. Потом пробегаюсь по всей выборке и правлю каждую запись. А если id при SELECT-е не был задан, то и обращаться к нему нельзя?
Но тогда в логах откуда Лазарус его берет? Или что Лазарус сделал предварительно, чтобы ссылаться на OLD?
Из лога (у меня этот OLD так же был записан, прога ругалась на неизвестный параметр вроде):
Код: Выделить всё
where("id"=:"OLD_id")


Я тогда так и не понял, какая же от префикса выгода, и не очень расстроился. А теперь опять префикс всплыл.
Вот допустим, он бы заработал. Что это даст?

Добавлено спустя 4 минуты 10 секунд:
debi12345 писал(а):если нет встроенного шифрования,то в чем фишка ?

Его можно привязать к ихнему компоненту SecureBridge и соединяться с Пострес-ом по SSH
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение debi12345 » 28.02.2016 00:53:52

Пробовал, не работает. Убираешь префикс - работает.

Глюк. Где прописывали ":OLD_" ? В тексте запросов, прписанных в TDataset.UpdateSQL & TDataset.DeleteSQL ? (парсятся ТОЛЬКО там)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение resident » 28.02.2016 00:58:12

debi12345 писал(а):Где прописывали ":OLD_" ?

UpdateSQL
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: [решено] Отсутствует ID, SQLQuery как сохранять?

Сообщение debi12345 » 28.02.2016 01:18:45

UpdateSQL

А сам параметр ":<field_name>" в TDataset.Params зарегестрировали и к нужному БД-полю привязать не забыли ?
АФАЙК, только в этом случае будут искаться ":OLD_<field_name>" и ":NEW_<field_name>".

Добавлено спустя 4 минуты 4 секунды:
Вот допустим, он бы заработал. Что это даст?

Автоматическое хранение стартовго (:OLD_) и финального (:NEW_) значений. Иначе нужна возня с промежуточными переменными.

Добавлено спустя 4 минуты 49 секунд:
SecureBridge и соединяться с Пострес-ом по SSH

Хм, сервак такое соединение не поддерживает - ему подавай уже готовый SSH-канал. А если так, то проще всего использовать например STUNNEL - он кстати имеет интерфейс для старта-шатдауна-реконнекта (чтобы реализовать режим "по требованию") - тупо автозапускаешь его прямо из каталога проги при ее старте и автовыгружаешь при ее завершении.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Пред.След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 222

Рейтинг@Mail.ru