Problème d'enregistrement

kibimbwa Messages postés 8 Date d'inscription lundi 17 février 2014 Statut Membre Dernière intervention 20 février 2014 - 19 févr. 2014 à 11:57
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 - 20 févr. 2014 à 13:48
Bonjour à tous,

Je suis débutant avec le Visual Basic 2008.

Voici mon souci :

Je crée un formulaire pour me permettre d'enregistrer, modifier ou supprimer un enregistrement sur ma table ligne de la BDD.

Voici les codes de connexion à la Database :

Module Connect_Variable

Imports System
Imports System.Data
Imports System.Data.OleDb

Module Connect_Variable
Public cn As OleDb.OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Rodriguez.Rodriguez-PC\Documents\Visual Studio 2008\Projects\VoyageSyst\Data_Base\Db_Voyages.mdb")
End Module

Structure de ma table:

- id NuméroAuto
- ville_provenance Text
- ville_destination Text
- prix_unitaire Text


Voici les codes du Bouton Ajouter :

Private Sub CmdAjouter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdAjouter.Click
'On vérifie que les champs sont bien remplit....
If Trim(txtProvenance.Text) = "" Then
MsgBox("Veuillez saisir la ville de provenance", vbCritical + vbOKOnly, "Erreur")
txtProvenance.Focus()
ElseIf Trim(txtDestination.Text) = "" Then
MsgBox("Veuillez saisir la ville de destination", vbCritical + vbOKOnly, "Erreur")
txtDestination.Focus()
ElseIf Trim(txtPrix.Text) = "" Then
MsgBox("Veuillez saisir le prix", vbCritical + vbOKOnly, "Erreur")
txtPrix.Focus()
Else
Dim Req As New OleDb.OleDbCommand
Dim Datread As OleDb.OleDbDataReader
Try
cn.Open()

Req.Connection = cn
Req.CommandType = CommandType.Text
Req.CommandText = "SELECT *FROM ligne WHERE ville_provenance='" & txtProvenance.Text & "' and ville_destination='" & txtDestination.Text & "'"

Datread = Req.ExecuteReader
'On vérifie si la ligne existe déjà
If Not Datread.HasRows Then
Req.CommandText = "INSERT INTO ligne(ville_provenance, ville_destination, prix_unitaire_ligne) VALUES('" & txtProvenance.Text & "','" & txtDestination.Text & "','" & txtPrix.Text & "')"
Req.ExecuteNonQuery()
cn.Close()
Else
MsgBox("Désolé cette ligne existe dèja", vbCritical + vbOKOnly, "Erreur")
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End If
End Sub


Voici le message que j'ai quand je clique sur le bouton Enregistrer :

Un DataReader associé à cette commande est déjà ouvert. Il doit d'abord être fermé

Cependant, je sollicite votre aide pour savoir comment décanter cette situation et savoir comment seront les codes des autres boutons...

6 réponses

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
19 févr. 2014 à 13:22
Bonjour,

Déjà. pour tes prochains messages sur le forum, merci d'utiliser la coloration syntaxique : http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

Ensuite... as tu essayé en mode pas à pas pour voir sur quelle ligne tu rencontrais le souci ?

NB; je pense que tu peux mettre ton cn.Close() à la fin de ta Sub.
Sinon, il y a des cas où tu ne fermes pas la connexion.. le souci vient peut-être de là.
0
kibimbwa Messages postés 8 Date d'inscription lundi 17 février 2014 Statut Membre Dernière intervention 20 février 2014
19 févr. 2014 à 15:08
Merci beaucoup Jordane45,

Je viens de tester en mode pas à pas pour voir sur quelle ligne il y à un souci, c'est la ligne qui suit après le Msgbox(ex.Message). Donc c'est après cette ligne que ce message apparait.

Votre support please
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
19 févr. 2014 à 16:02
Non... le message apparait "GRÂCE" au msgbox.
Tu as un bloc Try Catch qui permet d'intercepter les erreurs..
Il faut voir quelle ligne provoque une erreur et t'amène dans le bloc Catch ex As Exception
0
kibimbwa Messages postés 8 Date d'inscription lundi 17 février 2014 Statut Membre Dernière intervention 20 février 2014
19 févr. 2014 à 16:46
Merci Jordane,

Est-ce que pourriez-vous m'aider à investiguer? Cad, de crée et voir le résultat. Car je tout essayez, mais je ne sais pas comment relevé ce problème.

