Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2012, 23:10   #1
semak777
 
Регистрация: 25.02.2012
Сообщений: 6
По умолчанию Проблема с транзакцией

Вот код
Код:
procedure Tmain.sBitBtn2Click(Sender: TObject);
var
      id:string;
begin
    with DM.ProductQ do
      begin
      id := FieldByName('id_product').AsString;
      try
      DM.ProductQ.Close;
      DM.ProductQ.SQL.Text := 'update product set pname = :pname where id_product = ' + id;
      DM.ProductQ.ParamByName('pname').AsString := sEdit1.Text;
      DM.ProductQ.ExecSQL;
      DM.ProductQ.SQL.Text := 'select * from PRODUCT';
      DM.ProductQ.Open;
      sEdit1.Visible := false;
      sDBEdit1.Visible := true;
      except ShowMessage('Ошибка');
end;
end;
end;
Все работает, но данные реально добавляются в бд только после закрытия / открытия программы. При попытке стартануть транзакцию Delphi не признает IBTransaction1. При попытке поменять что-то начинают сыпаться ошибки, не знаю что делать)
Delphi 7, Firebird 2.5

Последний раз редактировалось Stilet; 26.02.2012 в 11:20.
semak777 вне форума Ответить с цитированием
Старый 26.02.2012, 04:32   #2
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Цитата:
не знаю что делать)
подтверждать транзакцию после изменений.

Цитата:
При попытке стартануть транзакцию Delphi не признает IBTransaction1.
Транзакцию надо не стартовать а подтверждать,
Код:
IBTransaction1.Commit;
а лучше изменение проводить в отдельной транзакции.
Цитата:
При попытке поменять что-то начинают сыпаться ошибки
что меняете? какие ошибки?
vovk вне форума Ответить с цитированием
Старый 26.02.2012, 09:45   #3
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Прежде всего, разделить транзакции на "пишущую" и "читающую" и для чтения/записи сделать два отдельных квери. В каждом из этих компонентов указать в свойстве Transaction соответствующий компонент TIBTransaction. В компонентах TIBTransaction задать параметры (можно стандартные: "read_committed", "rec_version", "nowait").
В конечном итоге: в DataModule имеем: два IBQuery и два TIBTransaction.
Код:
procedure Tmain.sBitBtn2Click(Sender: TObject);
var
  id:string;
begin
  DM.ProductQ.DisableControls;
  id := DM.ProductQ.FieldByName('id_product').AsString;
  DM.ProductQ.Close;

  DM.qrWrite.SQL.Text := 'update product set pname = :name where id_product = ' + id;
  DM.qrWrite.Transaction.StartTransaction;
  DM.qrWrite.ParamByName('name').AsString := sEdit1.Text;
  try
    DM.qrWrite.ExecSQL;
    DM.qrWrite.Transaction.Commit;
  except
    //rollback в одиночном модифицирующем запросе не нужен,
    //т.к. при ошибке сервер все равно откатит эту одну транзакцию
    ShowMessage('Ошибка');
  end;

//  DM.ProductQ.SQL.Text := 'select * from PRODUCT';
  DM.ProductQ.Open;
  DM.ProductQ.EnableControls;
  sEdit1.Visible := false;
  sDBEdit1.Visible := true;
end;
Читающая транзакция, если ее не насиловать записью в базу, может быть открыта весь секанс. При выходе из программы она будет закрыта автоматически.

Последний раз редактировалось Прик; 26.02.2012 в 10:11. Причина: А параметры то неправильно заданы
Прик вне форума Ответить с цитированием
Старый 26.02.2012, 11:13   #4
semak777
 
Регистрация: 25.02.2012
Сообщений: 6
По умолчанию

Спасибо, вроде все хорошо работает, но, например, запущен IBExpert в нем открыта наша таблица, в которую вносим изменения, при изменении данных через программу, в открытой таблице в IBX данные изменяются только после нажатия - Подтвердить изменения. Так и должно быть? Или таблица в IBX автоматом должна принимать изменения?
semak777 вне форума Ответить с цитированием
Старый 26.02.2012, 11:48   #5
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Нет, не автоматом. Надо просто понять, что IBExpert - это самый обыкновенный приложение-клиент с точки зрения сервера СУБД. И тогда: изменения в таблицах с любого клиента не ведомы другим клиентам, до тех пор пока они вновь не перечитают таблицу.
Отсюда и "подтвердить изменения!".

Кстати, не корректно говорить "таблица IBX". Из-за того, что IBX - это библиотека компонентов, предоставляющих доступ к БД и никаких таблица в IBX, разумеется, не может быть.
Прик вне форума Ответить с цитированием
Старый 26.02.2012, 12:15   #6
semak777
 
Регистрация: 25.02.2012
Сообщений: 6
По умолчанию

Спасибо большое, Вы мне очень помогли).
semak777 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37