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

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

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

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

Сообщение resident »

debi12345 писал(а):Глюк

Точно! Я тогда на 1.2.6 и 1.4.4 пробовал.
Сейчас попробовал - работает, что с параметрами, что без.

debi12345 писал(а):А сам параметр ":<field_name>" в TDataset.Params зарегестрировали и к нужному БД-полю привязать не забыли ?

Так работает без параметров.
И где-то вроде читал, что для этих UpdateSQL и т.п. параметры не нужны.

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

Долго не мог понять вобще о чем речь :)
Вот пример, который все объясняет:
http://wiki.freepascal.org/Working_With_TSQLQuery

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

UPDATE fpdev SET UserName=:USER, InstEmail=:e-mail WHERE UserName=:OLD_User;

Получается, что мне OLD префикс пока не нужен.

debi12345 писал(а):подавай уже готовый SSH-канал. А если так, то проще всего использовать например STUNNEL

Это да. Ок, надо будет посмотреть :)

Вот кстати про логи Лазаруса.
Он при обновлении каждой записи похоже подготавливает запрос на сервере для принятия параметров. В логах "Prepare: prepare prepstXXX ..." и "Execute: ...". Нельзя ли подготовить все один раз?

Потом что странно примерно через десяток измененных записей проскакивает первоначальный запрос Select, хотя я его не вызывал. Причем он в самом начале был как положено Prepare / Execute, а потом идет как Fetch. Следующие данные из базы подкачивает? (CommitRetaining делаю через каждые 5 измененных записей, но думаю это не связано.)

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

Сообщение debi12345 »

Получается, что мне OLD префикс пока не нужен.

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

UPDATE fpdev SET UserName=:USER, InstEmail=:e-mail WHERE UserName=:OLD_User;

Как это не нужен - если положение в таблице где будет запись, опередляется именно по OLD (значению на момент выборки ) ?

prepare prepstXXX ...". Нельзя ли подготовить все один раз?

Один раз в какой момент,100% надежно просчитывамый комплятором ? (это может знать толкь программист).
Параметризация запросов также необходима если нужно обмениваться данными с бинарными полями БД (архивами, картинами, мухыкой и т.п.) - их можно прокачивать только через параметры (про эскейпизацию чтобы передать бинарку в SQL-тексте скромно молчу).
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

debi12345 писал(а):Как это не нужен - если положение в таблице где будет запись, опередляется именно по OLD (значению на момент выборки ) ?

При смене положения (курсора) методом Next меняются все поля текущей записи, в том числе и id.
Не id определяет положение курсора, а наоборот курсор определяет id.
Но т.к. id у меня не изменяется, то получается, что одновременно id = OLD_id = NEW_id.
И когда я убираю префикс из UpdateSQL, все работает как и с ним.
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Но т.к. id у меня не изменяется, то получается, что одновременно id = OLD_id = NEW_id.

Потому что Вы не редактировали конкретно поле ID,а редактирвали другое поле.

ПС:
до момента DataSet.Post(): id = OLD_id = NEW_id независимо от того, были изменения ID в ходе редактирования или нет.
resident
энтузиаст
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Сообщение resident »

debi12345 писал(а):Потому что Вы не редактировали конкретно поле ID,а редактирвали другое поле.

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

Сообщение vitaly_l »

resident писал(а): id = OLD_id = NEW_id

Если делать запрос одновременно к двум базам, то при сохранении, он пытается все поля сохранить как ни странно, в ОДНУ из них.
В общем, если с одной базой работать, SQLQuery - вроде как делает всё правильно.
У меня почему-то нет в логе запросов с префиксом NEW_ ? (я правда не делаю post),
он сразу пишет в Execute запрос конечные значения и потом в логе commit - это неправильно?.

Добавлено спустя 8 минут 55 секунд:
Убрал autocommit, он сразу пишет в базу при Execute (в логе, даже не вызывает commit), но в базу пишет. команда .ApplyUpdates;

И непонятно он в логе пишет по 2-5 одинаковых действия подряд. А один раз было вообще 33 Fetch/ Так и должно быть?


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

Сообщение resident »

vitaly_l писал(а):Если делать запрос одновременно к двум базам

А как вы работаете с двумя базами?

vitaly_l писал(а):У меня почему-то нет в логе запросов с префиксом NEW_ ?

У меня тоже

vitaly_l писал(а):И непонятно он в логе пишет по 2-5 одинаковых действия подряд

У меня такое только на SELECT, а на UPDATE сначала подготовка, потом отправка.

vitaly_l писал(а):А один раз было вообще 33 Fetch/ Так и должно быть?

Спрашивал:
viewtopic.php?f=5&t=10952&start=90#p93996
По-моему так и должно быть для SELECT. Ведь громадную базу сразу не закачаешь SELECT-ом - она может и не влезть в оперативку. Поэтому качает по частям, по мере прыганья курсора SQLQuery подкачивает новую часть ответа SELECT запроса с сервера.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

resident писал(а):А как вы работаете с двумя базами?

SELECT `name1`,`name2` FROM `one`,`two` LIMIT 5
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

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

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

Сообщение vitaly_l »

Лекс Айрин писал(а):то есть, если судить по запросу, надо записать в обе базы одно и тоже?

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


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

Сообщение resident »

vitaly_l писал(а):SELECT `name1`,`name2` FROM `one`,`two` LIMIT 5

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

Сообщение vitaly_l »

resident писал(а):Вы таблицы одной базы данных называете двумя базами данных?

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

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

vitaly_l, так стоит делать к каждой таблице свой запрос... А то ведь неизвестно как СУБД его поймет... либо просто обрежет имя второй таблицы, либо добавит несуществующие поля к каждой... т. е. продублирует записи. Что, собственно, вы и попросили сделать. Судя по всему, реализуется первый вариант.
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Хм, смелые вы ребята - полагаетесь на интеллект (или наоборот тупорылость) весьма примитивного SQL-парсера SQLDB :) При таком подходе должно быть весело и креативно писАть например финансовые задачи - один бог (или черт) знает что будет заноситься в БД :)
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Сообщение sign »

Ну нравится нкоторым по граблям прыгать.
С одной стороны шишка на лбу, но с другой - весёлые звёздочки в глазах!
Ответить