Access Violation when comparing oldvalue and newvalue (persistent memo field) in the onbeforepost event
Posted: 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
Here is the script that generate Table + Data
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;
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);