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

Langage Delphi Discussion :

L'opération doit utiliser une requête qui peut être mise à jour


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 23
    Points : 19
    Points
    19
    Par défaut L'opération doit utiliser une requête qui peut être mise à jour
    Salut

    J'ai un gros souci. J'ai crée une appli Delphi 2007 sur une base access en monoposte cela fonctionne trés bien (ajout, suppression et mise a jour des enregistrements) mais en mode multi-utilisateurs je rencontre des problemes je sais pas ce qu'il faut mettre dans la connectionstring de ADOconnection (Mode=cmReadWrite ou cmShareDenyNone) et j'ai deja essayé les different adoquery.locktype sans resultat j'ai toujours ce meme message "L'opération doit utiliser une requête qui peut être mise à jour".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;' +
            'User ID=Admin; Data Source=' + MonChemin + MonLycee + ';' +
            'Jet OLEDB:System database="";Jet OLEDB:Registry Path="";'+
            'Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;'+
            'Jet OLEDB:Database Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;'+
            'Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";'+
            'Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;'+
            'Jet OLEDB:Don''t Copy Locale on Compact=False;'+
            'Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False;'+
            'Persist Security Info=False';
    Aidez moi svp
    @++++
    Rserge

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Au vu du message, j'ai pas l'impression que le problème soit le mode de connexion à la base de données en elle même (j'ai toujours laisser le paramétrage par défaut et même à plusieurs il n'y a jamais eu de soucis)

    Peux tu être plus précis sur le moment où tu as ce message d'erreur ?
    quel moment ? dans une requête ou une table lors d'un ajout/suppression modification ? etc ...
    Modérateur Delphi

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

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Salut

    La base etant placée sur 1 lecteur réseau et ouvert sur 2 postes, je peux lister les enregistrement dans des DBGrib sur les 2 postes en même temps.
    L'erreur se produit sur l'excution de la requete (Update,Insert et Delete) sur l'instruction DOQuery1.ExecSQL.
    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
    ADOQuery1.SQL.Clear;  //Mise a jour des données
      MonSqlMaj := '';
      VF := '0';
      MVille.Text := ComboBoxCP.Text;
      ACodeEleve := DBGridChoixEleve.Fields[0].Value;
      MonSqlMaj := 'UPDATE Eleve_Cuvelette SET Nom_Repre_E = ''' + MNomRepre.Text;
      MonSqlMaj := MonSqlMaj + ''', Prenom_Repre_E = ''' + MPrenomRepre.Text;
      MonSqlMaj := MonSqlMaj + ''', Adresse_Cuv = ''' + MAdresse.Text;
      MonSqlMaj := MonSqlMaj + ''', Code_Post = ''' + MCodeP.Text;
      MonSqlMaj := MonSqlMaj + ''', Ville = ''' + MVille.Text;
      MonSqlMaj := MonSqlMaj + ''', Comentaire = ''' + MemoCom.Text;
      if MCheckQuitter.Checked then VF := '-1';
      MonSqlMaj := MonSqlMaj + ''', QuitterLycee = ' + VF;
      VF := '0';
      if MCheckConseil.Checked then VF := '-1';
      MonSqlMaj := MonSqlMaj + ', Conseil_Cuv = ' + VF;
      MonSqlMaj := MonSqlMaj + ' WHERE Code_E_Cuv = ''' + DBGridChoixEleve.Fields[0].Value;
      MonSqlMaj := MonSqlMaj + ''' ';
      ADOQuery1.SQL.Add(MonSqlMaj);
      ADOQuery1.ExecSQL;
    Code qui fonctionne tres bien en monoposte
    a+++++ Rserge

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    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 235
    Points : 8 504
    Points
    8 504
    Par défaut
    1- As tu encadré tes requêtes par des transactions ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Adoconnection1.BeginTrans;
    try
      // La requête ici
     
      AdoConnection1.CommitTrans;
    Except on E:Exception do
      Adoconnection1.RollBack;
    end;
    Vérifie la syntaxe, je sais plus si c'est commit ou committrans avec ado

    Car les manipulations de bases de données monoposte et multiposte, ca ne se gère pas de la même manière ^^

    2- as tu des évènements sur ton composant Query qui pourrait interférer dans le fonctionnement ?

    PS: DBGridChoixEleve.Fields[0].Value; ca en général on évite :
    - Les Grid c'est fait pour de l'affichage et il est préférable de lire directement à la source car l'affichage peut être modifier
    - Fields[0].Value : et si tu changes de place ta colonne (code ou utilisateur), ca risque fortement planté, il vaudrait mieux utiliser comme dit plus haut la source de données avec le nom du champ
    Modérateur Delphi

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

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Salut
    Je ne connaissais pas ces instruction "Begintrans, CommiTrans et RollbackTrans" mais c'est toujours pareil avec 1 utilisateurs ca fonctionne bien et avec plusieurs j'ai l'erreur apres le ExecSQL.

    Pour le DBGridChoixEleve.Fields[0].Value je l'ai remplace par une variable
    Pour le ADOQuery j'ai regroupe toutes les instructions
    Pour ADOQuery1.LockType j'ai mis toutes les valeurs possible ca marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ADOConnection1.BeginTrans;
      Try
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Add(MonSqlMaj);
        ADOQuery1.LockType := ltPessimistic; 
        ADOQuery1.ExecSQL;
        ADOConnection1.CommitTrans;
      Except
        ADOConnection1.RollbackTrans;
      End;
    Voila a ++++
    Rserge

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Ado et access je connait pas vraiment mais plusieurs remarques s'imposent :

    utilise QuotedStr(variable) , ça améliorera la lisibilité et enlèvera des ''''
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      MonSqlMaj := 'UPDATE Eleve_Cuvelette SET Nom_Repre_E =' +QuotedStr(MNomRepre.Text);
      MonSqlMaj := MonSqlMaj + ', Prenom_Repre_E = ' +QuotedStr( MPrenomRepre.Text);
    etc..
    le mieux (n'étant pas l'ennemi du bien mais peut être l'ennui du programmeur) aurait été d'utiliser les paramètres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      MonSqlMaj := 'UPDATE Eleve_Cuvelette SET Nom_Repre_E =:N'   MonSqlMaj := MonSqlMaj + ', Prenom_Repre_E =:M'
    etc..
    puis aDoquery.ParamByname('N').value :=MNomRepre.Text;
    etc...
    Passons a la partie Transaction,telle que faite , s'il y a une erreur
    je suggère

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Add(MonSqlMaj);
        ADOQuery1.LockType := ltPessimistic; 
      Try
        ADOConnection1.BeginTrans; 
        ADOQuery1.ExecSQL;
        ADOConnection1.CommitTrans;
      Except
        ADOConnection1.RollbackTrans;
      End;
    Quant à l'erreur , je l'ai déjà dit je ne connait pas ado , y a t'il une option Requestlive ? (quoique je ne comprenne pas pourquoi ) à moins que bien que déclenchée ici l'erreur soit provoquée par un autre Dataset ?

    bon courage
    A bas MsAccess , Firebird vaincra
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    Salut

    Après une longue recherche j'ai constaté que le programme fonctionne bien mais qu'il manquait une autorisation sur le partage, je m'explique, je possédait bien les droits en lecture, ecriture sur les fichiers et sur le répèrtoire donc le prog fonctionnait en monoposte mais il me manquait ces droits sur le partage voila pourquoi ca marche pas en multi-utilisateurs.
    Ceci etant réglé merci a vous pour les modification que j'ai apporté a mon prog qui devient plus lisible.

    a++++++++
    Rserge

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/10/2010, 22h04
  2. Réponses: 0
    Dernier message: 17/01/2010, 17h42
  3. Réponses: 1
    Dernier message: 18/12/2009, 10h29
  4. Réponses: 1
    Dernier message: 23/05/2008, 11h45
  5. Réponses: 7
    Dernier message: 29/04/2008, 12h16

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