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