Accueil
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi Eclipse MS-Office SQL & SGBD Oracle  4D  Business Intelligence

Cours VB.NET

Date de mise à jour : 05/12/2010


XVII-G. Créer une BD, ajouter une table à une base de données
XVII-G-1. Créer une base de données
XVII-G-2. Ajouter une table par code
XVII-H. LINQ et les bases de données


XVII-G. Créer une BD, ajouter une table à une base de données

Comment créer une base de données

Comment ajouter une table?

Pour consulter une base de données vous pouvez utiliser l'explorateur de serveurs.

Pour accéder à l'Explorateur de serveurs, sélectionnez Explorateur de serveurs dans le menu Affichage et regarder la doc.


XVII-G-1. Créer une base de données

Généralement la base de données est fournie à l'utilisateur avec l'exécutable.

Créer une Base Access.

Avec un Provider OleDB (en ADO): (System.Data.OLEDB) impossible de créer une BD Access par du code.

On rappelle qu'on peut créer rapidement une BD Access 'à la main':

Sur le fond d'écran: Bouton droit->Nouveau->Application Microsoft Access. Il faut ensuite la fournir

Si on veut absolument créer une BD Access par code, il faut passer par DAO.

    Référence: ajouter le composant COM 'Microsoft DAO 3.6 Library 5'

    Imports DAO

    Imports DAO.LanguageConstants

    Dim result As Boolean = False

    Dim dbe As New DBEngine

    Dim db As Database

    Try

    db = dbe.CreateDatabase("c:\test.mdb", dbLangGeneral)

    If Not (db Is Nothing) Then result = True

    Catch ex As Exception : MsgBox(ex.Message)

    Finally : If Not (db Is Nothing) Then db.Close()

    End Try
Ensuite, on peut travailler dessus avec ADO en OleDB.

(merci les forums de developpez.com)

Base SqlServer.

Avec un Provider SqlServer: (System.Data.SqlClient) on peut créer une BD Sql Server par du code.

Exemple:


    Protected Const SQL_CONNECTION_STRING As String = _

    "Server=localhost;" & _

    "DataBase=;" & _

    "Integrated Security=SSPI"

     

    Dim strSQL As String = _

    "IF EXISTS (" & _

    "SELECT * " & _

    "FROM master..sysdatabases " & _

    "WHERE Name = 'HowToDemo')" & vbCrLf & _

    "DROP DATABASE HowToDemo" & vbCrLf & _

    "CREATE DATABASE test"

     

    Dim northwindConnection As New SqlConnection(connectionString)

    Dim cmd As New SqlCommand(strSQL, northwindConnection)

    northwindConnection.Open()

    cmd.ExecuteNonQuery()

    northwindConnection.Close()
Code non testé.


Il est aussi possible (en VB 2008) de créer sa base de données SQL Server dans l'IDE (base de données SQL Server Compact 3.5 à l'aide de Visual Basic Express).

Menu 'Projet'=>'Ajouter un nouvel élément':

Cliquez sur 'Base de données locale'. Dans la zone Nom, tapez le nom de votre base (DataBase1), puis cliquez sur 'Ajouter'.

Dans l'assistant de configuration qui s'ouvre, cliquez sur annuler.

Pour ajouter des tables dans la base qui a été crée, double cliquez sur DataBase1.sdf dans l'explorateur de solution à droite (voir ci-dessous).
La structure de la base de données apparait à gauche dans l'explorateur de base de donnée. Cliquez sur Table avec le bouton droit de la souris; dans le menu qui apparait cliquez sur ajouter une table:

La fenêtre qui apparait permet de saisir un non de table et d'ajouter les champs et leurs types ainsi que la clé primaire.

Notez que la base de données (sous Windows 7) est dans Document/Visual Studio/Projects/Database/Database (Database étant le nom du programme)


XVII-G-2. Ajouter une table par code

Dans un Dataset, on peut ajouter des données puis par un update mettre à jour la base de données.

On peut aussi ajouter des tables en local dans le Dataset, mais updater la base ne rajoute pas les tables dans la base.

Comment donc ajouter une table à la base?

En fait pour ajouter une table à la base il faut le faire avec l'objet Command et sa méthode ExecuteNoQuery et une requête SQL:

On crée une Connexion et un objet Command, on indique à la propriété TypeCommand que l'on envoie du texte (pas une procédure stockée), on prépare le texte SQL avec CREATE puis on exécute avec ExecuteNoQuery.

Exemple :

Il existe une BD Acces nommée NOM.MDB , je veux y ajouter une Table nommée PARENT avec 3 champs CLI_ID CLI_NOM CLI_PRENOM:


Imports System

Imports System.Data

Imports System.Data.OleDb
Dans la zone déclaration de la fenêtre:

'Déclarer la connexion

Private ObjetConnection As OleDbConnection

' Déclaration l'Objet Commande

Private ObjetCommand As OleDbCommand

 

'Paramètres de connexion à la DB

Private strConn As String
Dans une routine Button1_Click créer une table avec 3 champs dans la base de données.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
 Handles Button1.Click
 

strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= c:nom.mdb;"

ObjetConnection = New OleDbConnection

'Donner à la propriété ConnectionString les paramètres de connexion

ObjetConnection.ConnectionString = strConn

'Ouvrir la connexion

ObjetConnection.Open()

'Instancier un objet Commande

ObjetCommand = New OleDbCommand

'Lier Commande et Connexion

ObjetCommand.Connection = ObjetConnection

'Indiquer le type de commande

ObjetCommand.CommandType = CommandType.Text

'Donner le texte de la commande SQL

ObjetCommand.CommandText = "CREATE TABLE PARENT (CLI_ID INTEGER NOT NULL 
 _PRIMARY KEY, CLI_NOM CHAR(32) NOT NULL, CLI_PRENOM VARCHAR(32))"

'Ici on crée une table PARENT avec 3 champs ; CLI_ID est un entier non nul qui sert de clé primaire,
' CLI_NOM  CLI_PRENOM sont des chaînes de 32 caractères.

'on exécute la commande

ObjetCommand.ExecuteNonQuery()

'Fermer la connexion

ObjetConnection.Close()

End Sub
			

XVII-H. LINQ et les bases de données

Comment interroger une base de données?

Jusqu'à VB 2005 on mettait les instructions SQL dans une chaîne de caractères et on créait un objet Command ADO avec cette chaîne pour interroger la base.

Avec VB 2008 et le Framework 3.5, on utilise LINQ un langage de requêtes (permettant d'interroger une source de données) directement dans le code Visual Basic et à l'aide de mots clés familiers (issues du SQL, le langage d'interrogation des bases de données).


A - Linq c'est quoi?

'Language-Integrated Query' (LINQ), veut dire "langage de requête intégré".

On l'utilise dans VB à partir de VB2008 (Framework 3.5).

C'est un langage de requêtes (permettant d'interroger une source de données) directement dans le code Visual Basic et à l'aide de mots clés familiers (issues du SQL, le langage d'interrogation des bases de données).

Cette source de données peut être un objet ArrayList, un tableau, une chaîne de caractères (voir Linq to Objects chapitre 1.18)mais aussi, c'est ce qui nous intéresse ici, DataSet ou une Base de données SQL.


Pour que LINQ soit pris en compte il faut:

-Utiliser le framework 3.5

-Dans les propriétés, onglet compile que Option Infer=On

-Ajouter Imports System.Data.Linq:


Si vous créez un nouveau projet dans VB 2008, toutes les conditions sont effectives par défaut; si vous modifiez un ancien projet, il faut rajouter certaines références:
Dans l'Explorateur de solutions (Projet, Propriétés..), cliquez sur 'Références', puis cliquez sur 'Ajouter une référence'. Cliquez sur .NET, sur l'assembly System.Data.Linq, puis sur OK, cela ajoute la référence.

Il faut ajouter l'espace de nom: Dans l'explorateur de solution cocher Systel.Data.Link comme ci-dessus ou ajouter les directives suivantes en haut du Module1 :Imports System.Data.Linq


Principe d'une requête Linq:

A titre d'exemple simpliste, on a des données dans MyData et chaque donnée a un champ 'Nom'. Comment chercher les enregistrements ayant comme nom "toto"?

Dim Resultat = From Element In MyData _

Where Element.Nom = "Toto" _

Select Element
On crée une variable de requête (ici ' Dim Resultat') qui contient les résultats,

puis l'expression de requête composée de:

- From : dans quoi chercher? dans chaque Element de MyData.

- Where : précise les conditions à appliquer.

- Select: Précise les éléments qui vont apparaître dans 'Resultat'


Remarquons que Dim From In Where Select doivent être sur une seule unique et même ligne; pour la lisibilité, on écrit sur plusieurs lignes en ajoutant des continuateurs de lignes " _".

Remarquons aussi qu'initialement on connaît MyData et on sait que chaque élément de MyData a un champ 'Nom', c'est tout!! On utilise dans la requête les nouvelles variables 'Resultat' et 'Element' sans avoir à déclarer leurs types (on aurait pu le faire). 'Element' est une variable de portée déduite comme élément de MyData.


'Et pour afficher les noms dans une ListBox:

For Each P In Resultat

   ListBox1.Items.Add(P.NOM )

Next
Order By permet de trier les résultats.

Dim Resultat = From Element In MyData _

 Order By Element.Price Descending, Element.Nom _

 Select Element.Nom, Element.Price
Ici on trie par prix décroissant, puis à prix égal sur le nom croissant.

Remarquons qu'on sélectionne seulement 2 'colonnes'.


B - Linq To DataSet

En plus de System.Linq, il doit y avoir une référence à System.Data et System.Data.DataSetExtentions pour le DataSet.

Exemple: On a une base de données Access (Nom.MDB), on veut charger la table 'FICHEPATIENT' qui contient les colonnes NOM, PRENOM, SEXE.. dans un DataSet puis interroger le DataSet avec Linq.

1 - Création de la source de données:

