Base de données SQL et VB Net

Résolu
Profil bloqué - 9 avril 2011 à 18:35
cs_Megafan Messages postés 389 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 23 septembre 2016 - 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

15 réponses

NSUADI Messages postés 540 Date d'inscription mardi 4 août 2009 Statut Membre Dernière intervention 1 février 2013 2
11 avril 2011 à 01:59
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
3
Profil bloqué
9 avril 2011 à 23:15
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
0
cs_Megafan Messages postés 389 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 23 septembre 2016 2
10 avril 2011 à 10:05
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.
0
Profil bloqué
10 avril 2011 à 10:20
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
0

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

Posez votre question
Profil bloqué
10 avril 2011 à 18:38
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
0
cs_Megafan Messages postés 389 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 23 septembre 2016 2
10 avril 2011 à 18:49
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()
0
cs_Megafan Messages postés 389 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 23 septembre 2016 2
10 avril 2011 à 18:54
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)
0
cs_Soukainaaa Messages postés 6 Date d'inscription vendredi 1 avril 2011 Statut Membre Dernière intervention 11 juillet 2011
11 avril 2011 à 01:01
je veux s'il veux plait le code de location de voiture en language vb 2008 en relation avec sql 2008 et merci
0
NSUADI Messages postés 540 Date d'inscription mardi 4 août 2009 Statut Membre Dernière intervention 1 février 2013 2
11 avril 2011 à 02:05
 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!!
0
cs_Megafan Messages postés 389 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 23 septembre 2016 2
11 avril 2011 à 08:45
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
0
Profil bloqué
11 avril 2011 à 10:29
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
0
NSUADI Messages postés 540 Date d'inscription mardi 4 août 2009 Statut Membre Dernière intervention 1 février 2013 2
12 avril 2011 à 00:08
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
0
cs_Megafan Messages postés 389 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 23 septembre 2016 2
12 avril 2011 à 19:08
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.
0
NSUADI Messages postés 540 Date d'inscription mardi 4 août 2009 Statut Membre Dernière intervention 1 février 2013 2
12 avril 2011 à 19:35
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
0
cs_Megafan Messages postés 389 Date d'inscription dimanche 7 avril 2002 Statut Membre Dernière intervention 23 septembre 2016 2
13 avril 2011 à 08:36
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.
0
Rejoignez-nous