Dbmap - autogénérer des requettes multibases

3/5 (21 avis)

Vue 7 633 fois - Téléchargée 593 fois

Description

en mettant des attributs au dessus des propriétés de vos classes, mon DbMap génere et exécute des requettes sur des bases SqlServer, MySql, ou Oracle.
des insert, delete, update, select, joins

Source / Exemple :


//exemple d'utilisation

List<User> allUsers = dbMap.ListAll<User>();
Console.WriteLine("allUsers : "+ allUsers.Count);

User predicate = new User();
predicate.Name = "d%";
List<User> dUsers = dbMap.ListCustom(predicate, iDbMap.ColumnConditions("USR_NAME"));
Console.WriteLine("allUsers : " + dUsers.Count);

User newUser = new User();
newUser.Name = "newName";
newUser.Pass = "newPass";
newUser.AvatarUrl = "myUrl";
dbMap.Insert(newUser);
dbMap.GetAutoIncremented(newUser);
Console.WriteLine("new Id : " + newUser.Id.ToString());

//test de jointures
//ceci va nous donner les users habitant dans le 92 en remplissant leur ville
//et rempliera seulement leurs voitures immatriculées en 1% de modele R5 

CodePostal cpPred = new CodePostal();
cpPred.Code = "92%";

Voiture vPred = new Voiture();
vPred.Immatriculation = "1%";

ModeleVoiture mvPred = new ModeleVoiture();
mvPred.Nom = "R5";

MapQuery<User> mqU = dbMap.CreateMapQuery<User>();
mqU.AddJoin<CodePostal>("ville", cpPred, iDbMap.PropertyConditions("Code"));
mqU.AddJoinList<Voiture>("voitures", vPred, iDbMap.PropertyConditions("Immatriculation"))
    .AddJoin<ModeleVoiture>("modele", mvPred, iDbMap.PropertyConditions("Nom"));

List<User> users = dbMap.ExecuteQuery(mqU);

Conclusion :


j'ai fait en sorte que les requettes soient addaptées à chaque base de donnée.
pour supporter une nouvelle base de données, il suffit de peu.
il y a maintenant la possibilité de générer des requettes avec des jointures qui remplissent les objects et leurs sous objects.
il y a encore des evolutions à faire, j'attend vos commentaires ;)

Codes Sources

A voir également

Ajouter un commentaire Commentaires
lakichemole Messages postés 253 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 18 mai 2009
21 mars 2008 à 10:32
Ca m'a l'air pas mal dutout je m'était dis un jour que je ferais ça!:)
Pour nos applis au boulot d'ailleur, puis finalement j'ai abandonné car je pense que pour les perfs c'est pas top faudrais tester mais je pense que ton truc est parfait pour une petite appli ou des petites requêtes car mon avis c'est moin performant qu'un PL SQL.
Mais bon encore une fois faudrai tester :).
On a eu pas mal de problèmes de perfs car on voulais trop faire de traitements coté code et pas assez coté procédures stockée.
tmcuh Messages postés 458 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 18 avril 2009
21 mars 2008 à 12:59
J'ai pas encore testé, mais Wahaaa... Le système semble tellement bien imbriqué. Très peu de code de conversion de type de db.
Un seul défaut peut être est qu'il fonctionne uniquement sur base de classe, si tu veux faire un système personnalisé par personne en gardant le "coeur" intacte, tu te dois d'avoir des classes de bases exemple pour les camions. Mais si un utilisateur dit "tiens, je rajouterais bien un champs pour connaitre les caractéristiques du pneu avant droit", il faut que le système puisse récupérer cette info et la mettre à jour. Si tu arrive à ça, alors chapeau. Déjà là, c'est un très bon code, j'ai même appris des choses, ça reste encore un peu flou, mais le code est très bon :)

Amicalement,
Tmcuh
cs_Dargos Messages postés 13 Date d'inscription mardi 18 avril 2006 Statut Membre Dernière intervention 27 mars 2008
21 mars 2008 à 17:54
pour le coté PL SQL par exemple, avec mon systeme on va pouvoir le faire en faisant dans la classe OracleDbMap les override qu'il faut.
ensuite, pour les procedures stockées, au debut j'avais prevu ca, mais je l'ai enlevé car mal géré. mais maintenant, je peux le rajouter, ce sera facile (et mieux géré qu'au début :p )
ensuite, je me suis appliqué pour les perfs : toutes les requettes (gérées avec des iDataParameters) sont stockées et réutilisées au besoin, donc le gros calcul sera fait uniquement pour la premiere des requetes identiques.
aussi pour les perfs, il peut etre lent de faire le tour des GetProperties() d'un object et de recupérer son attribut à chaque requette. pour cela, j'ai géré une dictionary qui stoque les clefs PropertyInfo/DbColumnAttribute. donc c'est aussi amélioré.
alors apres, pour le coup des tables par classe, c'est vrai que c'est pas terrible. seulement, pour l'instant, c'est suffisant. mais effectivement, on va vite avoir desoin de jointures. justement, j'y reflechis. je pense mettre un parametre optionnel à DbColumnAttribute pour specifier la table jointe, avec les conditions de jointure. mais ca ne va pas etre si simple que ca. il faut encore que j'en definisse l'architecture. a voir donc ;)
et ausi, coté code, si certaines choses paraisent floues, n'hesitez pas à me demander :) c'est peut etre aussi que le code n'est pas assez clair, et c'est donc à coriger ;)
Dargos
lakichemole Messages postés 253 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 18 mai 2009
21 mars 2008 à 18:11
Nan mais en fait quand je parlais de perf c'est genre en PL SQL tu crée un curseur tu le parcour et suivant le résultat tu fait d'autre trucs et ça c'est beaucoup plus rapide si c'est oracle qui elle fait plutot que de d'abord executer la requête coté code.
Puis en fonction de se qu'elle retourne refaire une autre requête derière.
Et si tu implémente les procédure stockées y a pas grand chose à faire à par le nom de la fonction se qu'elle retourne et les paramètre, et là tu peux pas trop réinventé la roue je pense?
cs_chris81 Messages postés 589 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 29 avril 2008 2
25 mars 2008 à 14:16
a oui vu comme ça ce serait top !!!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.