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

Accès aux données Discussion :

Ma requête ne fonctionne qu'à moitié ! :/


Sujet :

Accès aux données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 240
    Points : 104
    Points
    104
    Par défaut Ma requête ne fonctionne qu'à moitié ! :/
    Bonjour,

    Je travaille sur une base Oracle ! Je n'ai pas de problème pour récupèrer les données. En ce qui concerne l'insertion, la mise à jour, j'ai quelques soucis !

    Démarche ==> j'arrive à insérer les données. Je supprime les données manuellement et je refais l'action. Quand je veux réinsérer ces mêmes données, ça ne fonctionne pas et j'ai un message d'erreur, au bout de quelques secondes !

    Voici mon erreur :

    Le CLR n'a pas pu effectuer de transition du contexte COM 0x10df448 au contexte COM 0x10df5b8 pendant 60 secondes. Le thread qui possède le contexte/cloisonnement de destination est probablement en train d'attendre ou de traiter une opération très longue sans pompage des messages Windows. Cette situation a généralement des effets négatifs sur les performances et peut parfois entraîner le blocage de l'application ou une utilisation ininterrompue de la mémoire. Pour éviter ce problème, tous les threads STA (Single Threaded Apartment) doivent utiliser des primitives d'attente de pompage (par exemple CoWaitForMultipleHandles) et pomper de manière régulière les messages lors des opérations qui sont longues à s'exécuter.
    et voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" _
                                  + "(ADDRESS=(PROTOCOL=TCP)(HOST=172.30.32.92)(PORT=1521)))" _
                                  + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _
                                  + "User Id=xxxxx;Password=xxxxx;"
       Dim conn As New OracleConnection(Me.oradb)
       Dim myOracleTransaction As OracleTransaction = conn.BeginTransaction()
       Dim myOracleCommand As OracleCommand = conn.CreateCommand()
       myOracleCommand.CommandText = "INSERT INTO CATEGORIES (CODE_CATEGORIE,NOM_CATEGORIE,DESCRIPTION) VALUES(10,'toto','titi')"
       myOracleCommand.ExecuteNonQuery()
       myOracleTransaction.Commit()
       conn.Close()

    Avez-vous une idée de l'origine de l'erreur, svp ?

    D'avance merci pour les réponses
    Cvb

  2. #2
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Points : 2 927
    Points
    2 927
    Par défaut
    Pour ma part, en général, j'ai cette erreur quand je suis en mode Debug et que j'ai stoppé l'exécution (sur un point d'arrêt, par exemple) pendant plus d'une minute alors que les variables en cours contiennent des références externes (telles qu'une connexion à une BD) ou sur des threads différents.
    C'est peut-être ton cas ?

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Points : 2 203
    Points
    2 203
    Par défaut
    Je crois que c'est identique

    Rien à voir avec ton code, mais avec le debug et le thread courant.

    Essayes le tag [MTAThread] sur ta méthode, et ton pb devrait disparaitre.

    Multi thread apartment doc

    Ce qui donne au final :

    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
     
    <MTAThread()>
    Public Sub MonInsert()
       Dim oradb As String = "Data Source=(DESCRIPTION=(ADDRESS_LIST=" _
                                  + "(ADDRESS=(PROTOCOL=TCP)(HOST=172.30.32.92)(PORT=1521)))" _
                                  + "(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=ORCL)));" _
                                  + "User Id=xxxxx;Password=xxxxx;"
       Dim conn As New OracleConnection(Me.oradb)
       Dim myOracleTransaction As OracleTransaction = conn.BeginTransaction()
       Dim myOracleCommand As OracleCommand = conn.CreateCommand()
       myOracleCommand.CommandText = "INSERT INTO CATEGORIES (CODE_CATEGORIE,NOM_CATEGORIE,DESCRIPTION) VALUES(10,'toto','titi')"
       myOracleCommand.ExecuteNonQuery()
       myOracleTransaction.Commit()
       conn.Close()
     
    End Sub
    Bon courage.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 754
    Points
    39 754
    Par défaut
    Citation Envoyé par B.AF Voir le message
    Essayes le tag [MTAThread] sur ta méthode, et ton pb devrait disparaitre.
    Non, ça ne changera rien. Cet attribut s'applique sur le point d'entrée du programme (la méthode Main), et n'a aucun effet sur les autres méthodes. (d'après la doc en tous cas...)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 240
    Points : 104
    Points
    104
    Par défaut
    Bonjour,

    Merci de votre aide J'ai résolu mon soucis, hier soir ! En fait c'était une erreur de Thread (A mon sens), une retour que n'avais pas Visual Studio de la part de la base qui généré le message...

    En fait j'avais "Sql Devellopper" d'ouvert en même temps que j'executé mon code ! Il s'avère (pour une raison inconnue) que le logiciel prenait le pas sur mon programme ! Il est vrai que je m'authentifié deux fois sur la base avec des identifiants identiques...

    En fermant "Sql Devellopper", tout est rentré dans l'ordre, je peux insérer les données et les défaires sans aucun soucis également !

    D'avance merci de vous être penché sur mon soucis

    ++
    ++

  6. #6
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Ne gère pas les transactions depuis le code client de ton appli mais gère le depuis le code PL/SQL.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 240
    Points : 104
    Points
    104
    Par défaut
    Bonsoir,

    Pourquoi je ne dois pas gérer les transactions depuis le code client ? Quels sont les risques ? Nous devellopons en VB.net comme faire autrement ?

    D'avance merci
    ++

  8. #8
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Crée une procédure stockée dans laquelle tu vas jouer ton insert dans une transaction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    create or replace procedure add_categorie
    (
        code_categorie int,
        nom_categorie varchar2(40),
        description varchar2(200)
    )
    begin
         begin transaction
                insert into categorie(code_categorie,nom_categorie,description) 
                values(code_categorie,nom_categorie,description)
        commit transaction
    end;
    Il ne te reste plus qu'à jouer cette requête dans VB.NET sans faire des conneries du genre OracleTransaction !
    Pour vous en convaincre, essayer de jouer votre précedent code en utilisant une base access tu vas te rendre compte que la fonctionnalité ne sera pas supportée.

    EVITER LES MAPPAGES SI VOUS VOULEZ FAIRE DES PROGRAMMES PROS ET OPTIMISES.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 240
    Points : 104
    Points
    104
    Par défaut
    Citation Envoyé par WOLO Laurent Voir le message
    Crée une procédure stockée dans laquelle tu vas jouer ton insert dans une transaction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    create or replace procedure add_categorie
    (
        code_categorie int,
        nom_categorie varchar2(40),
        description varchar2(200)
    )
    begin
         begin transaction
                insert into categorie(code_categorie,nom_categorie,description) 
                values(code_categorie,nom_categorie,description)
        commit transaction
    end;
    Il ne te reste plus qu'à jouer cette requête dans VB.NET sans faire des conneries du genre OracleTransaction !
    Pour vous en convaincre, essayer de jouer votre précedent code en utilisant une base access tu vas te rendre compte que la fonctionnalité ne sera pas supportée.

    EVITER LES MAPPAGES SI VOUS VOULEZ FAIRE DES PROGRAMMES PROS ET OPTIMISES.

    Merci beaucoup je vais regarder tout cela !

Discussions similaires

  1. [MySQL] Requête qui fonctionne à moitié
    Par Sladix dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 14/09/2009, 14h21
  2. [MySQL] Requête qui fonctionne à moitié
    Par TomDelonge dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 12/03/2009, 16h24
  3. Requête qui fonctionne 1 fois sur 100
    Par nicotine002 dans le forum Langage
    Réponses: 1
    Dernier message: 05/08/2006, 11h42
  4. Réponses: 4
    Dernier message: 26/05/2006, 08h59
  5. gestionnaire fonctionnant à moitié
    Par Pallas4 dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 02/05/2006, 18h23

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