Il faut créer une source de données:

Menu 'Données'=> 'Ajouter une nouvelle source de données'

Ici la source de données est une base de données:

On clique sur 'Base de données' puis bouton 'Suivant'.

Ensuite il faut faire le choix de la connexion (Cela correspond au choix d'une base de données existante).

Cliquer sur 'Nouvelle connexion'. Une nouvelle fenêtre nommée 'Ajouter une connexion' s'ouvre:

Indiquer le type de source de données (ici Microsoft Access (OLEDB), puis le nom de la base de données; enfin cliquer sur "Ok".

On retrouve le nom de la bd dans la zone connexion, cliquer sur "Suivant".

Ensuite VB vous demande s'il faut copier la BD dans le projet: Si oui la BD sera copiée dans le répertoire de travail quand vous installerez votre application. A vous de voir.

Ensuite VB vous propose d'enregistrer les chaînes de connexion (nom de la base...) dans le fichier de configuration afin qu'elles soient stockées et lues lors de l'utilisation ultérieure. (Automatiquement bien sur) A vous de voir.

Ensuite il faut choisir dans la base les objets qui seront chargés dans le DataSet.

C'est habituellement les Tables. Cocher 'Tables' dérouler puis cocher FICHEPATIENT .

Cliquer sur "Terminer", la source de données a été créée.

Pour voir la source de données, cliquer dans le menu 'Données', 'Voir les sources de données'.

On voit bien le DataSet qui a été crée (NOMDataSet) et qui contient une table FICHEPATIENT.


2 - Remplir le DataSet:

On utilisera la méthode Fill du TableAdapter pour remplir le DataSet.

Private Sub Form1_Load

'Création d'un TableAdapter

Dim FPTableAdapter = New NOMDataSetTableAdapters.FICHEPATIENTTableAdapter

'Extraction des données et chargement du DataSet

FPTableAdapter.Fill(NOMDataSet.FICHEPATIENT)

End Sub
Voila, le DataSet est chargé puis déconnecté.


3 - Interroger le DataSet avec Linq:

Afficher tous les garçons.

Le champ SEXE contient 'M' ou 'F' le 'filtre' Where est donc simple et utilise '=':

LePatient.SEXE = "M"

Cela donne:

Dim query = _

From LePatient In NOMDataSet.FICHEPATIENT.AsEnumerable() _

Where LePatient.SEXE = "M" _

Select LePatient

'Et pour afficher les noms et prénoms dans une ListBox:

For Each P In query

ListBox1.Items.Add(P.NOM.ToString & P.PRENOM.ToString)

Next
FICHEPATIENT étant une Table (qui n'a pas l'interface IEnumerable), il faut ajouter .AsEnumerable()


Afficher tous les "PHILIPPE"

Comme notre champ PRENOM est de 20 caractères et qu'il contient des espaces, on ne peut utiliser '='; on va donc utiliser Like qui recherche si LePatient.PRENOM contient le modèle "PHILIPPE*".

Dim query = _

From LePatient In NOMDataSet.FICHEPATIENT.AsEnumerable() _

Where LePatient.PRENOM Like "PHILIPPE*" _

Select LePatient
Attention, dans le modèle il y a des caractères génériques:

? veut dire 1 caractère quelconque.

* veut dire 0 ou plusieurs caractères quelconque.

(Ce n'est pas les caractères'_' et '%' comme dans SQL!!!)


Afficher tous les "PHILIPPE" mais en créant une nouvelle variable de requête.

Dim query =  From LePatient In NOMDataSet.FICHEPATIENT.AsEnumerable() _

Where LePatient.PRENOM Like "PHILIPPE*" _

Select New With { _

.LeNom = LePatient.Field(Of String)("NOM"), _

.LeSexe = LePatient.Field(Of String)("SEXE")}

 

For Each P In query

ListBox1.Items.Add(P.LeNom.ToString & P.LeSexe.ToString)

Next
Ici la structure de la variable de requête (qui contient les résultats) est crée de toute pièce par Select New With {}, on s'est contenté de créer des champs avec un nouveau nom.


C - Linq To SQL

' DataContext permet une connexion à la base.

Dim db As New DataContext("…\Northwnd.mdf") ' 
Recupérer une table.

Dim Customers As Table(Of Customer) = db.GetTable(Of Customer)()

 

 ' Interrogation sur Customer en recherchant 'London'. 

Dim Query = _

  From cust In Customers _

  Where cust.City = "London" _ 

  Select cust 

 

 'Affichage résurtat sur la console

For Each cust In Query 

      Console.WriteLine("id=" & cust.CustomerID & _ ", City=" & cust.City) 

Next
On peut aussi exécuter des commandes sur le DataContext. (exemple: augmenter de 100 le prix unitaire)

db.ExecuteCommand ("UPDATE Products SET UnitPrice = UnitPrice + 100")

 

Les sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © . Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.

Vos questions techniques : forum d'entraide Accueil - Publiez vos articles, tutoriels, cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones. Nous contacter - Copyright 2000..2005 www.developpez.com