Merci encore.
0
kibimbwa Messages postés 8 Date d'inscription lundi 17 février 2014 Statut Membre Dernière intervention 20 février 2014
19 févr. 2014 à 17:06
Jordane, je pense que ce mon Req.ExecuteNonQuery() après mon insertion qui surgit cette erreur...

Merci de m'aider, please...
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
19 févr. 2014 à 17:09
Et bien.. déjà.. quelle est la ligne qui, en mode pas à pas, se trouve juste avant d'arriver sur le msgbox..???

Sinon, teste un autre code :
http://msdn.microsoft.com/fr-fr/library/system.data.oledb.oledbdatareader%28v=vs.110%29.aspx
0
kibimbwa Messages postés 8 Date d'inscription lundi 17 février 2014 Statut Membre Dernière intervention 20 février 2014
19 févr. 2014 à 18:01
If Not Datread.HasRows Then
Req.CommandText = "INSERT INTO ligne(ville_provenance, ville_destination, prix_unitaire_ligne) VALUES('" & txtProvenance.Text & "','" & txtDestination.Text & "','" & txtPrix.Text & "')"
Req.ExecuteNonQuery()
cn.Close()
Else
MsgBox("Désolé cette ligne existe dèja", vbCritical + vbOKOnly, "Erreur")
End If 
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
19 févr. 2014 à 20:20
Bonjour
mélange de vb6 et vb.net
D'abord active Option strict et option explicit
Projet -> prorieté de ton projet -> onglet compile
De plus, retire l'import automatique de l'espace de nom "Microsoft.VisualBasic" (onglet "Références" dans les propriétés du projet).

1
If Not Datread.HasRows Then  
Datread.close


utilise les requetes parametrées
http://codes-sources.commentcamarche.net/faq/710-comment-faire-une-requete-parametree-dans-une-base-de-donnees

http://webman.developpez.com/articles/aspnet/sqlparameter/vbnet/
0
kibimbwa Messages postés 8 Date d'inscription lundi 17 février 2014 Statut Membre Dernière intervention 20 février 2014
20 févr. 2014 à 09:03
Bonjour Cs_ShayW,

Option Explicit = On
Option Strict = On

Merci de ton aide, mais quand je retire Microsoft.VisualBasic:
- Mon MsgBox, Trim est en couleur verte et affiche un message : Le nom 'MsgBox' n'est pas déclaré.

Quand je ferme mon
Datread.close
Le message apparait toujours.

En fait, je suis vraiment débutant en VB2008.

Il y a longtemps que j'utiliser le VB6. Cependant, je voulais me relancer dans la programmation mais cette fois si avec le Visual Basic 2008. Lisant un cours complet de Philippe LASSERE, je me retrouve à ressortir ce dont je vous demande de m'aider.
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
20 févr. 2014 à 09:30
bien sur tu as des erreurs c'est comme ça qu'on apprend
mieux vaut prendre des bonnes habitudes au début
messagebox en vb.net c'est MessageBox.Show("hello")
ex
   Dim result As DialogResult
