Cours VB.NETDate 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
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:
Private ObjetConnection As OleDbConnection
Private ObjetCommand As OleDbCommand
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
ObjetConnection. ConnectionString = strConn
ObjetConnection. Open ()
ObjetCommand = New OleDbCommand
ObjetCommand. Connection = ObjetConnection
ObjetCommand. CommandType = CommandType. Text
ObjetCommand. CommandText = " CREATE TABLE PARENT (CLI_ID INTEGER NOT NULL
_PRIMARY KEY, CLI_NOM CHAR (32 ) NOT NULL , CLI_PRENOM VARCHAR (32 ))"
ObjetCommand. ExecuteNonQuery ()
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
Dim FPTableAdapter = New NOMDataSetTableAdapters. FICHEPATIENTTableAdapter
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)()
Dim Query = _
From cust In Customers _
Where cust. City = " London " _
Select cust
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.
|