Précédent   Forum des professionnels en informatique > Bases de données > Firebird > Connexion aux bases de données
Connexion aux bases de données Forum d'entraide sur la connectivité Firebird: composants, drivers, transactions, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/08/2004, 12h03   #1
Membre actif
 
Inscription : juillet 2003
Messages : 257
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 257
Points : 162
Points : 162
Par défaut Violation d'acces apres Execute

Bonjour,

j'ai un prob depuis un bon moment que je n'arrive pas à expliquer:

J'affiche dans une Grid par exemple le resultat d'un querySelect : select...
et j'ai un bouton qui lance une Update.

dans l'evenement du bouton je met:
ClientDataSet.CommandText := 'update...';
ClientDataSet.Execute;

Jusqu'au la tout va bien et si je clique sur un bouton tout deroule tres bien, et la base est bien mise a jour.

Mais si je met une ligne de code apres l'execute, elle declenche automatiquement une violation d'acces. Meme si c juste un changement d'onglet.

est ce quelqu'un comprend quelque chose? Merci d'avance
SegmentationFault est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2004, 14h28   #2
Membre confirmé
 
Avatar de TMuet
 
Homme Olivier Muet
Responsable de service informatique
Inscription : septembre 2003
Messages : 222
Détails du profil
Informations personnelles :
Nom : Homme Olivier Muet
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2003
Messages : 222
Points : 254
Points : 254
Par défaut Re: Violation d'acces apres Execute

Citation:
Envoyé par SegmentationFault
est ce quelqu'un comprend quelque chose
Oh oui

Par contre l'origine du problème n'est pas forcément très simple. Elle n'est d'ailleurs très probablement pas liée à Interbase.

Est-ce une violation en lecture ou en écriture :

Le problème provient souvent d'un objet utilisé alors qu'il a été précédemment désalloué.
Rien de tel que FreeAndNil au lieu de Free pour les mettre en évidence
TMuet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2004, 15h36   #3
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
Si tu peux nous faire voir la portion de code ou ça foire, la je pense qu'on pourra t'aider plus.

A+
__________________
On progresse .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2004, 16h04   #4
Membre actif
 
Inscription : juillet 2003
Messages : 257
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 257
Points : 162
Points : 162
procedure TfrmFDNC.Rinitialiserenattente1Click(Sender: TObject);
var
li: integer;
begin
Screen.Cursor := crHourGlass;
try
li := qryListFDNCW1_C1.AsInteger;

DM.cdsqryTemp.Close;
DM.cdsqryTemp.CommandText := 'update W1 set ' +
'W1_C9=1, W1_C10=NULL, W1_C11=NULL, W1_C12=NULL, W1_C13=NULL, ' + 'W1_C14=NULL, W1_C15=NULL, W1_C16=NULL, W1_C17=NULL, W1_C18=NULL, ' + 'W1_C20=NULL, W1_C21=NULL where W1_C1=:vFDNC';
DM.checkParam(DM.cdsqryTemp, 'vFDNC').AsInteger := li;
DM.cdsqryTemp.Execute;

//Refresh
qryListFDNC.Close;
qryListFDNC.Open;
qryListFDNC.Locate('W1_C1', li, []);
finally
Screen.Cursor := crDefault;
end;
end;

bein pour le checkParam, c un truc simple:

function TDM.checkParam(qry: TClientDataSet; nomParam: string): TParam;
begin
Result := qry.Params.FindParam(nomParam);
if Result = nil then
Result := qry.Params.CreateParam(ftUnknown, nomParam, ptUnknown);
end;

et c'est la ligne : qryListFDNC.Close qui déclenche l'exception!!!
SegmentationFault est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2004, 16h11   #5
Membre actif
 
Inscription : juillet 2003
Messages : 257
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 257
Points : 162
Points : 162
Laissez moi vous dire un truc plus surprennant encore! sur d'autres exemples similaire où j'avais le meme probleme, je prend tout le code avant "Execute" et je le transforme a une procedure.
Dans ma fonctionne principale, j'appelle cette procedure! Et bein, ca marche et ca ne declenche plus d'erreurs. ne me demandez pas pq car je ne sais pas!

pour l'exemple que je vous ai envoyé, ca ne fonctionne pas
SegmentationFault est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2004, 16h12   #6
Membre émérite
 
Avatar de Andry
 
Inscription : juillet 2002
Messages : 1 109
Détails du profil
Informations personnelles :
Localisation : Madagascar

Informations forums :
Inscription : juillet 2002
Messages : 1 109
Points : 949
Points : 949
Envoyer un message via MSN à Andry
Citation:
Envoyé par SegmentationFault
procedure
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
TfrmFDNC.Rinitialiserenattente1Click(Sender: TObject);
var
  li: integer;
begin
  Screen.Cursor := crHourGlass;
  try
    li := qryListFDNCW1_C1.AsInteger;
 
    DM.cdsqryTemp.Close;
    DM.cdsqryTemp.CommandText := 'update W1 set ' +
    'W1_C9=1, W1_C10=NULL, W1_C11=NULL, W1_C12=NULL, W1_C13=NULL, ' + 'W1_C14=NULL, W1_C15=NULL, W1_C16=NULL, W1_C17=NULL, W1_C18=NULL, ' + 'W1_C20=NULL, W1_C21=NULL where W1_C1=:vFDNC'; 
  DM.checkParam(DM.cdsqryTemp, 'vFDNC').AsInteger := li;
  DM.cdsqryTemp.Execute;
 
    //Refresh
    qryListFDNC.Close;
    qryListFDNC.Open;
    qryListFDNC.Locate('W1_C1', li, []);
  finally
    Screen.Cursor := crDefault;
  end;
end;
bein pour le checkParam, c un truc simple:
Code :
1
2
3
4
5
6
7
 
FUNCTION TDM.checkParam(qry: TClientDataSet; nomParam: string): TParam;
begin
  Result := qry.Params.FindParam(nomParam);
  IF Result = nil then
    Result := qry.Params.CreateParam(ftUnknown, nomParam, ptUnknown);
end;
et c'est la ligne : qryListFDNC.Close qui déclenche l'exception!!!
Comme ça c'est bien plus clair à voir
SI j'ai bien compris, tu utilise QryListFDNC pour avoir l'identifiant pour l'update (avec cdsqryTemp).

Tu utilise quoi comme composant d'accès au données : ADO, IBS, etc ?

A+
__________________
On progresse .....
Andry est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2004, 16h23   #7
Membre actif
 
Inscription : juillet 2003
Messages : 257
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 257
Points : 162
Points : 162
cdsqryTemp et qryListFDNC sont des ClientDataSet qui sont liés à leur tour à des TIBQuery.
SegmentationFault est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h47.


 
 
 
 
Partenaires

Hébergement Web