Problème d'enregistrement

Signaler
Messages postés
8
Date d'inscription
lundi 17 février 2014
Statut
Membre
Dernière intervention
20 février 2014
-
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
-
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

Messages postés
32477
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 mai 2021
347
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à.
Messages postés
8
Date d'inscription
lundi 17 février 2014
Statut
Membre
Dernière intervention
20 février 2014

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
Messages postés
32477
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 mai 2021
347
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
Messages postés
8
Date d'inscription
lundi 17 février 2014
Statut
Membre
Dernière intervention
20 février 2014

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.
Messages postés
8
Date d'inscription
lundi 17 février 2014
Statut
Membre
Dernière intervention
20 février 2014

Jordane, je pense que ce mon Req.ExecuteNonQuery() après mon insertion qui surgit cette erreur...

Merci de m'aider, please...
Messages postés
32477
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
15 mai 2021
347
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
Messages postés
8
Date d'inscription
lundi 17 février 2014
Statut
Membre
Dernière intervention
20 février 2014

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 
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
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/
Messages postés
8
Date d'inscription
lundi 17 février 2014
Statut
Membre
Dernière intervention
20 février 2014

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.
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
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
Messages postés
8
Date d'inscription
lundi 17 février 2014
Statut
Membre
Dernière intervention
20 février 2014

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...
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
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
Messages postés
8
Date d'inscription
lundi 17 février 2014
Statut
Membre
Dernière intervention
20 février 2014

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à...
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
50
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