Accueil > Forum > > > > Pb objet Eaccess violation 004B8620
Pb objet Eaccess violation 004B8620
mardi 23 janvier 2007 à 17:28:40 |
Pb objet Eaccess violation 004B8620

martChamp
|
Bonjour à tous,
Dans un programme que je devellope, j'utilise une classe objet (intervenant) qui a pour attribut un tableau d'objet (poste)
Description class intervenant
type intervenant = class ( TObject )
private
Nom : string; Prenom : string; Adresse1 : string; Adresse2 : string; Email : string; DateNaiss : string; LieuNaiss : string; Nationalite : String; NumSecu : string; NumConge : string; Tel : string; Fax : string; Portable : string; DateEmbauche : string; lesposte : Array of poste; nbposte : integer;
Plus loing dans une procedure je me sert de ma base de donnée pour initialiser mon objet intervenant
procedure intervenant.loadSQL(idinter : integer);
begin with bdd.ModuleBDD.ADOQuery_traitementint do begin Active := false; SQL.Clear; SQL.Add('SELECT * FROM intervenant WHERE idintervenant LIKE "'+ inttostr(idinter) +'"'); Active := true; end;
Adresse1 := bdd.ModuleBDD.ADOQuery_traitementint.fields[3].AsString; Nationalite := bdd.ModuleBDD.ADOQuery_traitementint.fields[11].AsString; LieuNaiss := bdd.ModuleBDD.ADOQuery_traitementint.fields[10].AsString; Adresse2 := bdd.ModuleBDD.ADOQuery_traitementint.fields[4].AsString; Tel := bdd.ModuleBDD.ADOQuery_traitementint.fields[5].AsString; Fax := bdd.ModuleBDD.ADOQuery_traitementint.fields[6].AsString; Portable := bdd.ModuleBDD.ADOQuery_traitementint.fields[7].AsString; Email := bdd.ModuleBDD.ADOQuery_traitementint.fields[8].AsString; Nom := bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString; Prenom := bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsString; DateNaiss := bdd.ModuleBDD.ADOQuery_traitementint.fields[9].AsString; NumSecu := bdd.ModuleBDD.ADOQuery_traitementint.fields[12].AsString; NumConge := bdd.ModuleBDD.ADOQuery_traitementint.fields[13].AsString; dateEmbauche := bdd.ModuleBDD.ADOQuery_traitementint.fields[14].AsString;
with bdd.ModuleBDD.ADOQuery_traitementint do begin Active := false; SQL.Clear; SQL.Add('SELECT nomposte, cnc, idintervenant FROM intervenant_poste, poste WHERE intervenant_poste.numposte = poste.numposte AND idintervenant LIKE "'+ inttostr(idInter) +'"'); Active := true; first; while not eof do begin nbposte := nbposte + 1; lesposte[nbposte] := poste.creer(bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsInteger,idinter,bdd.ModuleBDD.ADOQuery_traitementint.fields[0].AsString,bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString); next; end; end; end;
Delphi me fait une erreur eaccess violation a la ligne mis en rouge, je ne vois pas pk, je pensse que cela vien d'un probléme de pointeur!!!
Je compte sur vous pour méclairer dautant que je suis debutant un delphi. Merci d'avance
|
|
mardi 23 janvier 2007 à 19:38:52 |
Re : Pb objet Eaccess violation 004B8620

jace1975
|
yo,
déjà ton code pas très clair avec tes dd.ModuleBDD.ADOQuery_traitementint bon c'est pas tres grave mais c'est chiant a lire sur 20 lignes alors 50000 je te raccontes pas
sur ton problème, je vois deux choses : - tu utilises un objet poste, mis je ne vois pas dans ton code un truc du genre poste:=tposte.create( param);
donc forcément tu essaye d'acceder à une procédure de ton objet poste qui n'a pas été défini en mémoire donc....
- array of poste , mouais pourquoi pas mais ton tableau n'est jamais défini ni dynamiquement ni à la déclaration donc ca risque de coincer aussi ici ( perso y'a longtemps que j'ai abandonné les array pour gérer des object -> tobjectlist )
tschusssss
|
|
mardi 23 janvier 2007 à 19:55:36 |
Re : Pb objet Eaccess violation 004B8620

