Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

[ CS2GEN ] - GENERATEUR DE CODE NTIERS POUR BASES DE DONNÉES (V 2.1)


Information sur la source

Catégorie :Applications Source .NET ( DotNet ) Classé sous : access, sqlserver, xml, cache Niveau : Initié Date de création : 04/07/2007 Date de mise à jour : 31/08/2007 01:42:30 Vu / téléchargé: 11 215 / 1 015

Note :
10 / 10 - par 3 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note


Description

Cliquez pour voir la capture en taille normale
Cette application ne génère du code ne pouvant être utilisable qu’à partir du Framework .NET 2.0

Cette application est un peu la version 2 d’un générateur de code que j’avais posté , je le poste en nouvelle source car de nombreuses personnes pourraient etre interessées par le précédent(qui génére du code VB.NET et C# pour le Framework .NET 1.0 et 2.0)

I - Présentation

Sont pris en charge :
- Génération couches BLL,BusinessObjects,DAL
- Caching (expirations disponibles : absolue (à une date donnée),relative(dans un certains temps),SqlDependency(le cache est vidé si une modification a lieue en base SQL Server),FilDependency(pour bases de données ACCESS ou autres fichiers xml,etc...)
- Serialization Xml (reposant sur les generics)
- librairie d’aide pour les predicats des listes generiques
- Le trie (IComparer)
- Génération des fichiers de configuration de l’application (App.config et Web.config) contenant les chaines de connexion
-       Encryption de la section connectionstrings des fichiers de configuration(App.config) possible
- Génération du script SQL (avec création des tables et procédures stockées/Views)
- Etc.



II Démarche :

1 – générer le code puis ouvrir la solution visual studio qui vient d'etre générée
2 - ajouter un projet pour la couche présentation :
- Windows Forms Application
- ASP.NET Application
- WPF Application
- …
3 – Ajouter une référence aux couches
>       BLL
> BusinessObjects
4 - Ajouter une référence aux librairies Cs2Gen.Caching.dll et Cs2Gen.Predicate.dll
5 – Ajouter le fichier de configuration dans la couche présentation
> App.config (Windows Forms ou WPF Application)
> Web.config  (ASP.NET Application)

Notes :
- la librairie Cs2Gen.Predicate.dll offre des facilités pour créer des predicats,
bien entendu vous pouvez utiliser les méthodes anonymes,les predicates(délégués) ou vos propres méthodes avec les generics

- la libraire Cs2Gen.Caching.dll est moins complète que celle d'enterprise library,toutefois
vous pouvez ici tres facilement ajouter une dépendance au cache avec SqlDependency(SQL Server)

Ce projet est disponible sur CodePlex(sources,runtime) >
http://www.codeplex.com/cs2gen

Bon les sources sont fournies xp
Profitez en car je risque de ne pas poster des sources aussi souvent
J’espère pour autant ne pas voir arriver des copies !!


il y a également un bon petit tutorial de Thomas Lebrun sur Developpez.com
http://morpheus.developpez.com/architecture/

lire une image d'une base de données ou insérer une image dans une base de données (méthodes qui sont générées et disponible dans la classe Utilities)
http://romagny13.over-blog.com/article-11277632.html


+

 

Source

  • //
  • // SAMPLES
  • //
  • BLLManager bLLManager = new BLLManager();
  • List<Contact> Contacts;
  • // Get all
  • Contacts = bLLManager.ContactBLL.GetContacts();
  • dataGridView1.DataSource = Contacts;
  • // get element(s) of relation
  • List<Contact> result = bLLManager.ContactBLL.GetContactsOfCategory(1);
  • Category category = bLLManager.ContactBLL.GetCategoryOfContact(contact);
  • // filter + sort (Business objects)
  • List<Contact> result = Contacts.FindAll(
  • PredicateBuilder<Contact>.MakePredicate(
  • PredicateExpression.StartsWith("Contactname", "A")
  • )
  • );
  • result.Sort(new Contact.ContactnameComparer(SorterMode.Ascending));
  • dataGridView1.DataSource = result;
  • // Add
  • bLLManager.ContactBLL.AddContact(new Contact(4, "Dupond", 25, 1));
  • // Update
  • Contact result = Contacts.Find(PredicateBuilder<Contact>.MakePredicate(
  • PredicateExpression.Eq("ContactID", 4)
  • )
  • );
  • result.Contactname = "Lama";
  • bLLManager.ContactBLL.UpdateContact(result);
  • // Delete
  • Contact result = Contacts.Find(PredicateBuilder<Contact>.MakePredicate(
  • PredicateExpression.Eq("ContactID", 4)
  • )
  • );
  • bLLManager.ContactBLL.RemoveContact(result);
  • //Xml Serialization
  • bLLManager.ContactBLL.SerializeContacts(@"c:\Contacts.xml", Contacts);
  • List<Contact> result = bLLManager.ContactBLL.DeserializeContacts(@"c:\Contacts.xml");
  • // caching sample : SQL Server (with SqlDependencyExpiration)
  • CacheManager cacheManager=new CacheManager();
  • if (cacheManager.Contains("myKey"))
  • {
  • Contacts =(List<Contact>) cacheManager.GetData("myKey").Value;
  • }
  • else
  • {
  • Contacts = bLLManager.ContactBLL.GetContacts();
  • cacheManager.Add("mykey", Contacts, new ICacheItemExpiration[] { new SqlDependencyExpiration(new SqlCommand("SELECT ContactID,ContactName,ContactFirstName,ContactAge From dbo.[Contact]", new SqlConnection("Data Source=.;Initial Catalog=ContactDB;Integrated Security=SSPI;"))) });
  • }
  • // caching sample : ACCESS database file (with FileDependency)
  • if (cacheManager.Contains("myKey"))
  • {
  • Contacts =(List<Contact>) cacheManager.GetData("myKey").Value;
  • }
  • else
  • {
  • Contacts = bLLManager.ContactBLL.GetContacts();
  • cacheManager.Add("mykey", Contacts, new ICacheItemExpiration[] { new FileDependency(@"C:\Contacts.mdb") });
  • }
            //
            // SAMPLES
            //
            BLLManager bLLManager = new BLLManager();
            List<Contact> Contacts;

            // Get all
            Contacts = bLLManager.ContactBLL.GetContacts();
            dataGridView1.DataSource = Contacts;

            // get element(s) of relation
            List<Contact> result = bLLManager.ContactBLL.GetContactsOfCategory(1);
            Category category = bLLManager.ContactBLL.GetCategoryOfContact(contact);

            // filter + sort (Business objects)
            List<Contact> result = Contacts.FindAll(
                PredicateBuilder<Contact>.MakePredicate(
                    PredicateExpression.StartsWith("Contactname", "A")
                    )
                );
            result.Sort(new Contact.ContactnameComparer(SorterMode.Ascending));
            dataGridView1.DataSource = result;

            // Add
            bLLManager.ContactBLL.AddContact(new Contact(4, "Dupond", 25, 1));

            // Update
            Contact result = Contacts.Find(PredicateBuilder<Contact>.MakePredicate(
                PredicateExpression.Eq("ContactID", 4)
                  )
               );
            result.Contactname = "Lama";
            bLLManager.ContactBLL.UpdateContact(result);

            // Delete
            Contact result = Contacts.Find(PredicateBuilder<Contact>.MakePredicate(
                PredicateExpression.Eq("ContactID", 4)
                  )
               );
            bLLManager.ContactBLL.RemoveContact(result);

            //Xml Serialization              
            bLLManager.ContactBLL.SerializeContacts(@"c:\Contacts.xml", Contacts);
            List<Contact> result = bLLManager.ContactBLL.DeserializeContacts(@"c:\Contacts.xml");
		

	   // caching sample : SQL Server (with SqlDependencyExpiration)
           CacheManager cacheManager=new CacheManager();
 	   if (cacheManager.Contains("myKey"))
            {
              Contacts =(List<Contact>) cacheManager.GetData("myKey").Value;
            }
            else
            {
                Contacts = bLLManager.ContactBLL.GetContacts();
                cacheManager.Add("mykey", Contacts, new ICacheItemExpiration[] { new SqlDependencyExpiration(new SqlCommand("SELECT ContactID,ContactName,ContactFirstName,ContactAge From dbo.[Contact]", new SqlConnection("Data Source=.;Initial Catalog=ContactDB;Integrated Security=SSPI;"))) }); 
            }
	    // caching sample : ACCESS database file (with FileDependency) 	    
            if (cacheManager.Contains("myKey"))
            {
                Contacts =(List<Contact>) cacheManager.GetData("myKey").Value;
            }
            else
            {
                Contacts = bLLManager.ContactBLL.GetContacts();
                cacheManager.Add("mykey", Contacts, new ICacheItemExpiration[] { new FileDependency(@"C:\Contacts.mdb") }); 
            }

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

05 juillet 2007 01:04:20 :
.
05 juillet 2007 13:01:30 :
. gestion complete des DBNULL
06 juillet 2007 02:41:02 :
. amélioration de la gestion types de données, tests , renommage dans la classe d'aide aux predicate (stringComparaison pouvait porter à confusion avec une autre enum stringComparison) ...
06 juillet 2007 12:37:50 :
.
06 juillet 2007 23:07:03 :
. ajout de classes pour les predicates (bool,Single,Decimal) + IsMatch basée sur les regex pour stringPredicate; pour ses classes je n'utilise pas les generics (System.Predicate<T>) car je trouves que ce n'est pas utile
07 juillet 2007 00:11:33 :
.
07 juillet 2007 11:09:45 :
. amélioration de la classe reposant sur DbProvider,simplification de la récupèration de la section ConnectionString(ainsi on peut aussi facilement y accèder depuis un site web avec Web.config que depuis une application windows avec App.config)
07 juillet 2007 14:33:12 :
.
08 juillet 2007 23:22:16 :
.
09 juillet 2007 01:19:57 :
.
10 juillet 2007 12:38:10 :
.
20 juillet 2007 02:32:56 :
. ajout méthodes GetElementsOf, retirer quelques bugs(et j'ai du en ajouter pas mal d'autres lol), gestion des modifications des tables et clés et repercussion sur les relations,etc.
20 juillet 2007 12:26:05 :
. utilitaire de suppression des prefix de tables(pour les classes qui vont etre générées) . mise en évidence des clés etrangères dans la treeview ...
20 juillet 2007 13:04:53 :
.
20 juillet 2007 18:40:09 :
.
22 juillet 2007 16:53:28 :
. amélioration du systme de filtrage(PredicateBuilder + PredicateExpression + BinaryPredicate + IPredicate) sur la couche business Objects
22 juillet 2007 17:06:28 :
. nouvelle capture
22 juillet 2007 17:06:57 :
.
22 juillet 2007 17:26:38 :
.
24 juillet 2007 00:21:04 :
. amélioration de la gestion des types,ajout d'une classe utilities permettant d'ecrire et lire des images dans une base de données,amélioration de la classe de gestion du cache(cache strategy)
25 juillet 2007 23:33:41 :
. on est proche de la version finale .. réécriture de la classe pour DbProviderFactory(amélioration,allégement,optimisation),simplification cache(plus simple,efficace),prise en charge de la récupération des clés auto incrémentées pour SQL Server(SCOPE_IDENTITY() dans requetes et procedures stockées),allégement ,amélioration du code couches BLL,DAL,etc.
02 août 2007 13:03:25 :
.
05 août 2007 00:05:30 :
. meilleur ciblage selon le type d'application > desktop(windows forms,wpf,etc.) ou web(pour une meilleure intercation avec les objectDataSources de ASP.NET 2.0) + reorganisation du code
05 août 2007 21:58:30 :
.
05 août 2007 22:12:26 :
.
06 août 2007 01:23:06 :
.
18 août 2007 11:21:15 :
. amélioration du cache (désormais il faut ajouter une référence à la dll Cs2Gen.Caching.dll) ... les expirations disponibles du cache sont : absolue (à une date donnée),relative(dans un certains temps),SqlDependency(le cache est vidé si une modification a lieue en base SQL Server),FilDependency(pour bases de données ACCESS ou autres fichiers xml,etc...) . encryption de la section connectionstrings des fichiers de configuration(App.config) possible . renommage des classesde la couche BLL .etc.
18 août 2007 11:32:58 :
.
19 août 2007 00:58:34 :
.
30 août 2007 13:19:56 :
. ajout de l'attribut System.ComponentModel.DataObjectMethodAttribute qui permet automatiquement de selecionner les méthodes select,add,update,delete pour les objectdatasource (ASP.NET)
31 août 2007 00:30:11 :
. Cs2Gen.Predicate.dll,...
31 août 2007 00:43:24 :
.
31 août 2007 01:42:30 :
.

Commentaires et avis

signaler à un administrateur
Commentaire de bu78 le 05/07/2007 15:01:53

Bonjour, je réalise un projet similaire depuis pas mal de temps déjà, englobant le maximum de règles organisationnelles possible.
J'ai donc été particulièrement interessé par ces sources. Avant tout, donc, Merci.

J'ai noté quelques petites corrections à faire (à moins que le point ne m'échappe, ce qui est tout à fait possible).
Les voici :

Le type "TinyInt" est vu comme un type "Image". Ce point impacte bien sur le code SQL généré mais aussi le type des parameters créés dans le DAL.

Dans le DAL, sur les méthodes Add et Update, il me semble que tu as oublié d'utiliser les propriétés de l'objet passé en paramètre. System.DbNull.value est passé pour chaque propriété (à moins que ce ne soit volontaire ...)

Exemple :
oDbCommand.Parameters.Add(DbProviderManager.CreateParameter("@Reference",DbType.String,DBNull.Value));

En lieu et place de :
oDbCommand.Parameters.Add(DbProviderManager.CreateParameter("@Reference", DbType.String, oEnumeration.Reference ));

Sinon, ce projet est interessant, rapide, efficace, le code généré est lisible, efficace ... Une bonne base.

signaler à un administrateur
Commentaire de romagny13 le 05/07/2007 20:05:08

je prends un exemple:
if (oContact.ContactAge.HasValue)
oDbCommand.Parameters.Add(DbProviderManager.CreateParameter("@ContactAge",DbType.Int32,oContact.ContactAge));
else
oDbCommand.Parameters.Add(DbProviderManager.CreateParameter("@ContactAge",DbType.Int32,DBNull.Value));

je ne passe une valeur nulle que si le nullable reçu n'a pas de valeur (HasValue)
les nullables et DBNull.value permettent de gérer les champs en base de données acceptant les valeurs nulles(AllowDBNull)

au niveau des types de données il est possible qu'il y ait en effet quelques points à revoirau niveau des images)

sinon ce n'est pas ^parfait encore et il faudrait par exemple que je vois comment améliorer la gestion de la connexion, même si je ne suis pas pour l'utilisation de singleton
+

signaler à un administrateur
Commentaire de romagny13 le 05/07/2007 20:27:31

a quoique merci tu viens de me montrer une erreur :p (DBNull)
ba je corrige
oui si vous voyez des erreurs n'hesitez pas à m'en faire art
autant que je mette l'application le plus au point possible
ou si vous avez des idées notamment au niveau de la gestion de la connexion
++

signaler à un administrateur
Commentaire de romagny13 le 06/07/2007 00:23:04

pour le tinyint c'est parce qu'on recupere le datatype system.byte(System.Byte)lors de la récupération du schema de la table, et donc c'est confondu avec une image(dont le type est System.Byte[])
bon il faudra que je pousse la gestion des types de données un peu plus

signaler à un administrateur
Commentaire de girardhenri le 12/07/2007 21:52:47

Merci pour ce code qui tourne très bien sur orcas avec net2genxx
Après conversion le code compile super :)
Henri

