Acces violation IBCQuery

Discussion of open issues, suggestions and bugs regarding IBDAC (InterBase Data Access Components) for Delphi, C++Builder, Lazarus (and FPC)
Post Reply
calou
Posts: 116
Joined: Tue 27 May 2008 12:46

Acces violation IBCQuery

Post by calou » Thu 08 Jan 2009 16:04

Hello,

Here is my code

Code: Select all

  frmMain.IBCQryRd.SQL.Text:='SELECT * FROM P_DATA_STEP_10MIN(:DATE_DEBUT, :DATE_FIN,:NB_TURBINE,:PRJT )';
  frmMain.IBCQryRd.Prepare;
  frmMain.IBCQryRd.ParamByName('PRJT').AsString:=prjt;
  frmMain.IBCQryRd.ParamByName('NB_TURBINE').AsInteger:=nb_trbn;
  frmMain.IBCQryRd.ParamByName('DATE_DEBUT').AsDateTime:=dt_tm;
  frmMain.IBCQryRd.ParamByName('DATE_FIN').AsDateTime:=dt_tm_fin;
  frmMain.IBCQryRd.Open;
  //Parcours de la plage des date par pas de 10'
  while (not frmMain.IBCQryRd.Eof) and (frmProgress.BoolAnnul=FALSE) do
  begin

      frmUpdtMnCrntAffectDataStatus.Label1.Caption:=InttoStr(frmMain.IBCQryRd.RecNo);

      if (cpt mod 500)=0 then
        Application.ProcessMessages;
       //trouve le status dominant
      try
      FindStatusDominant(ibcqry_status,code_status,nom_status,fam_arret_cnstrctr,fam_arret_valorem,prjt,frmMain.IBCQryRd.FieldByName('TURBINE').AsString,
                        frmMain.IBCQryRd.FieldByName('DATE_HEURE').AsDateTime);
      except
        showmessage('PROBLEME');
      end;
When iIBCQryRd.Recno reach 61000, access to frmMain.IBCQryRd.FieldByName('TURBINE') return an error.
With the debugger if i want to read the value i have an access violation.

The select return more than 200 000 records.

if i do the same thing when there are less than 55000 records, there is no problem

Thank you for help

Regards

calou
Posts: 116
Joined: Tue 27 May 2008 12:46

Post by calou » Thu 08 Jan 2009 18:09

Hello,

Here is my code

Code: Select all

function TfrmUtilBase.UpdateTblAffectDataStatus(prjt:string;dt_tm_deb,dt_tm_fin:TDateTime):boolean;
var
  dt_tm:TDateTime;
  yr,mnth,day,hr,min,sec,msec,nb_trbn,cpt:word;
  code_status,nom_status,fam_arret_cnstrctr,fam_arret_valorem:string;
  ibcqry_status:TIBCQuery;
  s:string;
