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 :
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
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
J'obtiens alors le message d'erreur:
à l'execution de l'update (cmd.ExecuteNonQuery())There is already an open DataReader associated with this Command which must be closed first
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
Partager