Le premier site francophone dédié au développement Pocket PC


Utilisation du moteur CEDB
 
   



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

 

 
       
   
 
   
Copyright 2001-2004 - Tous droits réservés
 
   

iPAQ est un produit de COMPAQ.
Visual Tools est un produit de Microsoft Corporation.
Toutes les autres marques et produits présents dans ces pages sont la propriété exclusive de leurs sociétés respectives.