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


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

Сообщений: 786


Перевод с паскаля
« : 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

Сообщений: 2132

S0mbre


« Ответ #1 : 02 Июль 2015, 07:15:34 »

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




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.122 секунд. Запросов: 21.