Dans ce nouvel article, nous allons apprendre à utiliser le conteneur
de base de Windows Ce. A la différence avec visual studio Vc++
classique pour la programmation PC, Visual Embeded C++ possède
un nombre de classe de base plus réduite. Les classes MFC utilisé
pour les bases de données, tel que CDaoDataBase ( DAO) et CDataBase
( ODBC) ne sont plus supportées par les MFC sous Windows CE.
Désormais pour pouvoir faire appel par exemple à une base
ACCESS en mode DAO, il faut passer par l'intermédiaire d'API
implémenté dans un driver spécifique. D'ailleurs
sous Visual embedded basic, un objet DAO existe sous cette forme.
Pour ceux qui aime le confort des MFC, Il existe tout de même
sous Visual Studio Embedded C++ une classe de type base de donnée.
Elle s'appelle CCeDBDataBase. Cet objet ne permet pas réellement
des fonctionnalités complètes de base de données,
mais plutôt d'effectuer une collection d'objet. Windows CE va
effectuer tous les enregistrements dans une base unique, et un système
d'identifiant va permettre de reconnaître l'appartenance des différents
objets stocké. Ce système est suffisant pour un grand
nombre d'application.
Fonctionnement général :
Pour utiliser ce système de stockage, il faut effectuer les
actions de façon similaire au autre type de base de données.
A la seule différence que l'on ne peut pas se servir de requêtes
SQL.
Dans un premier temps, on regarde si la Base existe. Dans le cas contraire,
il suffira de la créer.
Si la Base est déjà créée, il suffit pour
travailler avec de l'ouvrir en créant une instance la désignant.
Une fois la base ouverte, on peut rajouter des données, modifier,
récupérer et/ou supprimer des données. L'action
voulut terminé il suffit de refermer l'instance.
Cette forme de stockage n'est donc pas un problème pour l'implémentation
d'une simple base pour une application Pocket PC.
Include:
#include "Wcedb.h"
Pré déclaration :
const DWORD DB_IDENT_ENFANT = 12345;
const WCHAR DB_NOM_ENFANT[] = _T("Enfant");
const WORD PROP_PRENOMS = 101,
PROP_NOM = 102,
PROP_JOUET = 103;
|
Comment Créer une base ?
Lorsque l'on va créer la base, on va spécifier le nombre
de types d'enregistrements qui devront être triés. Ce nombre
ne représente pas le nombre de type d'enregistrement différents
qu'il sera possible de rentrer dans la base, un type d'enregistrement
pouvant être assimilé à un champ de données,
mais simplement ceux qui seront triés selon un critère.
Donc si l'on choisit de trier trois types de données, cela ne
nous empêchera pas d'en enregistrer quatre ou cinq au total dans
la base.
Vous trouverez si dessous un exemple de création d'une base
connue par l'application exemple sous le nom " Enfant ". (Cf
: pré déclaration)
Dans cet exemple, on veut trier trois sortes de données dans
la base.
La première est le prénom de l'enfant que l'on veut enregistrer
de façon croissante.
La seconde est le nom de l'enfant que l'on veut enregistrer de façon
décroissante.
La troisième est son jouet préféré qui va
se placer à la fin de tous les enregistrements par défaut.
La création va fournir un identifiant qui va nous permettre de
retrouver notre base, mais on peut également utiliser le nom
de la base pour effectuer les mêmes actions.
CCeDBDatabase db; // Création d'une instance base de donnée
CEOID poid; // Va permettre de repérer l'identifiant de la création de la base
// On vérifie que la base n'existe pas avant de la créer
if(!CCeDBDatabase::Exists(DB_NOM_ENFANT))
{
// Création des propriétés de tries de la base
CCeDBProp SortProps[3] = {
CCeDBProp(CCeDBProp::Type_String, PROP_PRENOMS,
CCeDBProp::Sort_Ascending),
CCeDBProp(CCeDBProp::Type_String, PROP_NOM,
CCeDBProp::Sort_ Descending),
CCeDBProp(CCeDBProp::Type_String, PROP_JOUET,
CCeDBProp::Sort_UnknownFirst)
};
// Création de la base avec récupération de son ID
if(!(poid = db.Create(DB_NOM_ENFANT, // Nom base
DB_IDENT_ENFANT, // Id Base
3, // Nombre de propriété
SortProps))) return FALSE; // Liste de propriété
}
// Fermeture de la base
db.Close();
|
Comment ouvrir une base ?
L'ouverture de la base est une opération simple, elle peut s'effectuer
avec le nom de la base à ouvrir ou avec son identifiant que l'on
aura récupéré lors de sa création.
// instance de base de donnée
CCeDBDatabase db;
// Ouverture de la base
if(!db.Open(DB_NOM_ENFANT)) return FALSE;
// Fermeture de la base
db.Close() ;
|
Comment ajouter un enregistrement ?
Pour ajouter un enregistrement à la base, il faut créer
un record et un élément propriété base qui
va permettre de remplir le record. Un record ne peut s'ajouter que vous
possédez une instance dirigé sur celle-ci, il faut donc
l'avoir au préalable ouverte avec la fonction .Open() .
La classe record est : CCeDBRecord
La classe propriété est CCeDBProp
// Création d'un record
CCeDBRecord rec;
// Création d'une liste de propriété
CCeDBProp props[3];
CString str;
str= Prenoms;
// On remplis les propriétés en indiquant la donnée
// à insérée et l'Id du champ visé
props[0] = CCeDBProp((LPWSTR)(LPCTSTR)str,PROP_PRENOMS);
str= Nom;
props[1] = CCeDBProp((LPWSTR)(LPCTSTR)str, PROP_NOM);
str= Jouet;
props[2] = CCeDBProp((LPWSTR)(LPCTSTR)str, PROP_JOUET);
rec.AddProps(props,3);
// Cette fonction permet de remplir le record
// avec les données précédemment définies
if(!db.AddRecord(&rec)) return FALSE;
// Permet de libérer la liste de propriété
rec.DeleteAllProps();
|
Comment afficher le contenu de la base ?
Afficher le contenu d'une base suppose que l'on peut effectuer une
recherche et récupérer un élément. Je vais
illustrer ces fonctionnalités par la fonction ci-dessous permettant
d'afficher le contenu de la base " Enfant " dans une ListBox.
// Fonction d'affichage dans une liste box
bool AfficheDBInListeBox(CListBox* pList)
{
// Déclaration d'un instance de base de donnée
CCeDBDatabase db;
// Déclaration d'une instance Record
CCeDBRecord rec;
CString str;
// Ouverture de la base
if(!db.Open(DB_NOM_ENFANT)) return FALSE;
// Remise à zéro du contenu de la ListBox
pList->ResetContent();
// Récupération de l'ancien mode (Activé ou non Activé)
BOOL bPrev = db.m_bAutoSeekNext;
// Le mode AutoSeekNext permet de rechercher
// Automatiquement l'enregistrement suivant à l'appel
// de la fonction ReadCurrRecord qui permet de récupérer
// l'enregistrement sur lequel on se trouve.
// Mode auto seek activé
db.m_bAutoSeekNext = TRUE;
// Recherche du premier élément de la base
db.SeekFirst();
// lecture de l'enregistrement courant + recherche
// du prochain (autoseek)
// Tant qu'il y a encore des enregistrements dans la base,
// les rechercher et les récupérer
while(db.ReadCurrRecord(&rec))
{
// Déclaration de pointeur de propriété pour
// récupérer le contenue de l'enregistrement
CCeDBProp *pPropPrenoms,*pPropNom,*pPropJouet;
// Récupération de la propriété de
// l'enregistrement du prénoms
pPropPrenoms = rec.GetPropFromIdent(PROP_PRENOMS);
// Récupération de la propriété de
// l'enregistrement du nom
pPropNom = rec.GetPropFromIdent(PROP_NOM);
// Récupération de la propriété de
// l'enregistrement du jouet
pPropJouet = rec.GetPropFromIdent(PROP_JOUET);
// Récupération des données dans un texte
str.Format(_T("%s %s %s"),pPropPrenoms->GetString(),
pPropNom->GetString(),
pPropJouet->GetString());
//affichage dans la ListBox
pList->AddString(str);
}
// Ancien mode réactivé
db.m_bAutoSeekNext = bPrev;
// Fermeture de la Base
db.Close();
return TRUE;
}
|
Maintenant, vous êtes capables de faire des recherches dans ce
type de base et de récupérer les données. L'étape
suivante consiste à savoir effacer une donnée.
Comment effacer un enregistrement dans une Base ?
Comme précédemment, voici un exemple de fonction permettant
d'effacer une donnée. Ici on veut pouvoir effacer un enregistrement
en sélectionnant un prénom.
// Fonction d'effacement
bool ClearRecord(LPCTSTR Prenoms)
{
// Déclaration d'une instance Base de donnée
CCeDBDatabase db;
// Déclaration permettant de stocker
// un Id Base de donnée
CEOID poid;
// Déclaration d'une instance Propriété
CCeDBProp props;
CString str;
// Ouverture de la base " Enfant "
if(!db.Open(DB_NOM_ENFANT)) return FALSE;
// Configuration de la propriété qui indiquera
// se que l'on recherche
str= _T("Fred");
props = CCeDBProp((LPWSTR)(LPCTSTR)str,PROP_PRENOMS);
// recherche du premier enregistrement correspondant
// au critère mis dans notre instance de propriété
if(poid = db.SeekFirstEqual(props))
// si il existe un enregistrement correspondant
{
// Effacement de l'enregistrement
db.DeleteCurrRecord(poid);
}
// Fermeture de la base
db.Close();
return TRUE;
}
|
Comment modifier un donnée d'un enregistrement ?
Pour ce faire, il faut dans un premier temps rechercher l'enregistrement
:
// déclaration de la propriété de recherche
CCeDBProp prop ((LPWSTR)(LPCTSTR)str,PROP_PRENOMS);
// Recherche de l'enregistrement
db.SeekFirstEqual(prop);
|
Ensuite si votre enregistrement existe, il faut le recupérer
:
// Récupération de votre enregistrement
CCeDBRecord rec;
db.ReadCurrRecord(&rec);
|
Puis, il faut récupérer un pointeur sur la propriété
à modifier de votre enregistrement
// Récupération d'un pointeur sur la propriété
// de la donnée à modifier
CCeDBProp* pPrenoms = rec.GetPropFromIdent(PROP_ PRENOMS);
// Vérification que votre pointeur n'est pas NULL
// avant de continuer
if(pPrenoms == NULL)
{
// Votre code en cas pointeur NULL
}
|
Une fois ces étapes effectuées, il faut modifier votre
donnée.
// utiliser la fonction correspondant au type
// de votre donnée, ici une String
pPrenoms-> SetString (_T("Bertrand"));
|
En dernier lieu, il faut rendre effective la modification
// Filtre de tri
CCeDBProp prenomsFilter(CCeDBProp::Type_ String,PROP_PRENOMS);
// Enregistrement de la modification
db.WriteCurrRecord(&rec, // Instance de l'enregistrement
1, // Nombre de Filtre
&prenoms); // Filtre
|