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

MFC Discussion :

Multithread sur une Base Access via ODBC


Sujet :

MFC

  1. #1
    Membre confirmé Avatar de jagboys
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 166
    Par défaut Multithread sur une Base Access via ODBC
    Bonjour,

    J'ai un programme avec deux threads complètement asynchrone.
    Tous se passe bien sauf des fois quand les 2 threads veulent avoir la main sur la base pour écriture.
    Voici l'exception qui est emise :
    Could not update; currently locked by user 'admin' on machine ' '.

    Est que quelqu'un aurait une piste pour gérer ceci ?
    J'ai essayé de temporiser avec la fonction CRecordset.CanUpdate(), mais rien à faire. CanUpdate renvoie toujours true !

    Merci pour votre aide.

  2. #2
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    tu es certainement en accès exclusif sur ta base de données
    reverifies les paramètres d'accès (CDatabase :: Open ou OpenEx)

    pour un usage multithread en ODBC, je te conseille d'avoir un objet CDatabase distinct par thread, qui pointe sur la meme base ... pour éviter tout soucis, dû à la synchro ... sinon ça fonctionne bien en multithread

    @+

  3. #3
    Membre confirmé Avatar de jagboys
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 166
    Par défaut
    Bonsoir,

    Merci d'avoir répondu.
    En fait j'ai bien deux CDatabase. Au moment de l'initialisation, chaque Thread instancie bien son propre objet CDatabase.

    A l'initialisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CDatabase dbth1;
     
    if(dbth1.OpenEx(_T(ConString),CDatabase::noOdbcDialog) == 1)
     Flag_Database_Open = true;
    else
     Flag_Database_Open = false;
     
    ....
     
    //idem pour la deuxième connexion.
    De plus chaque thread est dans une classe différente.

    Je ne comprends pas alors pourquoi il y a un conflit ?

    Voila comment je mets à jours les entrées dans la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CString strSQL3 = "SELECT * FROM " + DB_TABLE + " WHERE " + DB_F_ID + " = " + szId;
     
    SvcDb rs3(&dbth1); // SvcDb étant une classe genérée par le wizard
    rs3.Open(CRecordset::dynaset,strSQL3);
    rs3.Edit();
    ......
    Merci d'avance pour vos pistes.

  4. #4
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    tes requetes, fais les plutot comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SvcDb rs3(&dbth1); // SvcDb étant une classe genérée par le wizard
    rs3.m_strFilter.Format(_T("%s=%s"),DB_F_ID,szId);
    rs3.Open();
    si DB_F_ID est une définition constante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #define DB_F_ID "champ"
    ...
    rs3.m_strFilter.Format(_T(DB_F_ID) _T("=%s"),szId);
    sinon je vois pas d'erreur dans le code que tu montres.
    quel est le driver ODBC utilisé ? supporte - t 'il l'accès concurrentiel ?

    @+

  5. #5
    Membre confirmé Avatar de jagboys
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 166
    Par défaut Cdatabase access odbc
    Bonjour,

    Merci beaucoup pour tes précieux conseils. Je vais les appliquer.

    Comment trouver la version des pilotes obdc ?

    Ce que je vois en faisant ODBCAD32.EXE puis onglets PILOTES :

    Microsoft Access Driver (*.mdb) version : 4.00.6305.00

    Est ce que celà est suffisant ?

    Merci d'avance.

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Tu utilises access comme base de données. Je pense que ton problème viens de là car access n'est pas supposé être une base de donnée en accès partagé.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    Je pense que ton problème viens de là car access n'est pas supposé être une base de donnée en accès partagé.
    si ça fonctionne avec access, on peut meme choisir le mode partagé ou exclusif dans les options de la base. C'est le cas sur Access 2002.

    @jagboys : vérifie que cette option est bien sur mode partagé

    sinon je sèche ...


    @+
    Images attachées Images attachées  

Discussions similaires

  1. Connexion de Oracle XE sur une base Hyperfile via ODBC
    Par zouhenlai dans le forum Connexions aux bases de données
    Réponses: 8
    Dernier message: 13/01/2009, 19h38
  2. Réponses: 2
    Dernier message: 06/03/2008, 14h26
  3. Réponses: 4
    Dernier message: 15/01/2008, 16h36
  4. Acceder à une base access via visual C++
    Par faceo75 dans le forum MFC
    Réponses: 4
    Dernier message: 07/02/2007, 16h17
  5. requetes BUSINESS OBJECT sur une base ACCESS
    Par greatmaster1971 dans le forum Deski
    Réponses: 1
    Dernier message: 06/10/2004, 14h10

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