signaler à un administrateur
Commentaire de romagny13 le 05/08/2007 00:19:34

cette application a du succes (et ca se comprend) donc je vais travailler encore dessus et oui je prefere amelorer des appli qui interessse beaucoup de monde que d'autres comme openxml (qui si elle est egalement interessante)ne touche en fait que assez peu de monde

j'ai etudié pas mal de generateur ou de framework(NHibernate,CodeFluent,Enterprise Library,...) .. je me suis inspiré un peu de ce que je trouvais de pas mal dans chacun (CodeFluent est excellent ;)) donc Cs2Gen represente l'implementation actuelle que je trouve la meilleure pour un accès aux données (en couches NTiers)
code fluent utilise des classes et des classes collections gérant à la fois les objets métiers et l'accès aux données par l'intermediaire de methodes static, cette approche est tres interessante mais finalement je prefere encore mieux decouper l'application
j'aime que le code generé soit proche de ce que j'aurais obtenu en tapant tout et ne pas avoir x assemblys en plus à referencer qui en fait serviront assez peu en comparaison
de plus je ne suis pas tant fan de l'utilisation de la reflection et je la fuis (même si elle est quand meme utiliser ici)
pour cs2Gen je suis en train de reflechir et etudier la possibilité egalement de generer les composants de la couche GUI (pésentation) pour ASP.NET (avec des customs controls), il se peut egalement ue j'y reflechisse pour windows forms qui serait finalement plus facile (lol mais je crois que j'aime quand je peine un  peu)

il y a egalement d'autres ameliorations auquelles je pense (le cache : avoir une date,un delai d'expiration),une gestion de la securite (avec encryption dans le fichier de configuration peut etre)

donc peut etre qu'une grosse mise a jour va arriver

signaler à un administrateur
Commentaire de Bidou le 06/08/2007 08:50:57 administrateur CS

Faudrait que je prenne une fois le temps de regarder tout ce que tu as fait.
Mais les sources avec beaucoup de code, c'est chiant, faut consacrer beaucoup de temps lol :D

En tout cas, y'a l 'air d'avoir du travail là derrière...

signaler à un administrateur
Commentaire de romagny13 le 21/08/2007 00:18:31

un point particulier pour l'utilisation de SqlDependencyExpiration (cache) :
1 - vous devez impérativement indiquer le nom des colonnnes (et ne pas utiliser * de select * from nomtable)
2 - indiquer impérativement dbo devant chaque nom de table (exemple dbo.[Products]
3 - sqldependency marche pour les bases de données avec SQL Server 2005 et 2005 express sur "serveur" mais pas pour les fichiers de bases de donnnées *.mdf
4- enfin il se peut qu'il faille activer service broker avec une requete style ALTER DATABASE [DatabaseName] SET ENABLE_BROKER;      

voila ainsi vous avez trés facilement un cache fonctionnel avec expirations et dependances (les expirations peuvent se cumuler exemple une expiration d'un cacheitem à une date precise + sqldependency,dans ce cas c'est à la premiere expiration que le cacheitem est supprimé exemple soit la date expire soit la table concernée subit une modification )
+

signaler à un administrateur
Commentaire de zefiras le 23/10/2007 08:53:39 10/10

Excelent!!!! Merci!

signaler à un administrateur
Commentaire de orobin38 le 02/11/2007 13:43:55

bonjour,
existe t-il d'parès vous, une application de ce type, qui génère du code en VB.net ?

merci
cordialement,
Olivier

signaler à un administrateur
Commentaire de ecosmose le 23/01/2008 16:09:16

Salut à Toi Romagny...

Et merci encore pour le partage des sources même si d'autres les exploitent à leur compte en essayant de porter tes lauriers...rendons à César ce qui lui appartient ;-)

Pourrais tu me confirmer que tu t'appuies (entièrement ?) sur NET2CsGEn ou si tu as changé beaucoup de choses du à la migration NET 1.0 -> NET 2.0

Julien Gourdet
Ecosmose : Association ecologiste et culturelle

signaler à un administrateur
Commentaire de akhenaton le 10/06/2008 16:06:00

Bonjour à tous,
Comment faire pour remplir un comboBox avec ça?
Merci

signaler à un administrateur
Commentaire de akhenaton le 10/06/2008 23:52:19

Bonsoir Romagny,
je vous remercie pour ce truc, je dirai même que ça merite 12/10...finalement je met dixxxx.

Par contre j'ai une petite remarque :
lorsque je genere le projet à partir d'une DB sql server, dans la DAL de l'objet en question (Matable), la méthode ADDMaTable ne contient pas le champ [ID] par exemple qui est la clé de l'enregistrement ( et portant j'ai décoché Autoincremnt)