Guillemouze
|
il faut que tu fasse un SetLength(lesposte, TAILLE) pour allouer des emplacements memoire à ton tableau dynamique. NB: les indices de ton tableau commencent à 0. NB : jette un coup d'oeil a l'aide : tableaux dynamiques => tableaux dynamiques (Reference du langage delphi)
nbPoste := 0; with bdd.ModuleBDD.ADOQuery_traitementint do begin Active := false; SQL.Clear; SQL.Add('SELECT
nomposte, cnc, idintervenant FROM intervenant_poste, poste
WHERE intervenant_poste.numposte = poste.numposte AND idintervenant
LIKE "'+ inttostr(idInter) +'"'); Active := true; first; while not eof do begin nbposte := nbposte + 1; setLength(lesposte, nbposte); lesposte[nbposte-1]
:=
poste.creer(bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsInteger,idinter,bdd.ModuleBDD.ADOQuery_traitementint.fields[0].AsString,bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString); next; end; end;
|
|
mardi 23 janvier 2007 à 20:00:01 |
Re : Pb objet Eaccess violation 004B8620

Delphiprog
|
Réponse acceptée !
Ton Tableau lesposte n'est pas dimensionné ! 1/ Soit tu lui attribues une taille dans le constructeur de la classe intervenant si tu la connais lors de l'instanciation d'un objet intervenant. Au passge, essaie d'utiliser la convention d'écriture utilisée par Borland en mettant un "T" devant le nom de la classe. Cela permet de distinguer entre l'instance de la classe et la classe et d'éviter les erreurs de débutants. 2/ soit tu le dimensionnes automatiquement dans le code begin nbposte := nbposte + 1; //redimensionner le tableau dynamiquement SetLength(lesposte, nbposte); lesposte[nbposte] := poste.creer(bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsInteger,idinter,bdd.ModuleBDD.ADOQuery_traitementint.fields[0].AsString,bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString); next;3/ soit tu utilises un descendant de la classe TObject comme TList, TComponentList ou TObjectList, etc qui facilite la gestion des références et la désallocation de mémoire de manière automatique... De grâce, utilises le mot clé With pour alléger ton code et le rendre plus lisible...  Un dernier conseil : évites d'utiliser les champs par leur index retournés par une requête. Si ta base est restructurée, tout ton code est à revoir... Exemple : au lieu de Adresse1 := bdd.ModuleBDD.ADOQuery_traitementint.fields[3].AsString;Tu peux écrire : with bdd.ModuleBDD.ADOQuery_traitementint do begin Adresse1 := FieldByName('Adresse1').AsString; //...la suite end;
De cette manière le code est largement plus lisible et plus facile à maintenir. Enfin ,si je puis me permettre un dernier conseil d'optimisation, est-ce bien utile d'utiliser un prédicat comme Like (très gourmand en temps de traitement) dans tes requêtes SQL quand il ne s'agit que de comparer avec une valeur entière ? 'SELECT * FROM intervenant WHERE idintervenant LIKE "'+ inttostr(idinter) +'"'
Suggestion : 'SELECT * FROM intervenant WHERE idintervenant = '+ inttostr(idinter) +'''
Bon courage pour la suite  May Delphi be with you !
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient. 
|
|
mardi 23 janvier 2007 à 20:04:09 |
Re : Pb objet Eaccess violation 004B8620

Delphiprog
|
Erratum : au lieu de : lesposte[nbposte] := poste.creer(bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsInteger,idinter,bdd.ModuleBDD.ADOQuery_traitementint.fields[0].AsString,bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString);
Il faut lire : lesposte[nbposte - 1] := poste.creer(bdd.ModuleBDD.ADOQuery_traitementint.fields[2].AsInteger,idinter,bdd.ModuleBDD.ADOQuery_traitementint.fields[0].AsString,bdd.ModuleBDD.ADOQuery_traitementint.fields[1].AsString);Je suis tout à fait d'accord avec jayce1975 pour dire ques tableaux c'est bien et qu' il y a très longtemps que je ne les utilise plus non plus. May Delphi be with you !
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient. 
|
|
mardi 23 janvier 2007 à 20:07:35 |
Re : Pb objet Eaccess violation 004B8620

Guillemouze
|
j'ai ete si lonb que ca a repondre !!!
@jace : - je ne vois pas de variable "poste", je vois bien un intervenant.loadSQL. Et si l'objet n'existait pas, ca aurait planté sur une ligne precedente, comme Adresse1 := bdd.ModuleBDD.ADOQuery_traitementint.fields[3].AsString; par exemple - il est vrai que dans ce cas, une TObjectList serait plus appropriée
De plus je ne vois pas de fermeture de tes requetes SQL. un petit ADOQuery_traitementint.freeou un ADOQuery_traitementint.active := false; ferait pas de mal.
|
|
mardi 23 janvier 2007 à 20:17:29 |
Re : Pb objet Eaccess violation 004B8620

Guillemouze
|
je crois qu'il y a un leger souci de conception, la condition idintervenant LIKE "'+ inttostr(idinter) +'" me semble tres etrange. En effet, l'utilisation du like et des guillemets me laissent penser que c'est un champ texte, et que martChamp utilise seulement des entiers dans ce champ. Ou est donc l'interet de ne pas utiliser un champ de type entier qui sera beaucoup plus rapide pour ces traitements?!!
Une autre petite remarque (pour delphiprog notament) : je suis d'accord que l'utilisation du like dans ce cas est completement sans interet, mais je pense qu'un SGBD digne de ce nom doit etre capable de voir qu'il n'y a pas de caractere "%" dans la valeur, et donc qu'il faut simplement le remplacer par un "=" pour obtenir le meme resultat.
|
|
mercredi 24 janvier 2007 à 14:26:59 |
Re : Pb objet Eaccess violation 004B8620

martChamp
|
bonjour et mercie beaucoup pour votre reponsse sa marche ainssi, il et clair qu'avec un type tobjectlist se serait plus simple, je vais me pencher la dessus. Enfin mercie encor de m'avoir débloquer , longue vie a la prog 
|
|
Cette discussion est classée dans : fields, bdd, adoquery, modulebdd, traitementint
Répondre à ce message
Sujets en rapport avec ce message
Calculated fields [ par maga ]
Salutje galère, j'ai fait tout les forums impossiblea trouver le moyen avec une Dbgrid de faire un relevéde compte avec débit- crédit- solde mis a jou
Sql et Bdd [ par viper ]
Je cherche depuis qq temps à récupérer le resultat d'une requet SQL avec un TQuery et une base de donnée mais sans succès...J'aimerais donc savoir com
TTable: copier une table dans une autre [ par juan ]
Bonjour tous, mon problème aujourd'hui, c'est que j'ai une table Table1 qui est filtrée, j'ai créé une deuxième table Table2 sans aucun enregistrement
Lien vers des fichiers dans une bdd??? [ par pedrito83 ]
débutant confirmé ;-)Voilà, je dois programmer en Delphi2 (oui je sais on en est au 6 ) et je débute en delphi (1 semaine que je programme seulement )
Selectionner un alias de BDD à partir d'un formulaire [ par lomig ]
Bonjour, j'aimerais pouvoir a partir d'un formulaire, avoir accès à la liste des alias de BDD pour pouvoir en choisir une et l'assigner aux differents
BDD et Internet [ par JoeyAstor ]
Bon alors c pas simple ... pour moi en tout cas ...je voudrais me connecter à une base access ... jusque là pas de problème ... si ce n'est que ma bas
àexécution/pas à pas [ par usmok ]
j'ai un prog ki gere plusieurs bddkan j'exécute l'appli, mon prog plante (pendant kil é en train de trier des infos stovker sur une des bdd)alors ke k
àexécution/pas à pas [ par usmok ]
j'ai un prog ki gere plusieurs bddkan j'exécute l'appli, mon prog plante (pendant kil é en train de trier des infos stovker sur une des bdd)alors ke k
bdd définie par l'utilisateur [ par lnicos ]
Salut, j'aimerais un programme de base de données, mais je ne sais pas si je dois utiliser ado, dbexpress ou autre.J'aimerais que l'utilisateur puisse
BDD client/serveur [ par Corbatwork ]
salutquelqu'un pourrait-il m'expliquer simplement quels sont les composants à utiliser pour faire une appli BDD en serveur et les composants à utilise
Livres en rapport
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|