Newsletter Developpez.com

Inscrivez-vous gratuitement au Club pour recevoir
la newsletter hebdomadaire des développeurs et IT pro

Cours VB.NET

Image non disponible


précédentsommairesuivant

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

Image non disponible

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.

 
Sélectionnez

    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:

 
Sélectionnez


    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':

Image non disponible

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:

Image non disponible

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:

 
Sélectionnez


Imports System

Imports System.Data

Imports System.Data.OleDb

Dans la zone déclaration de la fenêtre:

 
Sélectionnez

'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.

 
Sélectionnez

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

Image non disponible

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.

Image non disponible

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"?

 
Sélectionnez

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:

 
Sélectionnez

For Each P In Resultat

   ListBox1.Items.Add(P.NOM )

Next

Order By permet de trier les résultats.

 
Sélectionnez

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'

Image non disponible

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

Image non disponible

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".

Image non disponible

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.

Image non disponible

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.

Image non disponible

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 .

Image non disponible

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'.

Image non disponible

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.

 
Sélectionnez

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:

 
Sélectionnez

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:

 
Sélectionnez

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*".

 
Sélectionnez

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.

 
Sélectionnez

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.

 
Sélectionnez

Dim db As New DataContext("…\Northwnd.mdf") ' 

Recupérer une table.

 
Sélectionnez

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)

 
Sélectionnez

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

précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.