Gestion d'erreurs dans Engine.Data

2005-08-08 #qc

Modification de Engine.Data pour reconnaitre et gérer un message d'erreur spécial pour les 4 types d'erreurs suivantes :

  • pkviolation : enregistrement déjà existant,
  • nullvalue : champ obligatoire non renseigné,
  • fkviolation : enregistrement parent inexistant (en insertion/màj),
  • fkchildren : existence d'enregistrements enfants (en suppression).

Prise en compte des différents codes / numéros / statuts d'erreurs pour las base de données Access, MySQL, PostgreSQL, Oracle et SqlServer / MSDE.

Réalisation d'un script de test pour vérifier que tout est OK quelle que soit la base :

/*
  -------------------- Drop tests tables
*/
DROP TABLE test_Childs;
GO;
DROP TABLE test_Parents;
GO;

/*
  -------------------- test_Parents
*/
CREATE TABLE test_Parents (
  idParent AUTOINCREMENT,
  caption TEXT(255) NOT NULL,
  etcetera TEXT(255) NOT NULL,
  CONSTRAINT PK_Parents PRIMARY KEY (idParent)
);
GO;

/*
  -------------------- test_Childs
*/
CREATE TABLE test_Childs (
  idChild AUTOINCREMENT,
  idParent INT NOT NULL,
  caption TEXT(255) NOT NULL,
  CONSTRAINT PK_Childs PRIMARY KEY (idChild)
);
GO;
ALTER TABLE test_Childs
ADD CONSTRAINT FK_Parents
FOREIGN KEY (idParent)
REFERENCES test_Parents (idParent)
ON UPDATE CASCADE; 
GO;

/*
  -------------------- test_Parents
*/
/* No error */
INSERT INTO test_Parents (caption, etcetera)
VALUES ('Un', '...');
GO;
/* No error */
INSERT INTO test_Parents (caption, etcetera)
VALUES ('Deux', '...');
GO;
/* nullvalue */
INSERT INTO test_Parents (caption)
VALUES ('Trois');
GO;
/* nullvalue */
INSERT INTO test_Parents (caption, etcetera)
VALUES ('Trois', NULL);
GO;
/* pour sql-server */
SET IDENTITY_INSERT test_Parents ON;
GO;
/* pkviolation */
INSERT INTO test_Parents (idParent, caption, etcetera)
VALUES (1, 'Premier', '...');
GO;

/*
  -------------------- test_Childs
*/
/* No error */
INSERT INTO test_Childs (idParent, caption)
VALUES (1, '1-Un');
GO;
/* No error */
INSERT INTO test_Childs (idParent, caption)
VALUES (2, '2-Deux');
GO;
/* fkchildren */
INSERT INTO test_Childs (idParent, caption)
VALUES (99, '90-Neuf');
GO;

/*
  -------------------- test_Parents
*/
/* No error */
DELETE FROM test_Parents WHERE idParent = 1;
GO;

/*
  -------------------- Drop tests tables
*/
DROP TABLE test_Childs;
GO;
DROP TABLE test_Parents;
GO;

Ce test doit générer les 5 erreurs suivantes :

* INSERT INTO test_Parents (caption) VALUES ('Trois');
=> Erreur: Un champ obligatoire de la fiche n'est pas renseigné.
* INSERT INTO test_Parents (caption, etcetera) VALUES ('Trois', NULL);
=> Erreur: Un champ obligatoire de la fiche n'est pas renseigné.
* INSERT INTO test_Parents (idParent, caption, etcetera) VALUES (1,
'Premier', '...');
=> Erreur: Cette fiche existe déjà dans la base de données.
* INSERT INTO test_Childs (idParent, caption) VALUES (99, '90-Neuf');
=> Erreur: Certains éléments liés à cette fiche n'existent pas dans la base de données.
* DELETE FROM test_Parents WHERE idParent = 1;
=> Erreur: Ces informations sont utilisées dans une autre fiche.

Bizarrerie : la requête <INSERT INTO test_Parents (caption) VALUES ('Trois');> ne provoque pas d'erreur avec MySQL (version 4.1 sous Windows tout du moins).