BlueGEEK Journal

Accueil > Manip’s > Delphi > ACCESS > "cette opération n’est pas autorisée si l’objet est ouvert"

Delphi,AdoConnection

"cette opération n’est pas autorisée si l’objet est ouvert"

Erreur

mercredi 29 décembre 2010, par bluegyn_spip

"cette opération n’est pas autorisée si l’objet est ouvert"

- Message d’erreur renvoyé après l’instruction

  • AdoConnection1.Connected := True

Type Erreur :

- Avertissement non fatal

- Mais très agaçant !

RAISON

- Une autre instruction a déjà ouvert la Base de façon implicite

SOLUTION

- La solution n’est pas dans le code UNIT

- Mais dans le code PROGRAM

- Program correspond aux quelques lignes de code Pascal contenues dans le fichier project.dpr

- Projet.dpr s’ouvre par le menu :

  • Projet
    • Voir le source

- Ce fichier source de gestion de stock génère une erreur qui interdit et l’ouverture et la fermeture de la connexion par programmation.

- program gynstock ;

- uses

  • Forms,
  • Unit1 in ’Unit1.pas’ Form1,
  • DataModule in ’DataModule.pas’ DataModule1 : TDataModule,
  • Unit2 in ’Unit2.pas’ Form_STOCK,
  • Unit3 in ’Unit3.pas’ Form_TABLES,
  • Unit4 in ’Unit4.pas’ Form_FOURNISSEURS ;

- $R *.res

  • begin
  • Application.Initialize ;
  • Application.Title := ’GynStock’ ;
  • ApplicationCreateForm(TDataModule1, DataModule1) ;
  • Application.CreateForm(TForm1, Form1) ;
  • Application.CreateForm(TForm_STOCK, Form_STOCK) ;
  • Application.CreateForm(TForm_TABLES, Form_TABLES) ;
  • Application.CreateForm(TForm_FOURNISSEURS, Form_FOURNISSEURS) ;
  • Application.Run ;

- end.


- Ce fichier est débogué et ne génère plus l’erreur,

  • Or une seule une ligne a été replacée

- program gynstock ;

- uses

  • Forms,
  1. Unit1 in ’Unit1.pas’ Form1,
  1. DataModule in ’DataModule.pas’ DataModule1 : TDataModule,
  1. Unit2 in ’Unit2.pas’ Form_STOCK,
  1. Unit3 in ’Unit3.pas’ Form_TABLES,
  1. Unit4 in ’Unit4.pas’ Form_FOURNISSEURS ;

- $R *.res

- begin

  • Application.Initialize ;
  • Application.Title := ’GynStock’ ;
  1. Application.CreateForm(TForm1, Form1) ;
  1. Application.CreateForm(TDataModule1, DataModule1) ;
  1. Application.CreateForm(TForm_STOCK, Form_STOCK) ;
  1. Application.CreateForm(TForm_TABLES, Form_TABLES) ;
  1. Application.CreateForm(TForm_FOURNISSEURS, Form_FOURNISSEURS) ;
  • Application.Run ;

- end.


- Le DataModule contenant les Tables et gérant la connexion

  • était en première position dans la section Begin
  • Alors qu’il était déclaré en seconde dans la section Use

- Son placement dans l’ordre :

  • APRES form1
  • Fixe le gag

- Car le DataModule est Utilisé dans le code Unit1 du Form1 (MainForm)

- La création du Form1 doit donc précéder la tentative de connexion.



- Il est alors simple de placer un test simple dans le Create du DataModule,

- if Adoconnection1.Connected = True then AdoConnection1.Close ;