IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

Access violation dans un Web service retournant un tableau de valeurs


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Par défaut Access violation dans un Web service retournant un tableau de valeurs
    Bonjour

    J'ai écrit la partie serveur d'un web service, mais son exécution renvoie l'erreur "Violation d'accès à l'adresse 022C107E dans le module 'Project1.dll"

    L'erreur se produit sur la ligne suivante, lors de l'affectation de la valeur de la requète à Mon_Portefeuille[Nb_Client].Num_client

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mon_Portefeuille[Nb_Client].Num_client  := FieldByName('num_client').Value;
    Je pense que problème vient du fait que le tableau Mon_Portefeuille n'est pas créé, mais comment le créer ?

    Merci d'avance pour vos réponses


    Voici ci-dessous la descrition de l'interface :
    -------------------------------------------

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    interface
     
    uses InvokeRegistry, Types, XSBuiltIns;
     
    type
      Enr = Class;
     
      Enr = Class(TRemotable)
      private
        FNum_client  : integer;
        FDesignation : widestring;
        FQualite     : Widestring;
      published
        property Num_client  : integer    read FNum_client  write FNum_client;
        property Designation : widestring read FDesignation write Fdesignation;
        property Qualite     : widestring read FQualite     write FQualite;
      end;
     
      Portefeuille = array of Enr;
     
      { Les interfaces invocables doivent dériver de IInvokable }
      ITestIO = interface(IInvokable)
      ['{7BA0A86E-0CCC-42F1-9828-F8EDE440CBE1}']
     
     
      function Lit_Portefeuille(Code_agent : integer) : Portefeuille ; stdcall;
     
     
        { Les méthodes de l'interface invocable ne doivent pas utiliser la convention }
        { d'appel par défaut ; stdcall est conseillée }
      end;
     
    implementation
     
    initialization
      { Les interfaces invocables doivent être recensées }
      InvRegistry.RegisterInterface(TypeInfo(ITestIO));
     
    end.
    et l'implémentation :
    -------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    { Fichier d'implémentation invocable pour TTestIO qui implémente ITestIO }
     
    unit TestIOImpl;
     
    interface
     
    uses InvokeRegistry, Types, XSBuiltIns, TestIOIntf, cer_fichiers, sysutils;
     
    type
     
      { TTestIO }
      TTestIO = class(TInvokableClass, ITestIO)
      public
        function Lit_Portefeuille(Code_agent : integer) : Portefeuille ; stdcall;
      end;
     
    implementation
     
    uses Unit1, Unit2;
     
      function TTestIO.Lit_Portefeuille(Code_agent : integer) : Portefeuille;
      var MyDataModule : TDataModule;
          Mon_Portefeuille : Portefeuille;
          Nb_Client : integer;
      begin
        MyDataModule := TDataModule.create(nil);
     
        try
          With MyDataModule.QPortefeuille do
          begin
            Close;
            ParamByName('code_agent').Value := Code_agent;
            Open;
            Nb_Client := 0;
     
            While not Eof do
            begin
              inc(Nb_Client);
              Mon_Portefeuille[Nb_Client].Num_client  := FieldByName('num_client').Value;
              Mon_Portefeuille[Nb_Client].Designation := FieldByName('designation').Value;
              Mon_Portefeuille[Nb_Client].Qualite     := FieldByName('qualite').Value;
              Next;
            end;
            Close;
          end;
        finally
          FreeAndNil (MyDataModule);
        end;
     
        result := Mon_Portefeuille;
      end;
     
     
    initialization
      { Les classes invocables doivent être recensées }
      InvRegistry.RegisterInvokableClass(TTestIO);
     
    end.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 094
    Par défaut
    s'attaquer au WebService si tu es débutant n'est pas forcément le plus aisé, il vaut mieux être habitué au constructeur\destructeur ainsi que les tableaux dynamiques

    3 erreurs
    - SetLength manquant
    - Create manquant
    - incrémentation prématuré pour tableau indice en 0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
          With MyDataModule.QPortefeuille do
          begin
            Close;
            ParamByName('code_agent').Value := Code_agent;
            Open;
            Nb_Client := 0;
            SetLength(Mon_Portefeuille, RecordCount); //         
     
            While not Eof do
            begin
              // SetLength(Mon_Portefeuille, Nb_Client + 1); // si RecordCount n'est pas supporté comme avec DBExpress
     
              Mon_Portefeuille[Nb_Client] := Enr.Create(); 
              Mon_Portefeuille[Nb_Client].Num_client  := FieldByName('num_client').Value;
              Mon_Portefeuille[Nb_Client].Designation := FieldByName('designation').Value;
              Mon_Portefeuille[Nb_Client].Qualite     := FieldByName('qualite').Value;
              inc(Nb_Client);
              Next;
            end;
            Close;
          end;
    Côté Serveur j'ignore qui est responsable de la libération des objets, voir la documentation à ce sujet
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre averti
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Par défaut Remerciement
    J'ai corrigé le programme comme indiqué par ShaiLeTroll et tout fonctionne parfaitement !
    Merci encore pour votre réactivité

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. authentification dans un web service
    Par sophiesophie dans le forum Services Web
    Réponses: 2
    Dernier message: 08/08/2008, 08h37
  2. probleme dans mon web service
    Par am@123 dans le forum Services Web
    Réponses: 2
    Dernier message: 06/05/2007, 19h31
  3. Problème Access Violation dans une classe
    Par randriano dans le forum C++Builder
    Réponses: 1
    Dernier message: 11/04/2007, 18h49
  4. [C#2.0] Comment rendre obligatoire un element dans un Web Service
    Par cosmos38240 dans le forum Services Web
    Réponses: 1
    Dernier message: 02/03/2007, 16h27
  5. Access violation dans un TTreeView
    Par Vulcanos dans le forum Composants VCL
    Réponses: 1
    Dernier message: 13/09/2005, 03h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo