Base de données SQL et VB Net [Résolu]

cs_Galain 1270 Messages postés mardi 11 novembre 2003Date d'inscription 24 juillet 2013 Dernière intervention - 9 avril 2011 à 18:35 - Dernière réponse : cs_Megafan 390 Messages postés dimanche 7 avril 2002Date d'inscription 23 septembre 2016 Dernière intervention
- 13 avril 2011 à 08:36
bonjour à tous

Je travaille sous VB Net 2010 version Express sous Windows Seven
Dans un de mes projets j'ai besoin d'une base de données
J'ai choisi SQL Server
Dans mon projet j'ai ajouté ma base en local ainsi qu'un DataSet
Le Dataset ne contient qu'une table appelée PRATICIENS avec une seule Row appelée NOM
Au Form_Load je veux charger la combobox txtDocteur par le contenu de ma base
Si je tape dans ma combobox un nouveau nom La sub TxtDocteur_Validating doit ouvrir ma base de données et enregistrer ce nouveau nom
Même avec l'excellent cours sur VB net PLASSERE/Developpez.com je n'y arrive pas

Ci-joint le code d'une Form de test pour en cas de succes l'intéger dans un plus gros projet

Imports System.Data
Imports System.Data.SqlClient

Public Class Form1

    Private MyConnexion As SqlConnection
    Private Mycommand As SqlCommand
    Private ObjetDataSet As New DataSet() 'Attention au New
    Private ObjetDataAdapter As SqlDataAdapter
    Private ObjetCommandBuilder As SqlCommandBuilder
    Private ObjetDataRow As DataRow
    Private ObjetDataTable As DataTable


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ' Ouvrir la base de données
        Connecter()
        Mycommand.CommandText = "SELECT PRATICIEN FROM PRATICIENS"
        Dim myReader As SqlDataReader = Mycommand.ExecuteReader()
        Do While myReader.Read()
            txtdocteur.Items.Add(myReader.GetString(0))
        Loop
        myReader.Close()
        MyConnexion.Close()

    End Sub

    Private Sub txtdocteur_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtdocteur.Validating

        txtdocteur.Text = txtdocteur.Text.ToUpper
        Txtprenom.Focus()

        ' Mise à jour base de données
        Connecter()
        ObjetDataRow = ObjetDataSet.Tables("PRATICIENS").NewRow()
        ObjetDataRow("Nom") = txtdocteur.Text
        ObjetDataSet.Tables("PRATICIENS").Rows.Add(ObjetDataRow)

        'Pour modifier les valeurs changées dans le DataAdapter
        ObjetCommandBuilder = New SqlCommandBuilder(ObjetDataAdapter)

        'Mise à jour
        ObjetDataAdapter.Update(ObjetDataSet, "PRATICIENS")

        'On vide le DataSet et on le 'recharge' de nouveau.
        ObjetDataSet.Clear()
        ObjetDataAdapter.Fill(ObjetDataSet, "PRATICIENS")
        ObjetDataTable = ObjetDataSet.Tables("PRATICIENS")

        ' ferme la connexion
        MyConnexion.Close()

    End Sub

    Private Sub Connecter()
        ' Ouverture de la base de données

        Dim MyConnexion = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind")
        MyConnexion.Open()
        Mycommand = MyConnexion.CreateCommand()


    End Sub

End Class


Merci à tous ceux qui liront ce message et encore plus à ceux qui m'orienteront vers une solution valable
Au plaisir de vous lire


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Afficher la suite 

15 réponses

Répondre au sujet
NSUADI 540 Messages postés mardi 4 août 2009Date d'inscription 1 février 2013 Dernière intervention - 11 avril 2011 à 01:59
+3
Utile
Salut!!

Bon voici une solution parmi tant d'autre:
Private con As New OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\foro.accdb")
    Private cmd As New OleDbCommand(""SELECT PRATICIEN FROM PRATICIENS"", con)
    Private rd As OleDbDataReader

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            con.Open()
            rd = cmd.ExecuteReader
            While rd.Read
                ComboBox1.Items.Add(rd(0))
            End While
            con.Close()
        Catch ex As Exception

        End Try
    End Sub

    Private Sub txtdocteur_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtdocteur.Validating
        Dim sqltxt As String = "Insert into Essai values('" + ComboBox1.Text.ToUpper + "')"
        Dim cmd As New OleDbCommand(sqltxt , con)
        Try
            con.Open()
            cmd.ExecuteNonQuery()
            con.Close()
        Catch ex As Exception

        End Try

    End Sub


