lunes, agosto 27, 2012

Lazarus (freepascal), acceso a Oracle, segunda parte




El otro día explicaba cómo acceder a la base de datos desde FreePascal, aunque realmente sólo hacía una SELECT.
Hoy toca una update que es muy parecido.






Es muy similar a la SELECT del otro día. Hay estas diferencias:

  • En la SELECT se hace SQLQuery1.Open.
  • En la UPDATE SQLQuery1.ExecSQL.
  • En la UPDATE hay que hacer COMMIT de la transacción con SQLTransaction1.Commit.
Luego hay que tener en cuenta unos detalles para que no se generen errores:

ORACLE espera que indiquemos los valores VARCHAR2 (equivalentes al tipo String) entre comillas simples. El problema es que si ponemos comillas simples dentro de SQLquery1.SQL.Text, se corta el string y nos salta un error que indica que el String está mal construido.

La solución es incluir dos comillas simples. FreePascal entiende que la primera comilla es un caracter de escape y en el String que se forma tiene que haber una comilla simple.


El código fuente para el copia-pega:



procedure TfrmPrincipal.Button2Click(Sender: TObject);
var
  OracleConnection1: TOracleConnection;
  SQLquery1: TSQLQuery;
  SQLtransaction1: TSQLTransaction;
begin
  OracleConnection1 := TOracleConnection.Create(nil);
  SQLquery1 := TSQLQuery.Create(nil);
  SQLtransaction1 := TSQLTransaction.Create(nil);
  try
    try
      with OracleConnection1 do begin
           DatabaseName:='entradaTNS-ORACLE';
           UserName:='usuario';
           Password:='password';
           Transaction := SQLtransaction1;
      end;
      OracleConnection1.Connected:=true;
      SQLtransaction1.Active:=true;
      SQLquery1.DataBase := OracleConnection1;
      SQLquery1.SQL.Text := 'update TABLA set CAMPO=''C'' where CAMPO2=''D''';
      SQLQuery1.ExecSQL;
      SQLTransaction1.Commit;
      ShowMessage ('Campo actualizado');
      SQLquery1.Close;
      OracleConnection1.Close;
    finally
      SQLtransaction1.Free;
      SQLquery1.Free;
      OracleConnection1.Free;
    end;
  except
    on E: Exception do
      writeln(E.message);
  end;
end;

Saludos,

No hay comentarios: