OVH Cloud OVH Cloud

Commande ExecuteNonQuery

8 réponses
Avatar
Annie L.
J'ai utilisé une requête SQLUpdate pour modifier des données dans une table
Access. Mais il me manque 'comment faire pour savoir si la sauvegarde a
réussi'.
Ex.: strSQL = "UPDATE CategorieClient SET DescriptionCategClient
= ?, NotesCategClient = ? WHERE CodeIDCategorieClient = ? AND
DescriptionCategClient = ? AND NotesCategClient = ?"

Je passe des paramètres....

Dim cmd As New OleDbCommand(strSQL, cnnOLEDB)
Dim pc As OleDbParameterCollection = cmd.Parameters

'partie du SET
pc.Add("DescriptionCategClient_New", OleDbType.VarChar)
pc.Add("NotesCategClient_New", OleDbType.VarChar)

pc.Add("CodeIDCategorieClient_Orig", OleDbType.VarChar)
pc.Add("DescriptionCategClient_Orig", OleDbType.VarChar)
pc.Add("NotesCategClient_Orig", OleDbType.VarChar)

'partie de la clause WHERE
pc("DescriptionCategClient_New").Value = Me.txtDescCategClient.Text
pc("NotesCategClient_New").Value = Me.txtNotesCategClient.Text

row =
Me.DstCategClient.Tables("CategorieClient").Rows(Me.BindingContext(Me.DstCategClient, "CategorieClient").Position)
pc("CodeIDCategorieClient_Orig").Value =
row("CodeIDCategorieClient", DataRowVersion.Original)
pc("DescriptionCategClient_Orig").Value =
row("DescriptionCategClient", DataRowVersion.Original)
pc("NotesCategClient_Orig").Value = row("NotesCategClient",
DataRowVersion.Original)


j'exécute ma requête et je vérifie si la requête est passée ou non.....


cmd.ExecuteNonQuery()

intRowsAffected = cmd.ExecuteNonQuery """"c'est ici que j'ai un
problème
If intRowsAffected = 1 Then
MsgBox("Réussi")
Else
MsgBox("Mise à jour échouée")
End If

Quelle commande dois-je utiliser pour savoir si tout s'est passée
correctement ou non. J'utilise l'accès concurrentiel optimiste et cela
fonctionne très bien sans écraser les données entrées par un autre
utilisateur.

Merci!

8 réponses

Avatar
Annie L.
Je m'excuse, mais je viens de me rendre compte de mon erreur, je pense...

cmd.ExecuteNonQuery()
intRowsAffected = cmd.ExecuteNonQuery """"c'est ici que j'ai un
problème



J'exécutais 2 fois la même commande..
Je dois écrire 1 fois ceci : intRowsAffected = cmd.ExecuteNonQuery
J'appelais 2 fois la commande 'cmd.ExecuteNonQuery'






"Annie L." a écrit :

J'ai utilisé une requête SQLUpdate pour modifier des données dans une table
Access. Mais il me manque 'comment faire pour savoir si la sauvegarde a
réussi'.
Ex.: strSQL = "UPDATE CategorieClient SET DescriptionCategClient
= ?, NotesCategClient = ? WHERE CodeIDCategorieClient = ? AND
DescriptionCategClient = ? AND NotesCategClient = ?"

Je passe des paramètres....

Dim cmd As New OleDbCommand(strSQL, cnnOLEDB)
Dim pc As OleDbParameterCollection = cmd.Parameters

'partie du SET
pc.Add("DescriptionCategClient_New", OleDbType.VarChar)
pc.Add("NotesCategClient_New", OleDbType.VarChar)

pc.Add("CodeIDCategorieClient_Orig", OleDbType.VarChar)
pc.Add("DescriptionCategClient_Orig", OleDbType.VarChar)
pc.Add("NotesCategClient_Orig", OleDbType.VarChar)

'partie de la clause WHERE
pc("DescriptionCategClient_New").Value = Me.txtDescCategClient.Text
pc("NotesCategClient_New").Value = Me.txtNotesCategClient.Text

row =
Me.DstCategClient.Tables("CategorieClient").Rows(Me.BindingContext(Me.DstCategClient, "CategorieClient").Position)
pc("CodeIDCategorieClient_Orig").Value =
row("CodeIDCategorieClient", DataRowVersion.Original)
pc("DescriptionCategClient_Orig").Value =
row("DescriptionCategClient", DataRowVersion.Original)
pc("NotesCategClient_Orig").Value = row("NotesCategClient",
DataRowVersion.Original)


j'exécute ma requête et je vérifie si la requête est passée ou non.....


cmd.ExecuteNonQuery()

intRowsAffected = cmd.ExecuteNonQuery """"c'est ici que j'ai un
problème
If intRowsAffected = 1 Then
MsgBox("Réussi")
Else
MsgBox("Mise à jour échouée")
End If

Quelle commande dois-je utiliser pour savoir si tout s'est passée
correctement ou non. J'utilise l'accès concurrentiel optimiste et cela
fonctionne très bien sans écraser les données entrées par un autre
utilisateur.

Merci!


Avatar
Zoury
ReSalut ! :O)

Je passe des paramètres....


<snip>
Dim pc As OleDbParameterCollection = cmd.Parameters

pc.Add("NotesCategClient_Orig", OleDbType.VarChar)

pc("NotesCategClient_Orig").Value = row("NotesCategClient",
DataRowVersion.Original)




Ta technique me semble suspecte.. Voici un exemple qui passe des paramètres
à une procédure, ça fonctionne de la même façon dans ton cas..
'***
Private Function ObtenirListeClients( _
ByVal cn As SqlConnection, _
ByVal nIdEtablissement As Int32, _
ByVal dtDebutPeriode As DateTime, _
ByVal dtFinPeriode As DateTime) As DataSet

Dim cmd As OracleCommand
Dim da As OracleDataAdapter
Dim p As OracleParameter
Dim ds As DataSet

' préparation de la requête
cmd = New OracleCommand
cmd.Connection = cn
cmd.CommandText = "sp_obtenir_liste_clients"
cmd.CommandType = CommandType.StoredProcedure

' préparation des paramètres
p = New SqlParameter
p.ParameterName = "@id_etablissement"
p.OracleDbType = SqlDbType.Int
p.Direction = ParameterDirection.Input
p.Value = nIdEtablissement

p = New SqlParameter
p.ParameterName = "@date_debut_periode"
p.OracleDbType = SqlDbType.DateTime
p.Direction = ParameterDirection.Input
p.Value = dtDebutPeriode

p = New SqlParameter
p.ParameterName = "@date_fin_periode"
p.OracleDbType = SqlDbType.DateTime
p.Direction = ParameterDirection.Input
p.Value = dtFinPeriode

' initialise les objets retrouvant les données
ds = New DataSet
da = New OracleDataAdapter(cmd)

' initialise la connexion et exécute la requête
da.Fill(ds)

' dispose des ressources non-managées
cmd.Dispose()
da.Dispose()
p.Dispose()

Return ds

End Function
'***

Cet article pourrait aussi t'aider :
http://support.microsoft.com/kb/308049/fr


Maintenant une fois que tes paramètres seront passés correctement tu
appelles ExecuteNonQuery() *une seule fois*, si tu refais la requête :
'***
intRowsAffected = cmd.ExecuteNonQuery()
'***

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Zoury
> si tu refais la requête :



il fallait lire :
SINON tu refais la requête

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Annie L.
"Ta technique me semble douteuse"

J'ai pris l'exemple dans le livre "Manuel de référence Microsoft ADO.NET"
isbn : 2 10 006523 8 écrit par Davis Sceppa"

Ce qu'il faut bien remarqué dans ma façon de procéder, je n'utilise pas de
"OleDbAdapter", ni de "CommandBuilder" et ni de l'assistant de configuration"
Je passe une commande SQL pure et que si un utilisateur modifie un
enregistrement avant moi, je n,écrase pas ses modifications. L'application
avertit l'utilisateur qu'il y a eu une modification avant que l'autre
utilisateur apporte une autre modification.
Il faut remarquer que je ne peux pas utiliser de "stored procedure" car je
travaille avec MS Access 2002 et qu'il ne gère pas des "stored procedure" car
si je le pouvais je le ferais car c,est ce qu'on recommande le plus!!!!
Qu'en penses-tu??
Je ne suis pas une experte, mais cela fonctionne très bien en réseau
multi-utilisateur! Et puis je me suis appuyer sur une livre de Microsoft
ADO.NET!!!
Je vais étudier et essayer ta façon de procéder.
Merci!

"Zoury" a écrit :

> si tu refais la requête :

il fallait lire :
SINON tu refais la requête

--
Cordialement
Yanick
MVP pour Visual Basic





Avatar
Zoury
> > "Ta technique me semble douteuse"


> J'ai pris l'exemple dans le livre "Manuel de référence Microsoft ADO.NET"
isbn : 2 10 006523 8 écrit par Davis Sceppa"



Je m'excuse, en relisant le code, je me rend compte que ça revient au même.
Et oui, en effet, tu protèges l'utilisateur contre l'écrasement de
modification successive, ce qui peut être très pratique.

Il faut remarquer que je ne peux pas utiliser de "stored procedure" car je
travaille avec MS Access 2002 et qu'il ne gère pas des "stored procedure"


car
si je le pouvais je le ferais car c,est ce qu'on recommande le plus!!!!
Qu'en penses-tu??



Access permet de faire des Query ce qui est l'équivalent des procédures
stockées d'SQL Server ou des procédures Oracle. Tu pourrais faire des
recherches dans ce sens. :O)

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Annie L.
Access permet de faire des Query ce qui est l'équivalent des procédures
stockées d'SQL Server ou des procédures Oracle.



Tu parle ici de "Requête" ?
Si c'est ça, je m'en sers régulièrement. Et j'ai même déjà lu à ce sujet que
d'appeler une requête est plus rapide d'exécution que de la créer dans le
code car elle est déjà pré-compilé !!!
Qu'en penses-tu?


"Zoury" a écrit :

> > "Ta technique me semble douteuse"
> J'ai pris l'exemple dans le livre "Manuel de référence Microsoft ADO.NET"
> isbn : 2 10 006523 8 écrit par Davis Sceppa"

Je m'excuse, en relisant le code, je me rend compte que ça revient au même.
Et oui, en effet, tu protèges l'utilisateur contre l'écrasement de
modification successive, ce qui peut être très pratique.

> Il faut remarquer que je ne peux pas utiliser de "stored procedure" car je
> travaille avec MS Access 2002 et qu'il ne gère pas des "stored procedure"
car
> si je le pouvais je le ferais car c,est ce qu'on recommande le plus!!!!
> Qu'en penses-tu??

Access permet de faire des Query ce qui est l'équivalent des procédures
stockées d'SQL Server ou des procédures Oracle. Tu pourrais faire des
recherches dans ce sens. :O)

--
Cordialement
Yanick
MVP pour Visual Basic





Avatar
Zoury
> Tu parle ici de "Requête" ?



Yep !

Si c'est ça, je m'en sers régulièrement. Et j'ai même déjà lu à ce sujet


que
d'appeler une requête est plus rapide d'exécution que de la créer dans le
code car elle est déjà pré-compilé !!!
Qu'en penses-tu?



C'est vrai et ça ne fait pas que ça. :)
Consulte ce lien si tu veux plus de détail à ce sujet :

Qu'est-ce qu'une procédure stockée et pourquoi les employer ?
http://faq.vb.free.fr/index.php?question3

--
Cordialement
Yanick
MVP pour Visual Basic
Avatar
Annie L.
Un gros merci pour tous ces conseils!
Je suis en train de mettre mon application sur réseau et au départ on
voulait se servir de l'accès concurrentiel pessimiste! On trouvait plein de
problèmes!
Finalement, je leur ai conseillé d'adopter l'accès concurrentiel optimiste.
se servir de la nouvelle technologie qu'offre Visual Studio (VB) .NET.
Résultat : pas de barrure réseau, pas de 'remonte' (enlever les barrures qui
sont restés), pas de traffic réseau, n'écrase pas les enreg. des autres
utilisateurs sans les avertir d'un changement, bref utiliser la nouvelle
technologie et je le conseille fortement aux autres programmeurs. Plus
complexe à comprendre et à maitriser, plus de code mais cela en vaut vraiment
la peine!
Conclusion : performance et contrôle (par le code source).
Merci!


"Zoury" a écrit :

> Tu parle ici de "Requête" ?

Yep !

> Si c'est ça, je m'en sers régulièrement. Et j'ai même déjà lu à ce sujet
que
> d'appeler une requête est plus rapide d'exécution que de la créer dans le
> code car elle est déjà pré-compilé !!!
> Qu'en penses-tu?

C'est vrai et ça ne fait pas que ça. :)
Consulte ce lien si tu veux plus de détail à ce sujet :

Qu'est-ce qu'une procédure stockée et pourquoi les employer ?
http://faq.vb.free.fr/index.php?question3

--
Cordialement
Yanick
MVP pour Visual Basic