Ce petit bout de code testé devrait te dépanner...
Ce qui compte,ce n'est pas ce qu'on a mais plutôt ce que l'on fait avec ce qu'on a...

Visual Basic .Net is the best
and vb6.0
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de NSUADI
cs_Galain 1270 Messages postés mardi 11 novembre 2003Date d'inscription 24 juillet 2013 Dernière intervention - 9 avril 2011 à 23:15
0
Utile
Désolé il faut lire : Le Dataset ne contient qu'une table appelée PRATICIENS avec une seul champ appelée NOM

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Commenter la réponse de cs_Galain
cs_Megafan 390 Messages postés dimanche 7 avril 2002Date d'inscription 23 septembre 2016 Dernière intervention - 10 avril 2011 à 10:05
0
Utile
Bonjour,
Pourquoi passer par un dataset pour ajouter un enregistrement à la table ?
faites un simple INSERT sur la table puis au pire rechargez votre dataset.
Commenter la réponse de cs_Megafan
cs_Galain 1270 Messages postés mardi 11 novembre 2003Date d'inscription 24 juillet 2013 Dernière intervention - 10 avril 2011 à 10:20
0
Utile
Salut Megafan

Merci pour ta réponse
Je vais essayer

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Commenter la réponse de cs_Galain
cs_Galain 1270 Messages postés mardi 11 novembre 2003Date d'inscription 24 juillet 2013 Dernière intervention - 10 avril 2011 à 18:38
0
Utile
Salut à tous

Je n'arrive à rien
Même si ma base est vide (la table Praticiens) la SUB TxtDocteur_Validating devrait m'inscrire dans la table le nom tapé dans TxtDocteur ( c'est une combobox).
ensuite après un nouveau lancement du projet je devrais retrouver le nom du docteur dans les items de la Combobox car chargé depuis la base de données par le Form_Load

Cela m'affiche bien la Form mais avec une Combobox vide
Est-ce l'enregistrement ou le chargement qui "merde" ? J'en sais rien

Un débutant en base de données qui appelle au secours

Merci bien pour vos réponses

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Commenter la réponse de cs_Galain
cs_Megafan 390 Messages postés dimanche 7 avril 2002Date d'inscription 23 septembre 2016 Dernière intervention - 10 avril 2011 à 18:49
0
Utile
Vérifie tout simplement dans la table si l'enregistrement se fait bien...

Ce bout de code doit ajouter un enregistrement

Dim MyConnexion = New SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind")
MyConnexion.Open()
Dim Mycommand as SqlCommand=New SqlCommand("INSERT INTO Praticiens (Praticien) VALUES ('test'),MyConnexion)
Mycommand ExecuteNonQuery()
MyConnexion.Close()
Commenter la réponse de cs_Megafan
cs_Megafan 390 Messages postés dimanche 7 avril 2002Date d'inscription 23 septembre 2016 Dernière intervention - 10 avril 2011 à 18:54
0
Utile
txtdocteur.Items.Add(myReader.GetString(0))

utilise plutôt

txtdocteur.Items.Add(myReader("Praticien").tostring)

et si tu as besoin de récupérer l'id (en cas de doublon sur le nom)

txtdocteur.Items.Add(new ListItem(myReader("Praticien").tostring,myReader("IdPraticien").tostring)
Commenter la réponse de cs_Megafan
cs_Soukainaaa 6 Messages postés vendredi 1 avril 2011Date d'inscription 11 juillet 2011 Dernière intervention - 11 avril 2011 à 01:01
0
Utile
je veux s'il veux plait le code de location de voiture en language vb 2008 en relation avec sql 2008 et merci
Commenter la réponse de cs_Soukainaaa
NSUADI 540 Messages postés mardi 4 août 2009Date d'inscription 1 février 2013 Dernière intervention - 11 avril 2011 à 02:05
0
Utile
 Private cmd As New OleDbCommand("SELECT PRATICIEN FROM PRATICIENS", con)


@Soukainaaa:
t'es mal barré,je pense que tu devrais faire un tour ici,ça t'aidera énormément!!
Commenter la réponse de NSUADI
cs_Megafan 390 Messages postés dimanche 7 avril 2002Date d'inscription 23 septembre 2016 Dernière intervention - 11 avril 2011 à 08:45
0
Utile
Il est clair que ce code n'est pas vraiment adapté à une connexion de base SQL Server


Megafan
Développeur de http://www.o10c.eu
Commenter la réponse de cs_Megafan
cs_Galain 1270 Messages postés mardi 11 novembre 2003Date d'inscription 24 juillet 2013 Dernière intervention - 11 avril 2011 à 10:29
0
Utile
Merci à tous

Je me suis servi du code de NSUADI avec une BDD Access 2007
Reste à dire à mon projet que la BDD access se trouve dans l'Application.StartPath du projet

Encore merci


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
Commenter la réponse de cs_Galain
NSUADI 540 Messages postés mardi 4 août 2009Date d'inscription 1 février 2013 Dernière intervention - 12 avril 2011 à 00:08
0
Utile
Salut,
en effet,ce n'est pas approprié pour une base SqlServer mais bon il n'y a pas grand chose qui change,le cpde est le même on utilise juste les classes adaptées pour SqlServer et c'est tout,ce qui donnerai un truc du genre:
Imports System.Data.SqlClient
Public Class Form1
    Private con As New SqlConnection("Data Source=ICONIC_D-PC\SQLEXPRESS;Initial Catalog=Essai;Integrated Security=True")
    Private cmd As New SqlCommand("select Name from Essai", con)
    Private rd As SqlDataReader

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            con.Open()
            rd = cmd.ExecuteReader
            While rd.Read
                ComboBox1.Items.Add(rd(0))
            End While
            con.Close()
        Catch ex As Exception
            Debug.Print(ex.ToString)
        End Try
       
    End Sub


    Private Sub ComboBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles ComboBox1.Validating
        Dim h As String = "Insert into Essai values('" + ComboBox1.Text.ToUpper + "')"
        Dim cmd2 As New SqlCommand(h, con)
        Try
            con.Open()
            cmd2.ExecuteNonQuery()
            con.Close()
        Catch ex As Exception
        End Try
        
    End Sub

End Class

Voilà,c'est réglé!!
Merci @Megafan pour la remarque,il était tard et j'ai pas été assez pointilleux sur le coup
Ce qui compte,ce n'est pas ce qu'on a mais plutôt ce que l'on fait avec ce qu'on a...

Visual Basic .Net is the best
and vb6.0
Commenter la réponse de NSUADI
cs_Megafan 390 Messages postés dimanche 7 avril 2002Date d'inscription 23 septembre 2016 Dernière intervention - 12 avril 2011 à 19:08
0
Utile
Pas grave, mais juste une question :
pourquoi utiliser
ComboBox1.Items.Add(rd(0))


alors que

ComboBox1.Items.Add(rd("Name").ToString)


est plus sympa non ?


Megafan

Développeur de http://www.o10c.eu


La nouvelle référence en matière de jeu de stratégie spatiale.
Commenter la réponse de cs_Megafan
NSUADI 540 Messages postés mardi 4 août 2009Date d'inscription 1 février 2013 Dernière intervention - 12 avril 2011 à 19:35
0
Utile
Salut,

je préfère l'index puisque avec le nom,il y a un risque de se tromper mais bon chacun fait comme il le sent et puis bon comme il renvoie qu'une seule colonne,c'est bien plus simple à mes yeux le 0 plutôt que le nom de la colonne...

Ce qui compte,ce n'est pas ce qu'on a mais plutôt ce que l'on fait avec ce qu'on a...

Visual Basic .Net is the best
and vb6.0
Commenter la réponse de NSUADI
cs_Megafan 390 Messages postés dimanche 7 avril 2002Date d'inscription 23 septembre 2016 Dernière intervention - 13 avril 2011 à 08:36
0
Utile
Si il y'a moins de risque de se tromper avec l'index plutôt qu'avec le nom de champ, je veux bien te croire.

Megafan

Développeur de http://www.o10c.eu http://www.o10c.eu


La nouvelle référence en matière de jeu de stratégie spatiale.
Commenter la réponse de cs_Megafan

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.