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

Bases de données Delphi Discussion :

Probleme d'insertion de tuples avec connexion OBDC


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Par défaut Probleme d'insertion de tuples avec connexion OBDC
    Bonjour,
    Voila j'ai un petit souci au niveau de mon gestionnaire de base de données.
    Je vous explique, j'ai crée une unité qui me permet de gérer mes connexions à des bases de données Access. Ma connexion fonctionne parfaitement pour réaliser des requetes du type SELECT sur les tables(J'ai une fonction qui prend en parametres la requete à executé). A présent je souhaite avoir une autre fonction qui va me permettre de faire des insertions, modifications ou suprression sur mes tuples.

    Pour information j'utilise la methode suivante pour réaliser ma connexion : http://okaryn.developpez.com/article...i/iodbc/#LVI-A

    Ma question est donc : Est ce que un SQLExecDirect ou un SQLExecute peuvent permettre de réaliser des insertions dans une base? Sinon quel moyen puis je employer?

    J'espere que vous pourrez me renseigner...
    MErci

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Vu que dans l'exemple fournit, il donne un exemple avec une requete update.
    Je pense fortement qu'il est possible de remplacer pas une requete insert ou delete.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Par défaut
    je suis tout à fait d'accord avec toi!
    C'est pourquoi j'ai deja essayé de reprendre le code du 'UPDATE' mais j'ai une erreur 07002 qui est generé! Donc comment faire?
    Je me suis renseigné cette erreur est lié à un manque de paramètres mais comment définir le nombre de parametres? ou ca?

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Fait voir ton code , cela sera plus simple pour voir d'où vient ton problème.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Par défaut
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    unit ConnexionBDD;
    {
    Nom de la classe : ConnexionBDD
    Version: 1.0
    Auteur: David Le Metayer
    Copyright: FIBAT S.A.R.L
    Classes utilisés:
    Fonctions: Cette classe a pour but de réaliser une connexion à une base de données.
    En utilisant les drivers ODBC, cette classe va pouvoir se connecter à plusieurs type de base de données comme Oracle, Access.
    Les drivers ODBC peuvent être utilisés grâce à l'import (uses) du composant iodbc qui permet d'offrir les fonctionnalités nécessaires pour la connexion.
    Lorsque l'on crée une connexion a une base, il suffira de passer en paramètres les informations suivantes:
       - NomBase: il s'agit du nom de la base de données sur laquelle on doit réaliser les opérations.
    }
     
    interface
     
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons, ExtCtrls, IniFiles,ComCtrls, ToolWin,ODBC;
     
      type
      TConnexionBDD = class
     
      private
        sNomBase : string;
        bStatutConnexion : boolean;
     
      public
        // Variables pour la connexion ODBC
        hEnv: SQLHENV;
        hWnd: SQLHWND;
        hdbc: SQLHDBC;
        hstmt: SQLHSTMT;
        RetCode: SQLRETURN;
     
        pStream: Pointer;
     
        // Variables pour l'exploitation des données
        sChaine : String;
        iChaine_Len : Integer;
        iRet : Integer;
        iRet2 : smallInt;
     
      //Methodes publiques
      Constructor Create(base:string);
     
      procedure connexion();
      procedure deconnexion();
      function estConnecte():boolean;
      function executeRequete(Requete:string):SQLHSTMT;
     
      procedure insert(Requete:string);
     
      end;
    implementation
    uses
    Main;
      // Constructeur
      constructor TConnexionBDD.Create(base:string);
      begin
      sNomBase := base;
      bStatutConnexion := false;
      end;
     
    //======================== LES METHODES =============================
    // ================== LES PROCEDURES ========================
       {
      Cette méthode permet d'établir une connexion à une base de données.
      Il faut permettre d'avoir des connexions directes avec les différents types de SGBD existants.
      La connexion est établie en fonction de l'attribut sNomBase qui est l'adresse de la base ou l'on doit réaliser la connexion
      }
      procedure TConnexionBDD.connexion();
      begin// Allocation d'un Handle d'environnement
        RetCode := SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, Henv);
        if sqlsucceeded(retcode) then
        begin
      // Fixe la version de l'ODBC
            RetCode := SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, SQLPOINTER(SQL_OV_ODBC3), 0);
            if sqlsucceeded(retcode) then
            begin
        // Allocation d'un Handle de connexion
                RetCode := SQLAllocHandle(SQL_HANDLE_DBC, hEnv, hdbc);
                if sqlsucceeded(retcode) then
                begin
                    // Fixe le délai du login à 5 secondes
                    SQLSetConnectAttr(hDbc, SQL_LOGIN_TIMEOUT, SQLPOINTER(5), 0);
                  // Se connecte à la base de données en fonction du parametres sNomBase en utilisant le driver ACCESS
                    iChaine_Len := 256;
                    sChaine := StringOfChar(' ',iChaine_Len);
     
                    RetCode := SQLDriverConnect(hdbc,Application.Handle,
                      pchar('DRIVER=Microsoft Access Driver (*.mdb); DBQ=' + sNomBase),
                      SQL_NTS, PChar(sChaine), iChaine_Len, iret2, SQL_DRIVER_NOPROMPT);
     
                    if sqlsucceeded(retcode) then
                    begin
                        // Allocation d'un handle
                        RetCode := SQLAllocHandle(SQL_HANDLE_STMT, hdbc, hstmt);
                        bStatutConnexion := true;
                    end
                    else
                        raise ESQLerror.CreateDiag(SQL_HANDLE_DBC, hdbc, RetCode);
                    SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
                    bStatutConnexion :=true;
                end
                else
                    raise ESQLerror.CreateDiag(SQL_HANDLE_DBC, hdbc, RetCode);
            end
            else
                raise ESQLerror.CreateDiag(SQL_HANDLE_ENV, henv, RetCode);
            SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
        end
        else
            raise ESQLerror.CreateDiag(SQL_HANDLE_ENV, henv, RetCode);
      end;
     
    //==============================================================================
    {
    Cette methode va permettre d'executer une requete SQL sur la base de données à
    laquelle on est déjà connectée. Pour cela, on passe en paramètres de la fonction
    une chaine de caractere contenant la requete( il doit contenir des commandes SQL)
     
    Si la requete est executé correctement, la fonction retourne le resultat dans un SQLHSTMT.
    Ce type de retour est un pointeur de l'adresse mémoire sur la première case ou son contenu
    les resultats. 
     
    }
    function TConnexionBDD.executeRequete(requete:string):SQLHSTMT;
    begin
      if estConnecte then
      begin
       if sqlsucceeded(retcode) then
        begin
          iChaine_Len := 50;
          RetCode := SQLExecDirect(hstmt, Pchar(requete), SQL_NTS);
          if sqlsucceeded(retcode) then
          begin
             Result := hstmt;
          end;
       end;
      end;
    end;
     
    //==============================================================================
    {
     Cette methode doit permettre de déconnecter la connexion de la base de données.
     Cette opération ne peut être réaliser que si la connexion est déjà établie.
     Lors de la deconnexion on libere le lien sur la base ( suppression du verrou ) et
     on change de statut à la connexion ( false ).
    }
    procedure TConnexionBDD.deconnexion();
    begin
      if bStatutConnexion then
      begin
        SQLDisconnect(hdbc);
        bStatutConnexion := false;
      end
      else
        raise ESQLerror.CreateDiag(SQL_HANDLE_DBC, hdbc, RetCode);
      SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
      end;
     
    //==============================================================================
    procedure TConnexionBDD.insert(Requete:string);
    begin
      RetCode := SQLPrepare(hstmt, PChar(Requete), SQL_NTS);
     
            if sqlsucceeded(retcode) then
            begin
                RetCode := SQLExecute(hstmt);
                if not sqlsucceeded(retcode) then
                    raise ESQLerror.CreateDiag(SQL_HANDLE_STMT, hstmt, RetCode);
            end
            else
                raise ESQLerror.CreateDiag(SQL_HANDLE_STMT, hstmt, RetCode);
        end;
    end;
    //=============================================================================
    {
     Cette methode a pour but de connaitre l'état d'une connexion à la base de données
     à n'importe quel moment.
      si la connexion est établie, on retourne vrai,
      sinon on retourne faux.
    }
    function TConnexionBDD.estConnecte : boolean;
    begin
       Result := bStatutConnexion;
    end;
     
     
    end.

  6. #6
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Je ne vois pas ta requete insert dans ce code
    Car tu as peut être mal ecrit ta requete d'où l'erreur que cela te retourne.

    PS: Penses à utlilser la balise de code (le # dans la barre d'outil) c'est plus facile pour lire un code
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

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

Discussions similaires

  1. Probleme d'insertion une image avec titre ?
    Par genius4evers dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 3
    Dernier message: 18/07/2012, 17h00
  2. probleme d'insertion dans db avec ma classe mysql
    Par diblasio dans le forum Langage
    Réponses: 7
    Dernier message: 09/12/2009, 14h52
  3. probleme d'insertion dans mysql avec java
    Par hypothese dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 26/09/2008, 12h02
  4. probleme d'insertion dans table avec cle secondaire
    Par pseudobidon57 dans le forum SQL
    Réponses: 1
    Dernier message: 01/06/2007, 13h46
  5. Réponses: 2
    Dernier message: 22/07/2004, 00h27

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