begin
  cpt:=0;
  ibcqry_status:=TIBCQuery.Create(nil);
  ibcqry_status.Connection:=frmMain.IbcCnnx;
  ibcqry_status.AutoCommit:=FALSE;
  result:=TRUE;
  //Decode la date pour commencer à hr:00:00; Par exemple si dt_tm_deb= 10/09/08 06:25:00
  //on commence le 10/09/08 06:00:00
  DecodeDateTime(dt_tm_deb,yr,mnth,day,hr,min,sec,msec);
  dt_tm:=EncodeDateTime(yr,mnth,day,hr,0,0,0);
  //Trouve le nombre de turbines pour le projet
  frmMain.IBCQryRd.SQL.Text:='Select NB_TURBINE from PROJET where NOM_PROJET='+AnsiQuotedStr(prjt,'''');
  frmMain.IBCQryRd.Open;
  nb_trbn:=frmMain.IBCQryRd.FieldByName('NB_TURBINE').AsInteger;
  //Si transaction ouverte ferme avec un Rollback
  if frmMain.IBCTrnsctnRd.Active=TRUE then
    frmMain.IBCTrnsctnRd.Rollback;
  //Appel de la procédure stockée qui rempli par pas de 10'
  frmMain.IBCQryRd.SQL.Text:='SELECT * FROM P_DATA_STEP_10MIN(:DATE_DEBUT, :DATE_FIN,:NB_TURBINE,:PRJT )';
  frmMain.IBCQryRd.Prepare;
  frmMain.IBCQryRd.ParamByName('PRJT').AsString:=prjt;
  frmMain.IBCQryRd.ParamByName('NB_TURBINE').AsInteger:=nb_trbn;
  frmMain.IBCQryRd.ParamByName('DATE_DEBUT').AsDateTime:=dt_tm;
  frmMain.IBCQryRd.ParamByName('DATE_FIN').AsDateTime:=dt_tm_fin;
  frmMain.IBCQryRd.Open;

  if not frmMain.IBCTrnsctnWrt.Active then
  begin
    frmMain.IBCQryWrt.SQL.Text:='UPDATE OR INSERT INTO AFFECT_DATA_STATUS (DATE_HEURE, NOM_PROJET, REF_TURBINE_VALOREM, VITESSE_VENT_NACELLE, PUISS_ACTIVE_PRODUITE,'
                                +' TEMP_EXTERIEUR, CODE_STATUS, NOM_STATUS, FAMILLE_ARRET_CNSTRCTR, FAMILLE_ARRET_VALOREM, FAMILLE_ARRET_VALOREM_CORRIGE)'
                                +' VALUES( :DATE_HEURE, :NOM_PROJET, :REF_TURBINE_VALOREM, :VITESSE_VENT_NACELLE, :PUISS_ACTIVE_PRODUITE, :TEMP_EXTERIEUR, :CODE_STATUS,'
                                +' :NOM_STATUS, :FAMILLE_ARRET_CNSTRCTR, :FAMILLE_ARRET_VALOREM, :FAMILLE_ARRET_VALOREM_CORRIGE)'
                                +'matching(NOM_PROJET,REF_TURBINE_VALOREM,DATE_HEURE)';

      frmMain.IBCTrnsctnWrt.StartTransaction;
      frmMain.IBCQryWrt.Prepare;


    //Parcours de la plage des date par pas de 10'
    while (not frmMain.IBCQryRd.Eof) and (frmProgress.BoolAnnul=FALSE) do
    begin

        frmUpdtMnCrntAffectDataStatus.Label1.Caption:=InttoStr(frmMain.IBCQryRd.RecNo);

        if (cpt mod 500)=0 then
          Application.ProcessMessages;
         //trouve le status dominant
        try
        FindStatusDominant(ibcqry_status,code_status,nom_status,fam_arret_cnstrctr,fam_arret_valorem,prjt,frmMain.IBCQryRd.FieldByName('TURBINE').AsString,
                          frmMain.IBCQryRd.FieldByName('DATE_HEURE').AsDateTime);
        except
          showmessage('PROBLEME');
        end;
          try
            frmMain.IBCQryWrt.ParamByName('DATE_HEURE').AsDateTime:=frmMain.IBCQryRd.FieldByName('DATE_HEURE').AsDateTime;
            frmMain.IBCQryWrt.ParamByName('NOM_PROJET').AsString:=prjt;
            try
            frmMain.IBCQryWrt.ParamByName('REF_TURBINE_VALOREM').AsString:=frmMain.IBCQryRd.FieldByName('TURBINE').AsString;
            except
                    showmessage('TURBINE');
            end;
            frmMain.IBCQryWrt.ParamByName('VITESSE_VENT_NACELLE').AsFloat:=frmMain.IBCQryRd.FieldByName('VIT_VENT').AsFloat;
            frmMain.IBCQryWrt.ParamByName('PUISS_ACTIVE_PRODUITE').AsFloat:=frmMain.IBCQryRd.FieldByName('PUISS_ACTIVE').AsFloat;
            frmMain.IBCQryWrt.ParamByName('TEMP_EXTERIEUR').AsFloat:=frmMain.IBCQryRd.FieldByName('TEMP_EXT').AsFloat;
            frmMain.IBCQryWrt.ParamByName('CODE_STATUS').AsString:=code_status;
            frmMain.IBCQryWrt.ParamByName('NOM_STATUS').AsString:=nom_status;
            frmMain.IBCQryWrt.ParamByName('FAMILLE_ARRET_CNSTRCTR').AsString:=fam_arret_cnstrctr;
            frmMain.IBCQryWrt.ParamByName('FAMILLE_ARRET_VALOREM').AsString:=fam_arret_valorem;
            frmMain.IBCQryWrt.ParamByName('FAMILLE_ARRET_VALOREM_CORRIGE').AsString:=fam_arret_valorem;
            frmMain.IBCQryWrt.Execute;
          except
            on E:EIBCError  do
            begin
             frmMain.IBCTrnsctnWrt.Rollback;
             result:=false;
             //Mémorise la donnée en cas d'erreur pour la mettre dans le fichier txt
             s:='AFFECT DATA STATUS '+prjt+' '+frmMain.IBCQryRd.FieldByName('TURBINE').AsString+' '+frmMain.IBCQryRd.FieldByName('DATE_HEURE').AsString;
             //complete le fichier d'erreur
             frmFileData.FillFileError(s);
             exit;
            end;
          end;//fin du try except
          //frmMain.IBCTrnsctnWrt.Commit; if commit here bug at 60000 records

      frmMain.IBCQryRd.Next;
      Inc(cpt);
    end;//fin boucle while parcours de la plage

  frmMain.IBCTrnsctnWrt.Commit; //if commmit here bug at 75000 records

  end;//fin du if transactino active
  frmMain.IBCQryRd.UnPrepare;
  frmMain.IBCQryWrt.UnPrepare;
  //Si transaction ouverte ferme avec un Rollback
  if frmMain.IBCTrnsctnRd.Active=TRUE then
    frmMain.IBCTrnsctnRd.Rollback;
  FreeAndNil(ibcqry_status);
When iIBCQryRd.Recno reach 60000, access to frmMain.IBCQryRd.FieldByName('TURBINE') return an error.
With the debugger if i want to read the value i have an access violation.

If i place the commit after the while loop, the bug reach at 75000.
If i don't do update or insert but still doing the while loop by writing
IBCQryRd.FieldByName('TURBINE').AsString in a text file there is no problem.

The select return more than 200 000 records.

Thank you for help

Regards

calou
Posts: 116
Joined: Tue 27 May 2008 12:46

Post by calou » Fri 09 Jan 2009 09:02

Hello,

After a reboot i reach 100000 records. I continue my tests

Regards

calou
Posts: 116
Joined: Tue 27 May 2008 12:46

Post by calou » Mon 12 Jan 2009 20:46

Ok, it works good.
No problem after reboot

Regards

Post Reply