C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перевод с паскаля  (Прочитано 1558 раз)
SilverFish
Участник
**

Сказали спасибо: +14/-6
Offline Offline

Сообщений: 789


« : 01 июля 2015, 14:58:09 »

Мне надо чтобы выполнилось два разных SQL запроса. После выполнения первого должен успешно выполниться второй. Если первый запрос не сработал, то второй запрос не должен происходить. Вроде как надо это обернуть в транзакцию?
Из этой документации: http://docwiki.embarcadero.com/RADStudio/XE7/en/Managing_Transactions_%28FireDAC%29
Код
FDConnection1.StartTransaction;
try
 FDQuery1.ExecSQL;
 ....
 FDQuery1.ExecSQL;
 FDConnection1.Commit;
except
 FDConnection1.Rollback;
 raise;
end;
 

Так будет правильно?:
Код
UniMainModule()->FDConnection1->StartTransaction();
 try
{
//первый запрос возвращает ID
//INSERT INTO sensors (ser_num, poverka, prim)
//VALUES (:ser_num, :poverka, :prim) RETURNING id;
UniMainModule()->FDQueryInsertDatRoomAdmin->Close();
UniMainModule()->FDQueryInsertDatRoomAdmin->ParamByName(L"SER_NUM")->AsInteger = UniNumberEdit1->Value;
UniMainModule()->FDQueryInsertDatRoomAdmin->ParamByName(L"POVERKA")->AsDateTime = UniCalendar1->Date.DateString() + L" 00:00:00";
UniMainModule()->FDQueryInsertDatRoomAdmin->ParamByName(L"PRIM")->AsString = UniEditPrim->Text;
UniMainModule()->FDQueryInsertDatRoomAdmin->Open();
 
//второй запрос использует ID первого
//INSERT INTO rooms_sensors(id_rooms, id_sensors, start)
//VALUES(:id_rooms, :id_sensors, :start);
UniMainModule()->FDQueryInsertDatRoom->Active = false;
UniMainModule()->FDQueryInsertDatRoom->ParamByName(L"ID_SENSORS")->AsInteger =
UniMainModule()->FDQueryInsertDatRoomAdmin->FieldByName(L"id")->AsInteger;
 
UniMainModule()->FDQueryInsertDatRoom->ParamByName(L"ID_ROOMS")->AsInteger =
UniMainModule()->ClientDataSetSelectAdminRoom->FieldByName(L"id")->AsInteger;
 
UniMainModule()->FDQueryInsertDatRoom->ParamByName(L"START")->AsDateTime = Now();
UniMainModule()->FDQueryInsertDatRoom->ExecSQL();
 
UniMainModule()->FDConnection1->Commit();
}
catch (...)//тут все исключения?
{
UniMainModule()->FDConnection1->Rollback();
throw;//это надо?
}
 
Записан
S0mbre
Глобальный модератор
***

Сказали спасибо: +1113/-22
Offline Offline

Сообщений: 2137

S0mbre


WWW
« Ответ #1 : 02 июля 2015, 07:15:34 »

Да, все правильно )
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в: