Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Extraño comportamiento de ADO (https://www.clubdelphi.com/foros/showthread.php?t=65413)

r1d2m3 12-12-2009 02:10:40

Extraño comportamiento de ADO
 
Hola Amigos, estoy desarrollando una aplicación en delphi que se conecta con una bd de access via ADO y estoy notando un comportamiento bastante extraño, previamente les mostraré el código que estoy utilizando y luego les describo lo que estoy observando:
Código Delphi [-]
          for I := 0 to Length(Colab)-1 do
          begin
            with cmdActDatos do
            begin
              cadSQL:='INSERT INTO tb_maeColabor (nroId, codCarpe, codAbog) VALUES (' + IntToStr(GenerarID(13)) + ',' + IntToStr(PnroRs) + ', ' + IntToStr(Colab[i]) + ')';
              CommandText:=cadSQL;
              Execute;
//              Sleep(300);
            end;
          end;

el código de arriba lo que hace es enviar un insert a la bd, tengo un procedimiento GenerarID que lo que hace es generar números de id secuenciales, utilizo este procedimiento y no los campos autonuméricos de access porque así esta implementado el sistema y debo continuar con esta estrategia de desarrollo, el tema es que, si envio mas de un insert, el procedimiento generarid, a veces, me devuelve el mismo número, como si en el ciclo anterior del for no hubiese grabado el id. Para comprobar esto, puse un sleep(300) y ahí si funciona, la pregunta sería, ¿existe alguna forma de asegurarse que Access grabe efectivamente el registro, esto dentro de procedimiento GenerarID, para asegurarse que no devuelva un id duplicado?
Si no existe alguna instrucción tipo flush (la ví en algún otro lenguaje), que baje a disco lo que esté en buffer, tendré que dejar el sleep(300) para que funcione.

Gracias por la atención y saludos.

coso 12-12-2009 14:33:10

Hola,
no existe flush, pero si refresh o update, que hace exactamente eso. De todas maneras, ten en cuenta que si GeneraId no relee de la base de datos para encontrar el numero, tendra en buffer los registros anteriores, sin el nuevo insertado. Saludos.

r1d2m3 12-12-2009 16:37:16

Gracias por la respuesta, estas ordenes que me comentas, ¿donde están?, ¿son parte de ado? como verás, en el código que pasé de ejemplo, estoy usando un objeto command y no encuentro aqui las ordenes sugeridas.

Te pido disculpas por la insistencia y nuevamente te agradezco tu atención.

coso 12-12-2009 19:08:32

Hola,
no lo recuerdo bien, pero creo que todos los descendientes de TCustomDataset tienen el metodo Refresh y Update (TADOQuery, TADOTable, etc...). No conozco el objeto command que comentas, tendras que mirar si desciende de TCommandDataSet, que probablemente lo sea pues parece un query. Si no es asi, no sabria decirte :confused: prueba de mirar los metodos propios de la clase. Un saludo.

PD: en el caso que descienda de TCustomDataSet pero tenga el update o el refresh protegido, puedes usar el truco de 'hackear' la clase

Código Delphi [-]

type THKCustomDataSet = class(TCustomDataSet)
...
  THKCustomDataSet(cmdActDatos).Refresh;

espero que te sirva de ayuda. Un saludo.


La franja horaria es GMT +2. Ahora son las 12:43:34.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi