|
Packit |
1470ea |
|
|
Packit |
1470ea |
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" type="topic" id="record-collection.js" xml:lang="fr">
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<info>
|
|
Packit |
1470ea |
<title type="text">Record collection (JavaScript)</title>
|
|
Packit |
1470ea |
<link type="guide" xref="js#examples"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<desc>Création d'une petite base de données pour trier votre discothèque</desc>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<revision pkgversion="0.1" version="0.1" date="2011-02-22" status="review"/>
|
|
Packit |
1470ea |
<credit type="author">
|
|
Packit |
1470ea |
<name>Projet de Documentation GNOME</name>
|
|
Packit |
1470ea |
<email its:translate="no">gnome-doc-list@gnome.org</email>
|
|
Packit |
1470ea |
</credit>
|
|
Packit |
1470ea |
<credit type="author">
|
|
Packit |
1470ea |
<name>Johannes Schmid</name>
|
|
Packit |
1470ea |
<email its:translate="no">jhs@gnome.org</email>
|
|
Packit |
1470ea |
</credit>
|
|
Packit |
1470ea |
<credit type="editor">
|
|
Packit |
1470ea |
<name>Marta Maria Casetti</name>
|
|
Packit |
1470ea |
<email its:translate="no">mmcasettii@gmail.com</email>
|
|
Packit |
1470ea |
<years>2013</years>
|
|
Packit |
1470ea |
</credit>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
|
|
Packit |
1470ea |
<mal:name>Luc Rebert,</mal:name>
|
|
Packit |
1470ea |
<mal:email>traduc@rebert.name</mal:email>
|
|
Packit |
1470ea |
<mal:years>2011</mal:years>
|
|
Packit |
1470ea |
</mal:credit>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
|
|
Packit |
1470ea |
<mal:name>Alain Lojewski,</mal:name>
|
|
Packit |
1470ea |
<mal:email>allomervan@gmail.com</mal:email>
|
|
Packit |
1470ea |
<mal:years>2011-2012</mal:years>
|
|
Packit |
1470ea |
</mal:credit>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
|
|
Packit |
1470ea |
<mal:name>Luc Pionchon</mal:name>
|
|
Packit |
1470ea |
<mal:email>pionchon.luc@gmail.com</mal:email>
|
|
Packit |
1470ea |
<mal:years>2011</mal:years>
|
|
Packit |
1470ea |
</mal:credit>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
|
|
Packit |
1470ea |
<mal:name>Bruno Brouard</mal:name>
|
|
Packit |
1470ea |
<mal:email>annoa.b@gmail.com</mal:email>
|
|
Packit |
1470ea |
<mal:years>2011-12</mal:years>
|
|
Packit |
1470ea |
</mal:credit>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
|
|
Packit |
1470ea |
<mal:name>Luis Menina</mal:name>
|
|
Packit |
1470ea |
<mal:email>liberforce@freeside.fr</mal:email>
|
|
Packit |
1470ea |
<mal:years>2014</mal:years>
|
|
Packit |
1470ea |
</mal:credit>
|
|
Packit |
1470ea |
</info>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<title>Record collection</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<synopsis>
|
|
Packit |
1470ea |
Dans ce tutoriel, vous allez apprendre :
|
|
Packit |
1470ea |
<list>
|
|
Packit |
1470ea |
<item>comment vous connecter à une base de données en utilisant « libgda » </item>
|
|
Packit |
1470ea |
<item>comment insérer et parcourir des enregistrements dans une table de base de données </item>
|
|
Packit |
1470ea |
</list>
|
|
Packit |
1470ea |
</synopsis>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="intro">
|
|
Packit |
1470ea |
<title>Introduction</title>
|
|
Packit |
1470ea |
Cet exemple utilise le langage Javascript. Nous allons vous montrer comment vous connecter à une base de données et l'utiliser à partir d'un programme GTK en utilisant la bibliothèque GDA (GNOME Data Access). Vous devez bien sûr avoir déjà installé cette dernière.
|
|
Packit |
1470ea |
La bibliothèque GDA (GNOME Data Access) vous permet d'accéder de manière universelle à différentes sortes et types de sources de données, depuis les plus traditionnels systèmes de bases de données relationnelles, jusqu'à des sources aussi diverses qu'un serveur de messagerie, un répertoire LDAP, etc. Pour de plus amples informations et pour une documentation et l'API complète, consultez le <link href="http://library.gnome.org/devel/libgda/stable/">Site Web de GDA</link>.
|
|
Packit |
1470ea |
Bien que la plus grosse partie du programme se réfère à l'interface utilisateur (GUI), nous allons orienter notre tutoriel sur les fonctions bases de données (avec des explications sur certaines autres fonctions que nous jugeons pertinentes). Pour de plus amples informations sur les programmes GNOME en Javascript, consultez le tutoriel <link xref="image-viewer.js">Programme visionneur d'images</link>.
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="anjuta">
|
|
Packit |
1470ea |
<title>Création d'un projet dans Anjuta</title>
|
|
Packit |
1470ea |
Avant de commencer à programmer, vous devez ouvrir un nouveau projet dans Anjuta. Ceci crée tous les fichiers qui vous sont nécessaires pour construire et exécuter votre programme plus tard. C'est aussi utile pour tout regrouper en un seul endroit.
|
|
Packit |
1470ea |
<steps>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
Lancez Anjuta et cliquez sur <guiseq><gui>Fichier</gui><gui>Nouveau</gui><gui>Projet</gui></guiseq> pour ouvrir l'assistant de création de projet.
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
Cliquez sur l'onglet <gui>JS</gui>, choisissez <gui>JavaScript générique</gui>, cliquez sur <gui>Continuer</gui> et renseignez les champs requis avec vos informations. Mettez <file>discotheque</file> (sans accent) comme nom du projet et répertoire.
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
Cliquez sur <gui>Appliquer</gui> et votre projet est créé. Ouvrez <file>src/main.js</file> depuis l'onglet <gui>Projet</gui> ou l'onglet <gui>Fichiers</gui>. Il contient un exemple de programme très basique.
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
</steps>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="structure">
|
|
Packit |
1470ea |
<title>Structure du programme</title>
|
|
Packit |
1470ea |
<media type="image" mime="image/png" src="media/record-collection.png"/>
|
|
Packit |
1470ea |
Cet exemple est une application GTK simple (avec une seule fenêtre) pouvant insérer des enregistrements dans une table de base de données et également consulter tous les enregistrements de cette table. Cette table possède deux champs : id , un entier et name , une variable de type caractère. La première section de l'application (en haut) vous permet d'insérer un enregistrement dans la table. La dernière (en bas) vous permet d'afficher tous les enregistrements de cette table. Son contenu est mis à jour à chaque fois qu'un nouvel enregistrement est inséré et au démarrage de l'application.
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="start">
|
|
Packit |
1470ea |
<title>Début du plaisir</title>
|
|
Packit |
1470ea |
Commençons par examiner le squelette du programme :
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
const GLib = imports.gi.GLib;
|
|
Packit |
1470ea |
const Gtk = imports.gi.Gtk;
|
|
Packit |
1470ea |
const Gda = imports.gi.Gda;
|
|
Packit |
1470ea |
const Lang = imports.lang;
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
function Demo () {
|
|
Packit |
1470ea |
this._init ();
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Demo.prototype = {
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
_init: function () {
|
|
Packit |
1470ea |
this.setupWindow ();
|
|
Packit |
1470ea |
this.setupDatabase ();
|
|
Packit |
1470ea |
this.selectData ();
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Gtk.init (null, null);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
var demo = new Demo ();
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
Gtk.main ();]]>
|
|
Packit |
1470ea |
<list>
|
|
Packit |
1470ea |
<item>Lignes 1‒4 : importations initiales. Faites surtout attention à la ligne 3, qui commande à Javascript l'importation de la bibliothèque GDA, la cible de ce tutoriel. </item>
|
|
Packit |
1470ea |
<item>Lignes 6‒17 : définition de la classe Demo . Faites surtout attention aux lignes 13‒15, où nous appelons 3 méthodes qui font tout le travail. Elles sont détaillées plus bas. </item>
|
|
Packit |
1470ea |
<item>Lignes 19‒23 : lancement de l'application. </item>
|
|
Packit |
1470ea |
</list>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="design">
|
|
Packit |
1470ea |
<title>Conception de l'application</title>
|
|
Packit |
1470ea |
Examinons la méthode setupWindow . C'est elle qui crée l'interface utilisateur. Comme l'interface utilisateur n'est pas notre sujet, nous en expliquons seulement les parties pertinentes.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
setupWindow: function () {
|
|
Packit |
1470ea |
this.window = new Gtk.Window ({title: "Data Access Demo", height_request: 350});
|
|
Packit |
1470ea |
this.window.connect ("delete-event", function () {
|
|
Packit |
1470ea |
Gtk.main_quit();
|
|
Packit |
1470ea |
return true;
|
|
Packit |
1470ea |
});
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// main box
|
|
Packit |
1470ea |
var main_box = new Gtk.Box ({orientation: Gtk.Orientation.VERTICAL, spacing: 5});
|
|
Packit |
1470ea |
this.window.add (main_box);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// first label
|
|
Packit |
1470ea |
var info1 = new Gtk.Label ({label: "Insert a record", xalign: 0, use_markup: true});
|
|
Packit |
1470ea |
main_box.pack_start (info1, false, false, 5);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// "insert a record" horizontal box
|
|
Packit |
1470ea |
var insert_box = new Gtk.Box ({orientation: Gtk.Orientation.HORIZONTAL, spacing: 5});
|
|
Packit |
1470ea |
main_box.pack_start (insert_box, false, false, 5);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// ID field
|
|
Packit |
1470ea |
insert_box.pack_start (new Gtk.Label ({label: "ID:"}), false, false, 5);
|
|
Packit |
1470ea |
this.id_entry = new Gtk.Entry ();
|
|
Packit |
1470ea |
insert_box.pack_start (this.id_entry, false, false, 5);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Name field
|
|
Packit |
1470ea |
insert_box.pack_start (new Gtk.Label ({label: "Name:"}), false, false, 5);
|
|
Packit |
1470ea |
this.name_entry = new Gtk.Entry ({activates_default: true});
|
|
Packit |
1470ea |
insert_box.pack_start (this.name_entry, true, true, 5);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Insert button
|
|
Packit |
1470ea |
var insert_button = new Gtk.Button ({label: "Insert", can_default: true});
|
|
Packit |
1470ea |
insert_button.connect ("clicked", Lang.bind (this, this._insertClicked));
|
|
Packit |
1470ea |
insert_box.pack_start (insert_button, false, false, 5);
|
|
Packit |
1470ea |
insert_button.grab_default ();
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Browse textview
|
|
Packit |
1470ea |
var info2 = new Gtk.Label ({label: "Browse the table", xalign: 0, use_markup: true});
|
|
Packit |
1470ea |
main_box.pack_start (info2, false, false, 5);
|
|
Packit |
1470ea |
this.text = new Gtk.TextView ({editable: false});
|
|
Packit |
1470ea |
var sw = new Gtk.ScrolledWindow ({shadow_type:Gtk.ShadowType.IN});
|
|
Packit |
1470ea |
sw.add (this.text);
|
|
Packit |
1470ea |
main_box.pack_start (sw, true, true, 5);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
this.count_label = new Gtk.Label ({label: "", xalign: 0, use_markup: true});
|
|
Packit |
1470ea |
main_box.pack_start (this.count_label, false, false, 0);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
this.window.show_all ();
|
|
Packit |
1470ea |
},]]>
|
|
Packit |
1470ea |
<list>
|
|
Packit |
1470ea |
<item>Lignes 22 et 27 : création des 2 entrées (pour les 2 champs) dans lesquelles l'utilisateur saisit les choses à insérer dans la base de données. </item>
|
|
Packit |
1470ea |
<item>Lignes 31‒34 : création du bouton « Insert ». Le signal clicked de ce bouton est connecté à la méthode privée _insertClicked de la classe. Cette méthode est décrite ci-dessous. </item>
|
|
Packit |
1470ea |
<item>Ligne 39 : création de l'élément graphique (TextView ) où nous affichons le contenu de la table. </item>
|
|
Packit |
1470ea |
<item>Ligne 44 : création de l'étiquette où nous affichons le nombre d'enregistrements dans la table. Au début, elle est vide et est mise à jour ultérieurement. </item>
|
|
Packit |
1470ea |
</list>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="connect">
|
|
Packit |
1470ea |
<title>Connexion à la base de données et initialisation</title>
|
|
Packit |
1470ea |
Le code permettant de se connecter à la base de données est dans la méthode setupDatabase ci-dessous :
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
setupDatabase: function () {
|
|
Packit |
1470ea |
this.connection = new Gda.Connection ({provider: Gda.Config.get_provider("SQLite"),
|
|
Packit |
1470ea |
cnc_string:"DB_DIR=" + GLib.get_home_dir () + ";DB_NAME=gnome_demo"});
|
|
Packit |
1470ea |
this.connection.open ();
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
try {
|
|
Packit |
1470ea |
var dm = this.connection.execute_select_command ("select * from demo");
|
|
Packit |
1470ea |
} catch (e) {
|
|
Packit |
1470ea |
this.connection.execute_non_select_command ("create table demo (id integer, name varchar(100))");
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
},]]>
|
|
Packit |
1470ea |
<list>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
Lignes 2‒3 : création de l'objet Connection de GDA. Il faut transmettre quelques propriétés à son constructeur :
|
|
Packit |
1470ea |
<list>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
provider : l'un des fournisseurs reconnus par GDA. GDA prend en charge SQLite, MySQL, PostgreSQL, Oracle et beaucoup d'autres. Pour les besoins de l'exemple, nous utilisons une base de données SQLite car elle est déjà incluse par défaut dans la plupart des distributions et elle est facile à utiliser (elle n'a besoin que d'un fichier comme base de données).
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
cnc_string : la chaîne de connexion. Elle peut être différente en fonction du fournisseur. La syntaxe pour SQLite est : DB_DIR=CHEMIN;DB_NAME=NOM2FICHIER . Dans cet exemple, nous accédons à une base de données nommée gnome_demo dans le dossier personnel de l'utilisateur (notez l'appel à la fonction get_home_dir de GLib).
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
</list>
|
|
Packit |
1470ea |
<note>
|
|
Packit |
1470ea |
Si le fournisseur n'est pas reconnu par GDA, ou si la chaîne de connexion n'est pas complète, la ligne 2 provoque une exception. Donc, en pratique, il faut gérer cette exception grâce à l'instruction JavaScript try ...catch .
|
|
Packit |
1470ea |
</note>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<item>Ligne 4 : ouverture de la connexion. Pour le fournisseur SQLite, si la base de donnée n'existe pas, elle est créée à cette étape. </item>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
Lignes 6‒10 : tentative de faire une simple instruction « select » pour vérifier que la table existe (ligne 7). Si elle n'existe pas (parce que la base de données vient juste d'être créée), cette instruction provoque une exception qu'il faut gérer grâce au bloc try ...catch . Dans ce cas, il faut exécuter l'instruction « create table » pour créer la table (ligne 9).
|
|
Packit |
1470ea |
In order to run the SQL commands above we are using the GDA connection methods execute_select_command and execute_non_select_command . They are simple to use, and just require two arguments: The Connection object and the SQL command to be parsed.
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
</list>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
À ce niveau, nous avons configuré la base de données et cette dernière est fonctionnelle.
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="select">
|
|
Packit |
1470ea |
<title>Sélection</title>
|
|
Packit |
1470ea |
Après connexion à la base de données, le constructeur de notre exemple appelle la méthode selectData . C'est elle qui récupère tous les enregistrements de la table et qui les affiche dans l'élément graphique TextView . Regardons à quoi elle ressemble :
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
selectData: function () {
|
|
Packit |
1470ea |
var dm = this.connection.execute_select_command ("select * from demo order by 1, 2");
|
|
Packit |
1470ea |
var iter = dm.create_iter ();
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
var text = "";
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
while (iter.move_next ()) {
|
|
Packit |
1470ea |
var id_field = Gda.value_stringify (iter.get_value_at (0));
|
|
Packit |
1470ea |
var name_field = Gda.value_stringify (iter.get_value_at (1));
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
text += id_field + "\t=>\t" + name_field + '\n';
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
this.text.buffer.text = text;
|
|
Packit |
1470ea |
this.count_label.label = "" + dm.get_n_rows () + " record(s)";
|
|
Packit |
1470ea |
},]]>
|
|
Packit |
1470ea |
<list>
|
|
Packit |
1470ea |
<item>Line 2: The SELECT command. We are using the GDA connection's execute_select_command method for that. It returns a DataModel object, which is later used to retrieve the rows. </item>
|
|
Packit |
1470ea |
<item>Ligne 3 : création d'un objet Iter qui sert à itérer sur les enregistrements de DataModel . </item>
|
|
Packit |
1470ea |
<item>Ligne 7 : Itération sur tous les enregistrements en les récupérant à l'aide de l'objet Iter . À cet endroit, la variable Iter contient les informations trouvées. La méthode move_next retourne le message false quand elle atteint le dernier enregistrement. </item>
|
|
Packit |
1470ea |
<item>
|
|
Packit |
1470ea |
Lignes 8‒9 : nous faisons deux choses dans chaque ligne :
|
|
Packit |
1470ea |
<list>
|
|
Packit |
1470ea |
<item>Utilisez la méthode get_value_at d'Iter qui n'a besoin que d'un argument : le numéro de colonne à récupérer, en commençant par 0. Comme notre commande SELECT ne retourne que deux colonnes, nous récupérons donc les colonnes 0 et 1. </item>
|
|
Packit |
1470ea |
<item>La méthode get_value_at retourne l'information sur les champs au format GValue de GLib. Pour convertir ce format en chaîne de caractères, utilisez simplement la fonction globale value_stringify de GDA. C'est ce que nous faisons ici puis nous enregistrons les résultats dans les variables id_field et name_field . </item>
|
|
Packit |
1470ea |
</list>
|
|
Packit |
1470ea |
</item>
|
|
Packit |
1470ea |
<item>Ligne 11 : concaténation des deux chaînes pour former une seule ligne de texte en les séparant par "=>" et enregistrement dans la variable text . </item>
|
|
Packit |
1470ea |
<item>Ligne 14 : à la fin de la boucle, tous les enregistrements sont formatés dans la variable text . À cette ligne, nous attribuons le contenu de cette variable au TextView . </item>
|
|
Packit |
1470ea |
<item>Ligne 15 : affichage du nombre d'enregistrements dans la table avec la fonction get_n_rows de DataModel . </item>
|
|
Packit |
1470ea |
</list>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="insert">
|
|
Packit |
1470ea |
<title>Insertion</title>
|
|
Packit |
1470ea |
Bien, nous savons comment nous connecter à une base de données et comment sélectionner des lignes dans une table. Il est temps maintenant d'apprendre à faire une insertion à l'aide de la commande INSERT dans la table. Souvenez-vous, dans la méthode setupWindow , nous avions relié le signal clicked du bouton <gui>Insert</gui> à la méthode _insertClicked . Voyons la mise en place de cette méthode.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
_insertClicked: function () {
|
|
Packit |
1470ea |
if (!this._validateFields ())
|
|
Packit |
1470ea |
return;
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Gda.execute_non_select_command (this.connection,
|
|
Packit |
1470ea |
// "insert into demo values ('" + this.id_entry.text + "', '" + this.name_entry.text + "')");
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
var b = new Gda.SqlBuilder ({stmt_type:Gda.SqlStatementType.INSERT});
|
|
Packit |
1470ea |
b.set_table ("demo");
|
|
Packit |
1470ea |
b.add_field_value_as_gvalue ("id", this.id_entry.text);
|
|
Packit |
1470ea |
b.add_field_value_as_gvalue ("name", this.name_entry.text);
|
|
Packit |
1470ea |
var stmt = b.get_statement ();
|
|
Packit |
1470ea |
this.connection.statement_execute_non_select (stmt, null);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
this._clearFields ();
|
|
Packit |
1470ea |
this.selectData ();
|
|
Packit |
1470ea |
},]]>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
We have learned how to use the GDA connection's methods execute_select_command and execute_non_select_command to quickly execute SQL commands on the database. GDA allows one to build a SQL statement indirectly, by using its SqlBuilder object. What are the benefits of this? GDA will generate the SQL statement dynamically, and it will be valid for the connection provider used (it will use the same SQL dialect the provider uses). Let's study the code:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<list>
|
|
Packit |
1470ea |
<item>Lignes 2‒3 : vérification du bon renseignement par l'utilisateur de tous les champs. Le code de la méthode privée _validateFields est vraiment simple et vous pouvez le consulter dans le programme source complet de l'exemple. </item>
|
|
Packit |
1470ea |
<item>Ligne 5 : la façon la plus rapide pour faire l'insertion à l'aide de la commande INSERT . Celle-ci est mise en commentaire car nous voulons vous montrer comment utiliser l'objet SqlBuilder pour construire une instruction SQL qui soit indépendante de la base de données. </item>
|
|
Packit |
1470ea |
<item> Ligne 7 : création de l'objet SqlBuilder . Nous devons transmettre le type d'instruction que nous voulons construire. Cela peut être SELECT , UPDATE , INSERT ou DELETE . </item>
|
|
Packit |
1470ea |
<item>Ligne 8 : détermination du nom de la table sur laquelle l'instruction construite va agir (le code INSERT INTO demo est généré) </item>
|
|
Packit |
1470ea |
<item>Lignes 9‒10 : détermination des champs et de leurs valeurs qui font partie de l'instruction. Le premier argument est le nom du champ (comme dans la table). Le second est la valeur pour ce champ. </item>
|
|
Packit |
1470ea |
<item>Ligne 11 : fabrication de l'objet Statement généré dynamiquement et qui représente une instruction SQL. </item>
|
|
Packit |
1470ea |
<item>Ligne 12 : enfin, exécution de l'instruction SQL (INSERT ). </item>
|
|
Packit |
1470ea |
<item>Ligne 14 : effacement des champs « id » et « name » à l'écran. Le code de la méthode privée _clearFields est vraiment simple et vous pouvez le consulter dans le programme source complet de l'exemple. </item>
|
|
Packit |
1470ea |
<item>Ligne 15 : mise à jour de l'affichage à l'écran en faisant un nouveau SELECT . </item>
|
|
Packit |
1470ea |
</list>
|
|
Packit |
1470ea |
<note>Vous pouvez aussi faire usage de paramètres pour construire l'instruction. En utilisant les objets SqlBuilder et des paramètres, vous êtes moins exposé à des attaques du type injection SQL. Consultez la <link href="http://library.gnome.org/devel/libgda/stable/">documentation GDA</link> pour plus d'informations sur les paramètres. </note>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="run">
|
|
Packit |
1470ea |
<title>Exécution de l'application</title>
|
|
Packit |
1470ea |
Tout le programme nécessaire doit maintenant être en place, donc essayez de l'exécuter. Vous disposez maintenant d'une base de donnée pour votre discothèque !
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="impl">
|
|
Packit |
1470ea |
<title>Implémentation de référence</title>
|
|
Packit |
1470ea |
Si vous rencontrez des difficultés avec ce tutoriel, comparez votre programme à ce <link href="record-collection/record-collection.js">programme de référence</link>.
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
</page>
|