Ver Mensaje Individual
  #6  
Antiguo 12-02-2025
navbuoy navbuoy is offline
Miembro
 
Registrado: mar 2024
Posts: 360
Reputación: 3
navbuoy Va por buen camino
En FireDAC, la llamada a ApplyUpdates() solo es necesaria si usas un componente TFDTable o TFDQuery con un CachedUpdates activo. Si estás ejecutando una consulta INSERT, UPDATE o DELETE directamente con ExecSQL(), no necesitas ApplyUpdates(), ya que los cambios se aplican inmediatamente en la base de datos.

Cuándo usar ApplyUpdates()
Debes usar ApplyUpdates() solo si estás trabajando con datos en memoria antes de enviarlos a la base de datos. Esto ocurre cuando:

TFDQuery->CachedUpdates = true
TFDTable->CachedUpdates = true
TFDMemTable está en uso y necesita sincronizarse con la base de datos.

Ejemplo con CachedUpdates
Si tienes un TFDQuery con CachedUpdates = true, los cambios se almacenan en memoria y debes hacer esto para aplicarlos:

Código:
void GuardarEnBD() {
    try {
        FDConnection1->StartTransaction();  // Inicia la transacción

        FDQuery1->Post();  // Guarda los cambios en el buffer en memoria
        FDQuery1->ApplyUpdates();  // Aplica los cambios en la BD
        FDConnection1->Commit();  // Confirma la transacción

    } catch (Exception &e) {
        FDConnection1->Rollback();  // Revierte en caso de error
        ShowMessage("Error: " + e.Message);
    }
}
Si usas ExecSQL(), no necesitas ApplyUpdates()
Cuando ejecutas una consulta directa (ExecSQL()), la actualización se realiza inmediatamente en la BD, por lo que este código NO necesita ApplyUpdates():

Código:
void ActualizarPrecio() {
    try {
        FDConnection1->StartTransaction(); 

        FDQuery1->SQL->Text = "UPDATE productos SET precio = precio * 1.10 WHERE categoria = 'electronica'";
        FDQuery1->ExecSQL();  

        FDConnection1->Commit();  

    } catch (Exception &e) {
        FDConnection1->Rollback();
        ShowMessage("Error: " + e.Message);
    }
}
Responder Con Cita