Access Violation when comparing oldvalue and newvalue (persistent memo field) in the onbeforepost event

Discussion of open issues, suggestions and bugs regarding MyDAC (Data Access Components for MySQL) for Delphi, C++Builder, Lazarus (and FPC)
Post Reply
swierzbicki
Posts: 451
Joined: Wed 19 Jan 2005 09:59

Access Violation when comparing oldvalue and newvalue (persistent memo field) in the onbeforepost event

Post by swierzbicki » Fri 13 Jun 2008 08:16

I'm posting an issue here as I'm unable to reach the support via mail (i'm getting things like this (pop.crlab.com: 553 sorry, this recipient is not in my validrcptto list (#5.7.1))).

An access violation is occuring when comparing oldvalue and newvalue (in my case it is an persistent memo field, the access violation appears with the oldvalue property) in the onbeforepost event.

This used to works until MyDAC 5.20.0.14

How to reproduce the issue :
Add an dbmemo component
Add an MyQuery component
Add an Myconnection component
Add an Datasource component
Add an DBNavigator component

Link all these component to the corresponding datasource
Link the dbmemo to the commentairedevis field

Run the app.
Edit the table.
change the blob (add a space for example)
Post the value

You will get an access violation.

I'm using MySQL community server 5.0.51a

Here is the code to put in the onbeforepost event

Code: Select all

procedure TForm1.MyQuery1BeforePost(DataSet: TDataSet);
var
  i: Integer;
  ChampsMod: TStringList;
begin
  ChampsMod := TStringList.Create;
  try
    for i := 0 to Dataset.Fields.Count - 1 do
    begin
    if (Dataset.Fields[i].newValue  Dataset.Fields[i].OldValue) and not (Dataset.Fields[i].DataType in [ftBlob, ftMemo, ftGraphic,
          ftFmtMemo])
        then
        ChampsMod.Add('Le champ ' + Dataset.Fields[i].DisplayLabel + ' [' +
          Dataset.Fields[i].fieldname + '] est passé de la valeur "'
          + VarToStr(Dataset.Fields[i].OldValue) + '" à la valeur "' +
            VarToStr(Dataset.Fields[i].newValue) + '"');
    end;

  finally
    ChampsMod.free;
  end;
end;
Here is the script that generate Table + Data

Code: Select all

CREATE TABLE `affaires` (
  `IdAffaire` int(11) NOT NULL auto_increment,
  `IdDevis` int(11) default NULL,
  `IdClient` int(11) default NULL,
  `IdEtude` int(11) default NULL,
  `DateCreation` datetime default NULL,
  `DateModification` datetime default NULL,
  `Utilisateur` varchar(16) default NULL,
  `ModificationUtilisateur` varchar(16) default NULL,
  `IdStade` tinyint(4) default NULL,
  `IdAffaireFE2000Agence` varchar(8) default NULL,
  `IdAgence` char(3) default NULL,
  `IdCommercial` varchar(4) default NULL,
  `IdConditionLivraison` char(3) default NULL,
  `IdConditionReglement` varchar(10) default NULL,
  `IdConditionPaiement` varchar(10) default NULL,
  `ReferenceChantier` varchar(100) default NULL,
  `LotConcerne` varchar(100) default NULL,
  `TauxTVA` double(15,2) default '0.00',
  `CommentaireDevis` mediumtext,
  `DateDevis` datetime default NULL,
  `DateDuplication` datetime default NULL,
  `DateDevisSource` datetime default NULL,
  `DateFinVie` datetime default NULL,
  `MargeMini` double(15,3) default '1.000',
  `TauxHoraireMO` double(15,2) default '0.00',
  `FraisAgence` double(15,3) default '1.000',
  `MargeDivers` double(15,3) default '1.000',
  `DescriptifDevis` mediumtext,
  `DateRelance` datetime default NULL,
  `DatePreCommande` datetime default NULL,
  `DateCommande` datetime default NULL,
  `DateAnnulationCommande` datetime default NULL,
  `DateSignatureAffaire` datetime default NULL,
  `DateRealisationSouhaitee` datetime default NULL,
  `IdDevisOriginal` int(11) default NULL,
  `IdVariante` int(11) default NULL,
  `IdRepartitionBenne` int(11) default NULL,
  `IdRepartitionLocation` int(11) default NULL,
  `IdRepartitionDivers` int(11) default NULL,
  `FraisProrata` double(15,3) default '1.000',
  `ForfaitHT` double(15,2) default '0.00',
  `PRETotalProduitHT` double(15,2) default '0.00',
  `PRETotalPoseHT` double(15,2) default '0.00',
  `PVFTotalProduitHT` double(15,2) default '0.00',
  `PVFTotalPoseHT` double(15,2) default '0.00',
  `ProrataTotalProduitHT` double(15,2) default '0.00',
  `ProrataTotalPoseHT` double(15,2) default '0.00',
  `Avenant` tinyint(1) default NULL,
  `IdCommandeClient` varchar(50) default NULL,
  `DateCommandeClient` datetime default NULL,
  `IdTypeAvancement` int(11) default NULL,
  `PaiementDirectSousTraitantPose` tinyint(1) default '0',
  `DateDerniereSituation` datetime default NULL,
  `DateEmissionSituation` int(11) default NULL,
  `DateLimiteReceptionSituation` int(11) default NULL,
  `DatePremiereSituation` datetime default NULL,
  `NbMoisDeroulementChantier` int(11) default NULL,
  `NbExemplaireSituation` int(11) default NULL,
  `NomBanqueMobilisation` varchar(100) default NULL,
  `AdresseChantier` varchar(50) default NULL,
  `VilleChantier` varchar(50) default NULL,
  `CodePostalChantier` varchar(10) default NULL,
  `PaysChantier` varchar(25) default NULL,
  `TexteLibreChantier` varchar(50) default NULL,
  `AdresseFacturationClient` varchar(50) default NULL,
  `VilleFacturationClient` varchar(25) default NULL,
  `CodePostalFacturationClient` varchar(10) default NULL,
  `PaysFacturationClient` varchar(25) default NULL,
  `TexteLibreFacturationClient` varchar(50) default NULL,
  `FDVPRENegoceTotalHT` double(15,2) default '0.00',
  `FDVPREPoseTotalHT` double(15,2) default '0.00',
  `FDVPREProductionTotalHT` double(15,2) default '0.00',
  `FDVPVNegoceTotalHT` double(15,2) default '0.00',
  `FDVPVPoseTotalHT` double(15,2) default '0.00',
  `FDVPVProductionTotalHT` double(15,2) default '0.00',
  `FDVQuantiteMenuiserieTotal` double(15,2) default '0.00',
  `FDVNbHeureTotal` double(15,2) default '0.00',
  `FDVPRETotalHT` double(15,2) default '0.00',
  `FDVPVTotalHT` double(15,2) default '0.00',
  `FDVProrataTotalHT` double(15,2) default '0.00',
  `DateDernierCalcul` datetime default NULL,
  `IdConducteurTravaux` int(11) default NULL,
  `PourcentageProrataAffaire` double(15,5) default '0.00000',
  `PourcentageMetreAffaire` double(15,5) default '0.00000',
  `PourcentagePilotageAffaire` double(15,5) default '0.00000',
  `IdTypeMobilisation` int(11) default NULL,
  `IdBanqueMobilisation` int(11) default NULL,
  `PrevisionelFacturationM0` double(15,3) default '0.000',
  `PrevisionelFacturationM1` double(15,3) default '0.000',
  `PrevisionelFacturationM2` double(15,3) default '0.000',
  `PrevisionelFacturationM3` double(15,3) default '0.000',
  `CommentaireAnnulationCommande` varchar(100) default NULL,
  `IdCodeTournee` varchar(4) default NULL,
  `ExportFE2000` tinyint(1) default NULL,
  `ExportNavision` tinyint(1) default NULL,
  `DateDernierExportFE2000` datetime default NULL,
  `DateDernierExportNavision` datetime default NULL,
  `ExportChantier` tinyint(1) default NULL,
  `DateDernierExportChantier` datetime default NULL,
  `IdClientFE2000` varchar(10) default NULL,
  `FDVQuantiteChassisTotal` double(15,3) default '0.000',
  `PourcentagePUC` double(15,5) default '0.00000',
  `PourcentageRetenueGarantie` double(15,5) default '0.00000',
  `Actualisable` tinyint(1) default '0',
  `Revisable` tinyint(1) default '0',
  `IdTypeSituation` int(11) default '1',
  `CautionBancaire` tinyint(1) default '0',
  `FournitureSeule` tinyint(1) default '0',
  `PrevisionnelLancementM0` int(11) default '0',
  `PrevisionnelLancementM1` int(11) default '0',
  `PrevisionnelLancementM2` int(11) default '0',
  `PrevisionnelLancementM3` int(11) default '0',
  `MontantFactureHT` double(15,2) default '0.00',
  `IdTypeCharge` int(11) default '1',
  `ImpressionQuantiteOriginale` tinyint(1) default '0',
  `ImpressionInformationMobilisation` tinyint(1) default '0',
  `MasquerPrixUnitaire` tinyint(1) default '0',
  `MasquerTexteSituationTravaux` tinyint(1) default '0',
  `TexteAlternatifSituationTravaux` varchar(50) default NULL,
  `DecompteGeneralDefinitif` tinyint(1) default NULL,
  `DateReceptionPV` datetime default NULL,
  `PrevisionnelPaiementDirectM0` double(15,2) default '0.00',
  `PrevisionnelPoseM0` double(15,2) default '0.00',
  `AdresseFacturation2Client` varchar(50) default NULL,
  `TexteComplementaireEntete` varchar(50) default NULL,
  `TexteComplementaireEntete2` varchar(50) default NULL,
  `PourcentageActualisationAffaire` double(15,5) default '0.00000',
  `PourcentageRevisionAffaire` double(15,5) default '0.00000',
  `ReferenceChantierCourt` varchar(19) default NULL,
  `DateClotureFinanciere` datetime default NULL,
  PRIMARY KEY  (`IdAffaire`),
  KEY `IdClient` (`IdClient`),
  KEY `IdDevis` (`IdDevis`),
  KEY `IdEtude` (`IdEtude`),
  KEY `Avenant` (`Avenant`),
  KEY `ExportFE2000` (`ExportFE2000`),
  KEY `ExportNavision` (`ExportNavision`),
  KEY `IdClientFE2000` (`IdClientFE2000`),
  KEY `IdAffaire` (`IdAffaire`,`IdClientFE2000`),
  KEY `IdAgence` (`IdAgence`),
  KEY `IdCommercial` (`IdCommercial`),
  KEY `IdClient_2` (`IdClient`,`IdAffaire`),
  KEY `IdAgence_2` (`IdAgence`,`IdAffaire`),
  KEY `IdCommercial_2` (`IdCommercial`,`IdAffaire`),
  KEY `IdClientFE2000_2` (`IdClientFE2000`,`IdAffaire`),
  KEY `IdDevis_2` (`IdDevis`,`IdAgence`),
  KEY `IdDevis_3` (`IdDevis`,`IdCommercial`),
  KEY `IdDevis_4` (`IdDevis`,`IdAgence`,`IdCommercial`),
  KEY `IdAgence_3` (`IdAgence`,`IdCommercial`,`IdAffaire`),
  KEY `IdAffaire_2` (`IdAffaire`,`IdAgence`,`IdCommercial`),
  KEY `IdAffaire_3` (`IdAffaire`,`IdAgence`),
  CONSTRAINT `affaires_fk` FOREIGN KEY (`IdClient`) REFERENCES `clients` (`IdClient`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;




/* Data for the `affaires` table  (Records 1 - 1) */

INSERT INTO `affaires` (`IdAffaire`, `IdDevis`, `IdClient`, `IdEtude`, `DateCreation`, `DateModification`, `Utilisateur`, `ModificationUtilisateur`, `IdStade`, `IdAffaireFE2000Agence`, `IdAgence`, `IdCommercial`, `IdConditionLivraison`, `IdConditionReglement`, `IdConditionPaiement`, `ReferenceChantier`, `LotConcerne`, `TauxTVA`, `CommentaireDevis`, `DateDevis`, `DateDuplication`, `DateDevisSource`, `DateFinVie`, `MargeMini`, `TauxHoraireMO`, `FraisAgence`, `MargeDivers`, `DescriptifDevis`, `DateRelance`, `DatePreCommande`, `DateCommande`, `DateAnnulationCommande`, `DateSignatureAffaire`, `DateRealisationSouhaitee`, `IdDevisOriginal`, `IdVariante`, `IdRepartitionBenne`, `IdRepartitionLocation`, `IdRepartitionDivers`, `FraisProrata`, `ForfaitHT`, `PRETotalProduitHT`, `PRETotalPoseHT`, `PVFTotalProduitHT`, `PVFTotalPoseHT`, `ProrataTotalProduitHT`, `ProrataTotalPoseHT`, `Avenant`, `IdCommandeClient`, `DateCommandeClient`, `IdTypeAvancement`, `PaiementDirectSousTraitantPose`, `DateDerniereSituation`, `DateEmissionSituation`, `DateLimiteReceptionSituation`, `DatePremiereSituation`, `NbMoisDeroulementChantier`, `NbExemplaireSituation`, `NomBanqueMobilisation`, `AdresseChantier`, `VilleChantier`, `CodePostalChantier`, `PaysChantier`, `TexteLibreChantier`, `AdresseFacturationClient`, `VilleFacturationClient`, `CodePostalFacturationClient`, `PaysFacturationClient`, `TexteLibreFacturationClient`, `FDVPRENegoceTotalHT`, `FDVPREPoseTotalHT`, `FDVPREProductionTotalHT`, `FDVPVNegoceTotalHT`, `FDVPVPoseTotalHT`, `FDVPVProductionTotalHT`, `FDVQuantiteMenuiserieTotal`, `FDVNbHeureTotal`, `FDVPRETotalHT`, `FDVPVTotalHT`, `FDVProrataTotalHT`, `DateDernierCalcul`, `IdConducteurTravaux`, `PourcentageProrataAffaire`, `PourcentageMetreAffaire`, `PourcentagePilotageAffaire`, `IdTypeMobilisation`, `IdBanqueMobilisation`, `PrevisionelFacturationM0`, `PrevisionelFacturationM1`, `PrevisionelFacturationM2`, `PrevisionelFacturationM3`, `CommentaireAnnulationCommande`, `IdCodeTournee`, `ExportFE2000`, `ExportNavision`, `DateDernierExportFE2000`, `DateDernierExportNavision`, `ExportChantier`, `DateDernierExportChantier`, `IdClientFE2000`, `FDVQuantiteChassisTotal`, `PourcentagePUC`, `PourcentageRetenueGarantie`, `Actualisable`, `Revisable`, `IdTypeSituation`, `CautionBancaire`, `FournitureSeule`, `PrevisionnelLancementM0`, `PrevisionnelLancementM1`, `PrevisionnelLancementM2`, `PrevisionnelLancementM3`, `MontantFactureHT`, `IdTypeCharge`, `ImpressionQuantiteOriginale`, `ImpressionInformationMobilisation`, `MasquerPrixUnitaire`, `MasquerTexteSituationTravaux`, `TexteAlternatifSituationTravaux`, `DecompteGeneralDefinitif`, `DateReceptionPV`, `PrevisionnelPaiementDirectM0`, `PrevisionnelPoseM0`, `AdresseFacturation2Client`, `TexteComplementaireEntete`, `TexteComplementaireEntete2`, `PourcentageActualisationAffaire`, `PourcentageRevisionAffaire`, `ReferenceChantierCourt`, `DateClotureFinanciere`) VALUES 
  (11629, 5344, 1, 4380, '2007-11-21 10:47:24', '2008-06-12 16:18:26', 'Steph', 'Steph', 14, '75804099', 'A80', '8003', '002', 'BO', '30J20', 'XXX', NULL, 5.5, NULL, '2007-10-29', NULL, NULL, NULL, 1, 0, 1, 1, '{\rtf1\ansi\deff0{\fonttbl{\f0\fnil\fcharset0 MS Sans Serif;}{\f1\fnil MS Sans Serif;}}\r\n\viewkind4\uc1\pard\lang1036\f0\fs20                                                     A l'' attention de MR XXX\f1\par\r\n\par\r\n\f0 Monsieur,\f1\par\r\n\par\r\n\f0 Par l\'e0 pr\'e9sente, nous vous prions de bien vouloir trouver ci-joint notre devis en fourniture et pose de menuiseries ext\'e9rieures en P.V.C. blanc, profil r\'e9novation dans la gamme XXX.\f1\par\r\n\par\r\n\f0 Notre offre comprend:\f1\par\r\n\f0 Double vitrage en 4/16/4 sur toutes les menuiseries en P.V.C., et en 44.2/12/44.2 sur les portes en aluminium.\f1\par\r\n\f0 Habillage ext\'e9rieur sur 4 c\'f4t\'e9s, par corni\'e8res en P.V.C. blanc.\f1\par\r\n\f0 D\'e9pose des ouvrants ainsi que des parties fixes, mise en d\'e9charge agr\'e9er.\f1\par\r\n\f0 Fourniture et mise en oeuvre des accessoires de pose ainsi que des joints d'' \'e9tanch\'e9it\'e9.\f1\par\r\n\f0 Protection des fa\'e7ades par barri\'e8res poser sur plot b\'e9ton, \'e9chaffaudage de pied ou volant le cas \'e9ch\'e9ant.\f1\par\r\n\f0 Chass\'ees pompier suivant fa\'e7ade, porte en aluminum, store int\'e9rieur et ext\'e9rieur, le tout suivant C.C.T.P.\f1\par\r\n\f0 Type de menuiserie suivant carnet de menuiseries 06.\f1\par\r\n\f0 Prorata de pr\'e9vue dans notre offre.\f1\par\r\n\par\r\n\f0 Variante:\f1\par\r\n\f0 01, coulissant en aluminium.\f1\par\r\n\f0 02, chass\'ees en P.V.C., \'e0 2 vantaux en oscillo battant, comprenant une poign\'e9e \'e0 clef permettant l'' ouverture \'e0 la fran\'e7aise uniquement pour le nettoyage.\f1\par\r\n\par\r\n\f0 Dans l'' attente, nous vous prions d'' agr\'e9er, monsieur, nos salutations les meilleures.\f1\par\r\n\f0  \f1\par\r\n\f0                                                                 Le Service Commercial\f1\par\r\n\f0                                                                     XXX\f1\par\r\n\f0                                                                 Le Service Client\'e8le\f1\par\r\n\f0                                                                     XXX\f1\par\r\n\par\r\n\par\r\n}\r\n\0', NULL, '2007-11-21 10:47:13', NULL, NULL, NULL, '2007-10-29', 5344, 1, NULL, NULL, NULL, 1, 0, 145919.47, 64200, 183564.17, 80763.58, 0, 0, NULL, NULL, NULL, 1, 0, '2007-11-21', 0, 0, '2007-11-30', NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, 'XXX', 'XXX', 'XXX', '', 'XXX', 63032.49, 64200, 82886.98, 79293.86, 80762.57, 104270.5, 358, 1605, 210119.47, 264326.93, 0, NULL, NULL, 0, 0, 0, 1, NULL, 0, 0, 0, 0, NULL, '08Z1', NULL, 1, NULL, NULL, 1, '2007-12-11 20:00:18', 'SI00011629', 358, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 79298.33, 1, 0, 0, 0, 0, '', NULL, NULL, 0, 0, '', '', '', 0, 0, NULL, NULL);

swierzbicki
Posts: 451
Joined: Wed 19 Jan 2005 09:59

Post by swierzbicki » Sat 14 Jun 2008 11:04

Hi,

It looks like the new 5.50.0.35 release solves this issue.
I'll do further tests on monday

swierzbicki
Posts: 451
Joined: Wed 19 Jan 2005 09:59

Post by swierzbicki » Tue 17 Jun 2008 16:03

After some test (software sended to a co-worker) this issue seems to be really solved. Great :P

Post Reply