Мне надо чтобы выполнилось два разных SQL запроса. После выполнения первого должен успешно выполниться второй. Если первый запрос не сработал, то второй запрос не должен происходить. Вроде как надо это обернуть в транзакцию?
Из этой документации:
http://docwiki.embarcadero.com/RADStudio/XE7/en/Managing_Transactions_%28FireDAC%29FDConnection1.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;//это надо?
}