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

VB.NET Discussion :

Different comportement entre OleDb et SqlClient [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 58
    Par défaut Different comportement entre OleDb et SqlClient
    Bonjour à tous,
    je débute en vb .net et je croyais que le comportement de vb .net était identique avec une base Access ou une base SQL Server

    Pourtant j'ai fait le programme suivant en connection avec la base Access :
    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
     
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
     
            'Cette procedure met à jour le champ fld2 de la valeur du champ fld1 à laquelle on ajoute 100
            'SVP je sais qu' une seule update sql fait la meme chose sans avoir besoin de curseur
            'le but ici est justement d'utiliser un curseur
     
            Dim cnx As New OleDb.OleDbConnection    ' Dim cnx As New SqlClient.SqlConnection dans le cas où db1 est une base sql server
            Dim cmd As New OleDb.OleDbCommand
            Dim crs As New OleDb.OleDbCommand       'crs = abreviation pour curseur
            Dim drd As OleDb.OleDbDataReader        'à noter qu'il ne faut pas utiliser new pour la classe datareader qui n'a pas de constructor
     
            Dim v_fld1 As Integer                   'stocke la valeur du champ fld1 pour l'enregistrement en cours du datareader
     
            cnx.ConnectionString = My.Settings.cs_db1
            cnx.Open()
            cmd.Connection = cnx
            crs.Connection = cnx
     
            crs.CommandText = "SELECT fld1, fld2 FROM tbl1 ORDER BY fld1;"
            'le data reader permat d'obtenir un curseur et de le parcourir en avant
            drd = crs.ExecuteReader
     
            While drd.Read
                v_fld1 = drd("fld1")         'obtient la clé fld1 dans le but d'updater un seul record
                cmd.CommandText = "UPDATE tbl1 SET fld2=" & v_fld1 + 100 & " WHERE fld1=" & v_fld1 & ";"
                cmd.ExecuteNonQuery()
            End While
     
            MessageBox.Show("Petite temporisation")
            Me.Tbl1TableAdapter.Fill(Me.Db1DataSet.tbl1)
     
            drd.Close()
            cnx.Close()
     
        End Sub
    Voilà ce code fonctionne parfaitement bien, mais si maintenant je crée une base avec SQL Server, je fais un autre projet similaire au précédent en utilisant le wizard mais en choisissant une connexion sur ma base SQL au lieu de la base Access, j'adapte ensuite le code en remplaçant OleDb par SqlClient pour le namespace et OleDb par Sql pour le préfixe de Connection, Command et DataReader, et je lance le code en cliquant sur Button1

    J'obtiens alors le message d'erreur:
    There is already an open DataReader associated with this Command which must be closed first
    à l'execution de l'update (cmd.ExecuteNonQuery())

    C'est bizarre que ça marche avec OleDb et pas avec SqlClient
    Que faut-il faire pour que ça marche ? (OK je peux faire une procédure stockée mais justement j'étais en train d'apprendre comment faire sans procédure stockée)

    J'ai un autre petit problème là où j'ai mis "Petite temporisation"
    Si je ne mets pas de temporisation, soit par un messagebox ou alors par un procédure de temporisation (1/2 seconde approx.) , le datagridview n'est pas mis à jour par la valeur réelle contenue dans la table !!!!
    C'est comme si l'update se faisait dans un cache et que le fill du datagridview se faisait avant que le cache ait eu le temps de se synchroniser dans la table, ce qui explique qu'on ne visualise pas l'update (qui a bien eu lieu car je peux le vérifier avec Access)

    Merci pour votre aide

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    peut etre une erreur de copier coller
    parce que l'erreur dit qu'un DbCommand ne peut pas exécuter une requete s'il a un Reader ouvert, il faut faire reader.close quand on en a plus besoin

    après d'une manière générale un curseur c'est une très mauvaise idée
    ici ton code peut faire 3 lignes et être 1000x plus performant en connaissant le langage sql


    pour la tempo il faudrait voir si tu as le même problème avec sql server
    c'est le problème quand on utilises des assistants, ils génèrent du code et si on ne va pas le voir on ne sait pas ce que fait ce code ... en le tapant soit même on a moins de surprises
    on voit souvent ici des gens qui ont une base de données qui se réinit à chaque exécution en mode debug quand ils passent par les assistants et access
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    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 : 43
    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
    Par défaut
    Citation Envoyé par jloois Voir le message
    C'est bizarre que ça marche avec OleDb et pas avec SqlClient
    Bah non, c'est pas étonnant au contraire... Access et SQL Server sont des SGBD complètement différents et n'ont pas les mêmes caractéristiques.

    Tu ne peux pas exécuter la même commande pour l'update pendant que tu parcours ses résultats, il faut créer une 2e commande. Access est peut-être moins strict là-dessus, mais avec SQL Server c'est obligatoire.

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    il a bien 2 commands :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    crs.ExecuteReader
    (...)
    while 
      cmd.ExecuteNonQuery
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    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 : 43
    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
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    il a bien 2 commands :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    crs.ExecuteReader
    (...)
    while 
      cmd.ExecuteNonQuery
    Ah oui, j'ai lu trop vite... au temps pour moi

  6. #6
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    La logique me semble poser un problème qui n'est peut-être pas apparu avec Access, c'est à dire la mise à jour de la base pendant l'exécution du DataReader.

    Une telle logique pourrait au mieux amener à lire/relire/ignorer des enregistrements ajoutés ou modifiés par les commandes de mise à jour et au pire à boucler.

    C'est probablement pourquoi SQL server interdit d'utiiser simultanément un dataReader et des commandes de modification de la table.

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 198
    Par défaut
    dans le pire des cas il faudrait une autre connexion, plutot que de la partager pour les 2 command
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

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

Discussions similaires

  1. différence de comportements entre JVM
    Par Nicaisse dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 30/08/2007, 11h41
  2. Réponses: 0
    Dernier message: 03/08/2007, 17h59
  3. Réponses: 2
    Dernier message: 20/06/2007, 10h27
  4. Réponses: 5
    Dernier message: 10/04/2007, 09h37
  5. [JavaScript] Différence de comportement entre IE et FF
    Par YAMKI dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 23/02/2007, 14h33

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