result = MessageBox.Show("Voulez vous quitter ?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1)
If result = Windows.Forms.DialogResult.Yes Then
'blabla
end if

If Trim(txtProvenance.Text) = ""
trim est une méthode de la class string
if txtProvenance.Text.trim = "" then
corrige ton code et montre le avec la coloration syntaxique
0
kibimbwa Messages postés 8 Date d'inscription lundi 17 février 2014 Statut Membre Dernière intervention 20 février 2014
20 févr. 2014 à 10:03
Merci mais je suis vraiment désolé car je n'arrive pas à le faire.

Par contre peut-on le faire sans tester si les champs ne sont pas remplit car même sans cette condition l'enregistrement ne passe toujours pas.

Voici mon code :

Dim Req As New OleDb.OleDbCommand
            Dim Datread As OleDb.OleDbDataReader
            Try
                cn.Open()

                Req.Connection = cn
                Req.CommandType = CommandType.Text
                'On vérifie si la ligne existe déjà
                Req.CommandText = "SELECT *FROM ligne WHERE ville_provenance='" & txtProvenance.Text & "' and ville_destination='" & txtDestination.Text & "'"

                Datread = Req.ExecuteReader
                'On vérifie si la ligne existe pas
                'Si la ligne n'existe pas alors enregistre
                If Not Datread.HasRows Then
                    Req.CommandText = "INSERT INTO ligne(ville_provenance, ville_destination, prix_unitaire_ligne) VALUES('" & txtProvenance.Text & "','" & txtDestination.Text & "','" & txtPrix.Text & "')"
                    Req.ExecuteNonQuery()
                    cn.Close()
                Else
                    'Si la ligne existe alors affiche ce message
                    MsgBox("Désolé cette ligne existe dèja", vbCritical + vbOKOnly, "Erreur")
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try


Je voulais le tester d'abord sans cette condition, après je pourrais me focaliser à apprendre plus sur ces conditions.

Merci d'avance à vous...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
Modifié par cs_ShayW le 20/02/2014 à 10:28
If Not Datread.HasRows Then
Req.CommandText = "INSERT INTO ligne(ville_provenance, ville_destination, prix_unitaire_ligne) VALUES('" & txtProvenance.Text & "','" & txtDestination.Text & "','" & txtPrix.Text & "')"
Req.ExecuteNonQuery()
Datread.close
cn.Close()
Else
'Si la ligne existe alors affiche ce message
MessageBox.Show("Désolé cette ligne existe déja?", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)

End If
0
kibimbwa Messages postés 8 Date d'inscription lundi 17 février 2014 Statut Membre Dernière intervention 20 février 2014
20 févr. 2014 à 11:53
ShayW,

Le message s'affiche toujours, donc l'enregistrement ne s'effectue pas...

Un DataReader associé à cette commande est déjà ouvert. Il doit d'abord être fermé

Veuillez vérifier ci-haut mon code de connexion à la base de données si c'est bon. Mais je pense que le souci ne viens pas de là...
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
20 févr. 2014 à 13:48
Je ne sais pas
Tu devrais écrire les requetes paramétrées dans un module
séparément

Imports System.Data.OleDb
Module dbase
private cn As OleDb.OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Rodriguez.Rodriguez-PC\Documents\Visual Studio 2008\Projects\VoyageSyst\Data_Base\Db_Voyages.mdb")
private Sub EtablirConnect()
Try
cn.Open()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub

Private Function CheckRowVilleExist(ByVal provenance As String, ByVal destination As String) As Boolean

Dim command As New OleDbCommand
command.Connection = Connection
command.CommandText = "SELECT * FROM ligne WHERE ville_provenance = [from?] AND And ville_destination = [dest?];"
command.Parameters.Add("from?", OleDbType.BSTR).Value = provenance
command.Parameters.Add("dest?", OleDbType.BSTR).Value = destination
Try
Return Convert.ToBoolean(command.ExecuteScalar())
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try

End Function

Public Function InsertLigne(ByVal provenance As String, ByVal destination As String,byval prix as string) As Boolean
EtablirConnect()
If Not CheckRowVilleExist(provenance, destination) Then
Dim command As New OleDbCommand()
command.Connection = Connection
command.CommandText = "INSERT INTO ligne (ville_provenance,ville_destination,prix_unitaire_ligne) VALUES (?,?,?);"
command.Parameters.Add("?", OleDbType.BSTR).Value = provenance
command.Parameters.Add("?", OleDbType.BSTR).Value = destination
command.Parameters.Add("?", OleDbType.BSTR).Value = prix

Try
command.ExecuteNonQuery()
cn.close()
Return True
Catch ex As Exception
MessageBox.Show(ex.Message)
cn.close()
Return False
End Try
Else
cn.close()
Return False
End If
End Function
End Module

dans ta form
Private Sub CmdAjouter_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdAjouter.Click
'On vérifie que les champs sont bien remplit....
Dim prix As Double
'On vérifie que les champs sont bien remplit....
If (txtProvenance.Text).Trim = "" Then
MessageBox.Show("Veuillez saisir la ville de provenance", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
txtProvenance.Focus()
ElseIf (txtDestination.Text).Trim = "" Then
MessageBox.Show("Veuillez saisir la ville de destination", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
txtDestination.Focus()
'il faut verifier si le prix est numérique
ElseIf Not Double.TryParse((TxtPrix.Text).Trim, prix) Then
MessageBox.Show("Veuillez saisir le prix en chiffres ", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
TxtPrix.Focus()
Else
IF InsertLigne(txtProvenance.Text,txtDestination.Text,
prix.tostring) then
Messagebox.show("la ligne a été ajoutée")
Else
MessageBox.Show("La ligne existe déja", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
End If
End Sub
0
Rejoignez-nous