pouvez vous m'aider à resoudre ce truc....j'ai pas envie de l'ajouter manuelement car je vais perdre le temps que votre application vient de m'econommiser

Très cordialement

signaler à un administrateur
Commentaire de rgtimma le 07/01/2009 17:20:55

salut romagny13, je suis nouveau dans le dev objet et je te remercie pour ton partage qui m'a beaucoup inspiré; j'ai toutefois quelque questions:
- l'utilsation de sqldependency exigent les classes du namespace sqlclient comme sqlcommand et sqlconnexion, est il possible de les avoir avec le Gestionnaire DbProviderHelper ?
-Comment pense tu que l'on puisse gerer les transactions ?
-Comment faire du reporting avec crystal report par exemple,je sais que l'on peut passer une collection d'objet à un etat mais il ne prend pas en charge le System.Nullable

  

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Mettre en cache dans le DataSet le contenu d'un fichier xml [ par herve_labenere ] Je réalise actuellement un lecteur MP3. Je stocke au 1er lancement de l'application la liste des mp3 dans un fichier XML. J'utilise pour cela la class XML vers Access [ par sveleg ] Bonjour. Je gère un entrepôt logistique pour des produits industriels variés. J'ai de bonnes notions en Access mais aucunes pour le language XML. J'ai Relier ma base de donnée avec C# [ par drime86 ] Bonjour, Svp j ai besion des codes en C#  pour je relier ma base de donnée Access  avec C# , mon problem cé que le client va entrer son code client il Ouvrir un fichier XML dans un navigateur ou notepad [ par Fo0Zie ] Bonjour à tous,Je cherche en vain sur internet comment ouvrir un fichier XML dans un navigateur web ou notepad(peu importe). Voici mon code, tiré de m Problème sérialisation XML : champs doublés ( variables + accesseurs ?? ) [ par herakles66 ] <![CDATA[ODY{font:x-small 'Verdana';margin-right:1.5em} .c{cursor:hand} .b{color:red;font-family:'Courier New';font-weight:bold;text-decoration:none} how to pass XML file to my constructor C# [ par houdaprog ] Hi ;I would pass a XML file to a constructor c# to extract data from this file and to use this data.please help me; XML et noeud fils [ par mastereur ] Bonjours,Comment puis je connaitre si on est sur le dernier noeud? Sachand que je fait une descente récursive dans un fichier xml totalement inconnu ( base de donnée implémentée en xml [ par amouna23 ] bon soir à ts svp je cherche une base de données ecrite(implémntée)en xml ce qui à une svp veillez me l'envoyée c trés urgent merci d'avance Charger le contenu d'un DataTablme dans un noeud XML [ par mimosa803 ] Bonsoir,J'ai un petit problème et j'espère que vous puissiez m'aider : Dans mon programme je charge le contenu d'un fichier XML dans des DataTable ave problème maj base access [ par borgeomi ] borgeomibonjouuuuuuur !!!!!Bonjour, J'ai un problème de maj de base de données ACCESS je copie une table d'u


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,905 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.