Création d'une base SQLServer Compact Edition en C#

Des fois certains programmes nécessitent des bases de données qui ne contiendront pas des terras de données, qui ne doivent pas traiter 10 000 000 de tuples à la secondes et qui surtout doivent être légères et faciles d’utilisation ! SQL Server Compact Edition n’est pas un candidat évident de par sa naissance : destiné de base aux applications pour systèmes embarqués (téléphones mobiles, PDA..) un programmeur classique ne pensera pas forcément à l’utiliser dans une de ses applications …. et pourtant les avantages sont multiples !

  • La légèreté est le premier avantage :  Il suffit d’ajouter une référence à son projet C# : System.Data.SqlServerCE et une bonne partie du travail est fait.
  • Lors du déploiement de l’application pas d’installation supplémentaires (types une base mysql…)
  • Création de fichiers (*.sdf) facilement lisibles, modifiables, voir même commitables sur svn (finit les dump !)
  • j’en passe !

Évidement il ne faudrait pas non plus oublier les défauts de SqlServerCE :

  • Technologie Microsoft (ce qui n’est pas un défaut en soit mais limite la portabilité … évidement quand on code en C# ce n’est pas forcément ce que l’on recherche le plus :))
  • Performances bien inférieures à des bases “pro” type SqlServer, Mysql5 ou oracle 9
  • Limitation de taille à 4 Go
  • j’en passe aussi !

Vous l’aurez compris, son utilisation n’est pas à généraliser mais dans des cas précis (application de traitement de statistiques sur quelques millions de données, gestion de configurations par stockage en base …) l’utilisation peut valoir le détour. Comment faire alors ? Comme avec beaucoup d’outils maintenant on peut faire çà “à la souris” en utilisant Visual Studio 2008 … Ce n’est pas vraiment ce que j’aime fait, préférant comprendre ce qui se passe plutôt que faire des drag & drop (oui parce que le jour ou le bouton change de place on à pas l’air malin :)) Bref, une créons une base dont le fichier source sera ref.sdf , commençons par vérifier si on peut le créer !

Bref, une créons une base dont le fichier source sera ref.sdf , commençons par vérifier si on peut le créer !


if (System.IO.File.Exists("ref.sdf")){
System.IO.File.Delete("ref.sdf");}

Maintenant que la place est libre, créons notre base, pour cela utilisons les appels suivants:


String str = “Data Source = ref.sdf; Max Database Size = 4000;”
SqlCeEngine engine = new SqlCeEngine(str);
engine.CreateDatabase();
engine.Dispose();

Dans la création string (str) on peut rajouter d’autres paramètres, tel un password … le Database Size ne représente pas la place réservée par le fichier mais la taille maximale autorisée pour le fichier base. Évidement sur un PC classique ça peut sembler étrange mais rappelez vous que SqlServerCE est avant tout utile pour les applications mobiles ! Maintenant la base est créée mais elle est vide, il faut donc s’y connecter puis créer une table.


private SqlCeConnection myConnection = null;

//Connexion à la base de données

try {
myConnection = new SqlCeConnection(“Data Source = C:\\Documents and Settings\\Nicolas\\Mes documents\\ref.sdf;”);
myConnection.Open();
}catch (Exception e) {
Console.WriteLine(“Erreur lors de la connection a la base de donnees. Message d’erreur:”);
Console.WriteLine(e.Message);
throw (e);
}

//Création des tables si on passe ici, il n’y a pas eu de throw -> pas de test sur myConnection

SqlCeCommand cmd = myConnection.CreateCommand();

string s =

“CREATE TABLE  test (Date datetime, ”Cotation float, Rendement float, Primary Key (Date))”;
cmd.CommandText = s;

//Exécution de la requête.
try{
cmd.ExecuteNonQuery();
}catch (Exception e){
Exception f = new Exception(“Erreur lors de la creation de la table: ” + e.Message);
throw (f);
}

Vous disposez maintenant d’une base enregistrée dans le fichier ref.sdf, la base contient une table ‘test’ qui à 3 attributs : Date de type timedate et qui est la clé primaire de la table, Rendement et Cotation qui sont de type float.

Dans un prochain article des informations sur l’insertion / la récupération de données dans une base sql!