Простая БД на SQLite

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

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

Re: Простая БД на SQLite

Сообщение EatMyShorts » 20.10.2009 15:51:18

Vadim писал(а):
EatMyShorts писал(а):Как я понимаю откатить вставку, если она прошла успешно с помощью transac.RollBack не получится.

Чтобы иметь возможность откатить транзакцию, её надо начать перед проведением какой-либо операцией над базой в явном виде.


transac.active := true; это разве не оно?
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение Vadim » 20.10.2009 16:05:08

EatMyShorts
Нет, не оно. Оно вот оно:
Код: Выделить всё
//Начинаем новую транзакцию
transac.StartTransaction;
//Далее идут какие-либо действия по изменению данных
...
//Проверяем условие, по которому решаем, подтвердить транзакцию или отменить
If условие Then
  transac.Commit
Else
  transac.Rollback;
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Простая БД на SQLite

Сообщение EatMyShorts » 20.10.2009 16:18:07

Vadim писал(а):EatMyShorts
Нет, не оно. Оно вот оно:
Код: Выделить всё
//Начинаем новую транзакцию
transac.StartTransaction;
//Далее идут какие-либо действия по изменению данных
...
//Проверяем условие, по которому решаем, подтвердить транзакцию или отменить
If условие Then
  transac.Commit
Else
  transac.Rollback;

Ну вот у меня и загвоздка: как я узнаю, что мне нужно отменить действие, если не вижу результат, а результат появляется только после Commit.
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение Vadim » 20.10.2009 16:43:39

EatMyShorts писал(а):...как я узнаю, что мне нужно отменить действие, если не вижу результат...

Надо переформулировать задачу так, чтобы знать не видя результата. Вот здесь как раз и начинается настоящее программирование. :)
Вот смотрите сами, что у Вас получается: Ваш результат зависит от результата. :) Согласитесь, это нечто невообразимое. Результат не может зависеть сам от себя - это логическое противоречие. Результат должен зависеть от предварительно заданных условий. Вам остаётся только проанализировать эти условия и получить результат логически вытекающий из проведённого Вами анализа.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Простая БД на SQLite

Сообщение EatMyShorts » 20.10.2009 17:01:57

Vadim писал(а):Надо переформулировать задачу так, чтобы знать не видя результата. Вот здесь как раз и начинается настоящее программирование. :)

НУ тогда подскажите, как обычно делается?
У меня: на форме редактирования вводим значения полей записи, жмем(например) добавить
и выолняется код
Код: Выделить всё
procedure InsertRecord(field1, field2, field3: string);
begin
  try
    transac.Active := True;
    with query do
    begin
      Close();
      SQL.Clear;
      SQL.Add(
        'INSERT INTO table1(f1, f2l, f3) '
        + 'VALUES(:field1, :field2, :field3)');
      Params.ParamByName('field1').AsString    := field1;
      Params.ParamByName('field2').AsString    := field2;
      Params.ParamByName('field3').AsString    := field3;
      ExecSQL;
    end;
    transac.Commit;
  except
    on E: Exception do
      MessageDlg(E.message, mtError, [mbOK], 0);
end;

Результат должен зависеть от предварительно заданных условий. Вам остаётся только проанализировать эти условия и получить результат логически вытекающий из проведённого Вами анализа.

Какие тут могут быть заданы предварительные условия?
Если только спрашивать пользователя на каждое действие подтверждение и в зависимости от этого завершать или отменять транзакцию? Как мне кажется это не совсем правильно.
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение Vadim » 20.10.2009 17:15:38

EatMyShorts писал(а):Какие тут могут быть заданы предварительные условия?

Вообще-то Вам это должно быть лучше известно. Из Вашего кода видно, что Вы всего лишь осуществляете ввод трёх значений в три поля. Зачем отменять ввод? Наверное исключительно затем, что какое-то значение из этих трёх неправильное и его вводить нельзя. Следовательно у Вас должен быть какой-то критерий проверки правильности этих значений.
Что из этого следует? Сначала проверяем каждое значение на правильность и только после этого осуществляем ввод их в базу данных. Никакие транзакции или отмены ввода Вам не нужны в принципе, т.к. ввод будет осуществляться только при проверенных значениях. Если значения проверку не прошли, они просто напросто не вводятся. ;)
Если, конечно, Вы ещё чего-нибудь не забыли сообщить. :)

Добавлено спустя 2 минуты 45 секунд:
Кстати, параметры в запросе явно лишние. ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Простая БД на SQLite

Сообщение EatMyShorts » 20.10.2009 17:22:24

Vadim писал(а): Сначала проверяем каждое значение на правильность и только после этого осуществляем ввод их в базу данных.

Допустим у меня таблица с полями: Имя, Фамилия.
Получается мне надо проверять введенное пользователем имя на правильность? Перебрать все возможные имена?
Кстати, параметры в запросе явно лишние.
А почему? Из-за маленького кол-ва полей?
EatMyShorts
новенький
 
Сообщения: 30
Зарегистрирован: 06.10.2009 19:48:19

Re: Простая БД на SQLite

Сообщение Vadim » 20.10.2009 17:35:53

EatMyShorts писал(а):Допустим у меня таблица с полями: Имя, Фамилия.
Получается мне надо проверять введенное пользователем имя на правильность? Перебрать все возможные имена?

Н-да... Смысл беседы явно потерялся. :)
У Вас не сформулирована задача, которую должна выполнять Ваша программа. Оттого Вы и не знаете, что делать. Я тоже не знаю, потому что Ваша проблема не носит технический характер. Проблема Ваша чисто организационная. Попробуйте чётко и недвусмысленно изложить на бумаге то, что должна делать Ваша программа. Исходя из этих дел, Вы описываете алгоритм выполнения. Далее, под этот алгоритм подбираете необходимые технические приёмы.
EatMyShorts писал(а):А почему? Из-за маленького кол-ва полей?

Вы неправильно сформулировали вопрос. :) Давайте я его переформулирую, а Вы попробуете на него ответить.
Вопрос:
У Вас в программу введены дополнительные компоненты - параметры запроса. Зачем, для какой цели?

Добавлено спустя 2 минуты 7 секунд:
По поводу первого. Применим тот же приём. ;)
Вы собираетесь отменять ввод значений в базу. Почему, по каким причинам?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Пред.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru