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 !

GÉNÉRATEUR DE CODE - [ARCHITECTURE 2-TIERS - 3-TIERS - N-TIERS] [VB - CSHARP] [.NET 1.1 ET .NET 2.0] [ACCESS,SQL SERVER][GENERATION ANGLAIS -FRANCAIS]


Information sur la source

Catégorie :Base de données Source .NET ( DotNet ) Classé sous : persistance, xml, ado, metier, access Niveau : Débutant Date de création : 16/01/2007 Date de mise à jour : 01/05/2007 10:30:17 Vu / téléchargé: 21 465 / 2 579

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

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


Description

Cliquez pour voir la capture en taille normale
Bonsoir,
Voila mon début de générateur de code
L'objectif de ce générateur est simple :
générer tout le code d'accès aux données, vous n'avez plus qu'à coder la couche présentation (en fait faire simplement appel aux méthodes appropriées)
de cette manière vous pouvez définir une couche présentation en windows forms (.NET 1.x,.NET 2.0), ASP.NET,mais aussi .NET 3.0 (WPF) trés facilement



- Choix de "langue" dans laquelle est généré le code
> Français
> Anglais
-Projet Visual Studio généré:
> Projet bibliothèque de classes .NET 2.0  Visual Studio 2005
> Projet bibliothèque de classes .NET  1.x  Visual Studio 2003
- Choix de l'architecture de l'application :
> 2-tiers : couche présentation  (IHM) + couche persistance (accès aux données)
> 3-tiers : couche présentation  (IHM) + couche métier (classes et classes collections) + couche persistance (accès aux données)
> n-tiers : couche présentation  (IHM) + Controleur + couche métier (classes et classes collections) + couche persistance (accès aux données)

- Choix du Language:
>C#
>VB.NET
-Génération pour une source de données :
>Access
>Sql Server

- Génération Script SQL de création de la base de données (procédures stockées en plus pour Sql Server)

La génération se base sur la structure de la base de données (tables,champs,relations,contraintes)
- Vous pouvez définir votre base de données dans le générateur à partir de « zéro »
- Ou ouvrir une base de données (Access ou Sql Server 2000-2005) (les informations de la base seront extraites)
- Vous avez également la possibilité de sauvegarder le projet en cours .

Note :
Pour entrer facilement le script SQL de création de la base pour Access je vous conseille d’utiliser cet outil que j’avais posté, bien pratique :
http://www.csharpfr.com/codes/OUTIL-MANAGEMENT-BASES-DONNEES-POUR-ACCESS-MDB-FICHIERS_39559.aspx

++


Objectifs et idées suivantes :
- Génération couche présentation pour .net 1.1 et .net 2.0 (voir également pour Asp.net)
- Gestion complete des acces concurrentiels
- gestion acces concurrentiel optimiste
- optimisation et amélioration du code
 

Source

  • //// Ne pas oublier de renseigner la chaine de connexion à la base de données
  • BData.OleDbConnected.sConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\romagny\Mes documents\Access\Contacts.mdb";
  • // ******** 2 tiers *******************
  • //// la couche UI(interface utilisateur) interagit avec la classe couche persistance (BData) avec le code généré pour architecture 2-tiers
  • BData.OleDb.CONTACT oCONTACT;
  • oCONTACT = new BData.OleDb.CONTACT();
  • DataTable oDataTable = oCONTACT.FillDataTableCONTACTs();
  • //// Afficher
  • dataGridView1.DataSource = oDataTable;
  • // ******** 3 tiers *******************
  • // la couche UI(interface utilisateur) interagit avec la couche metier (BObject)
  • BObject.CONTACTs oCONTACTs;
  • oCONTACTs = new BObject.CONTACTs();
  • oCONTACTs.LoadCONTACTs();
  • // Afficher la liste (ici j'utilise simplement la datasource mais on peut personnaliser le datagridview par code en definissant les colonnes,lignes et cellules)
  • dataGridView1.DataSource = oCONTACTs;
  • // ******** n tiers *******************
  • // la couche UI(interface utilisateur) interagit avec le controleur
  • Ctrl.CONTACT oCONTACT;
  • oCONTACT = new Ctrl.CONTACT();
  • oCONTACT.LoadCONTACTs();
  • // Afficher
  • dataGridView1.DataSource = oCONTACT.BObjectCONTACTs;
  • // ici un contact va etre ajouter a la fois a la collection de contacts et ajoute en base de données
  • oCONTACT.AddBOjectAndBDataCONTACT(1, "Dupond", "Dominique", "", 1, 2, "1960/03/10");
  • // ici le contact n'est ajouté qu'à la collection de contacts
  • oCONTACT.AddBObjectCONTACT(1, "Dupond", "Dominique", "", 1, 2, "1960/03/10");
  • // pour mettre à jour la base il faut faiure appel à la methode UpdateAllBData()
  • // l'ensemble des lignes ayant ete ajoutes,modifiees,supprimees en local seront mises a jour
  • // en cas de probleme d'acces concurrentiel l'erreur de la ligne est stocker dans son rowstate (ex : oCONTACT.BObjectCONTACTs[0].RowError)
  • oCONTACT.UpdateAllBData();
  • //
  • // annuler les changements apportes a une ligne en local > il faut passer la "cle primaire"
  • oCONTACT.RejectChangesBObjectCONTACT(10);
  • // annuler tous les changements apportes en local
  • oCONTACT.RejectChangesBObjectCONTACTs();
     //// Ne pas oublier de renseigner la chaine de connexion à la base de données
            BData.OleDbConnected.sConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Documents and Settings\romagny\Mes documents\Access\Contacts.mdb";

            // ******** 2 tiers *******************
            //// la couche UI(interface utilisateur) interagit avec la classe couche persistance (BData) avec le code généré pour architecture 2-tiers
            BData.OleDb.CONTACT oCONTACT;
            oCONTACT = new BData.OleDb.CONTACT();
            DataTable oDataTable = oCONTACT.FillDataTableCONTACTs();

            //// Afficher 
            dataGridView1.DataSource = oDataTable;

            // ******** 3 tiers *******************
            // la couche UI(interface utilisateur) interagit avec la couche metier (BObject)
            BObject.CONTACTs oCONTACTs;
            oCONTACTs = new BObject.CONTACTs();
            oCONTACTs.LoadCONTACTs();
            // Afficher la liste (ici j'utilise simplement la datasource mais on peut personnaliser le datagridview par code en definissant les colonnes,lignes et cellules)
            dataGridView1.DataSource = oCONTACTs;

            // ******** n tiers *******************
            // la couche UI(interface utilisateur) interagit avec le controleur
            Ctrl.CONTACT oCONTACT;
            oCONTACT = new Ctrl.CONTACT();
            oCONTACT.LoadCONTACTs();
            // Afficher
            dataGridView1.DataSource = oCONTACT.BObjectCONTACTs;

            // ici un contact va etre ajouter a la fois a la collection de contacts et ajoute en base de données
            oCONTACT.AddBOjectAndBDataCONTACT(1, "Dupond", "Dominique", "", 1, 2, "1960/03/10");
            
            // ici le contact n'est ajouté qu'à la collection de contacts
            oCONTACT.AddBObjectCONTACT(1, "Dupond", "Dominique", "", 1, 2, "1960/03/10");
            // pour mettre à jour la base il faut faiure appel à la methode UpdateAllBData()
            // l'ensemble des lignes ayant ete ajoutes,modifiees,supprimees en local seront mises a jour
            // en cas de probleme d'acces concurrentiel l'erreur de la ligne est stocker dans son rowstate (ex : oCONTACT.BObjectCONTACTs[0].RowError)
            oCONTACT.UpdateAllBData();
            //
            // annuler les changements apportes a une ligne en local > il faut passer la "cle primaire"
            oCONTACT.RejectChangesBObjectCONTACT(10);
            // annuler tous les changements apportes en local
            oCONTACT.RejectChangesBObjectCONTACTs();

Conclusion

Démarche :
- Ouvrir le projet (en double cliquant dessus)
- Ajouter un projet Windows Forms à la solution par exemple
- Possibilité de réorganiser les fichiers ,projets (ex : créer un projet pour la couche métier,un autre projet pour la couche perssistance,un pour le controleur,un pour la couche présentation)
- Ajouter la ou les  références aux projets

 

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

17 janvier 2007 21:09:29 :
- gestion des relations - amelioration de la gestion des types de données(SQL et C#) - gestion DBNull - prise en charge des cles auto incrementees et des System.Guid - etc.
17 janvier 2007 22:02:21 :
.
18 janvier 2007 23:32:38 :
. prise en charge des cles sur plusieurs colonnes . début de gestion des caractères (caractères blancs et speciaux) . etc.
19 janvier 2007 22:11:34 :
. gestion des noms des tables et champs a 2 niveaux permettant la saisie espaces et caracteres speciaux . gestion des cles multiples . recuperation des cles etrangeres des base Access ...
19 janvier 2007 22:14:57 :
.
19 janvier 2007 23:31:08 :
.
20 janvier 2007 22:24:03 :
. recuperation des cles etrangeres pour les bases de données Sql Server
21 janvier 2007 12:06:31 :
. Amélioration de la procédure d'extraction des informations des bases Access(plus rapide) . procédures stockées dans le script SQL(uniquement pour la génération pour Sql Server)
21 janvier 2007 12:17:42 :
.
21 janvier 2007 16:52:27 :
.
23 janvier 2007 19:51:02 :
.génération pour .net 1.1 . génération VB.NET
23 janvier 2007 19:53:55 :
. nouvelle capture
25 janvier 2007 21:36:06 :
. revision requetes SQL pour Access . doublons methodes Trouverde et Modifierde (apparaissant avec plsueirs clés etrangeres composées) . etc.
31 janvier 2007 20:52:16 :
. Méthodes TrouverElementsDe (exemple : trouver tous les contacts du type de contact)
01 février 2007 20:44:05 :
. génération au choix architecture 2-tiers ou architecture 3-tiers
02 février 2007 00:43:53 :
.
03 février 2007 15:50:18 :
. Ajout de méthodes (renvoyant DataTable) pour "génération architecture 2-tiers" . bonne scéance de tests . etc.
03 février 2007 15:54:57 :
.
03 février 2007 20:22:00 :
. mises à jour des procédures stockées . détails . etc.
11 février 2007 12:43:23 :
. réecriture de l'application (ce qui lui permettra de lui ajouter facilement les nombreuses fonctionnalités que je désire) . Choix de la langue dans laquelle le code est généré (en français ou en anglais) . modification au niveau des classes collections générées (couche métier - Architecture 3-tiers) > j'ai mis la classe en collection générique plutot que de declarer une liste generique dans cette classe ainsi que ce soit en .net 1.x ou .net 2.0 on peut facilement affecter a une datasource par exemple en n'affectant que la classe collection (ex : dataGridView1.DataSource = oContacts;)
12 février 2007 22:15:32 :
. petite mise à jour (possibilité de lancer desormais directement le générateur lorsuqe l'on double clique sur le type de fichier *.rxml ou en sélectionnant l'application permettant ouvrir ce type de fichier) . quelques petites choses
12 février 2007 22:26:26 :
.
25 février 2007 00:56:14 :
. des changements en profondeur qui devront permettre à terme à la fois de travailler en connecte ou en deconnecte facilement,le code mis en place devra permettre egalement de gerer facilement le control datagridview (avec une personnalisation poussée) . je tacherai de mettre une aide la generation n-tiers devrait arriver car c'est avec un controleur que la methode sera la mieux "structurée"
25 février 2007 16:30:41 :
. gestion de la connexion
25 février 2007 17:10:45 :
.
25 février 2007 17:52:46 :
.
25 février 2007 17:55:20 :
.
27 février 2007 00:29:42 :
.
28 février 2007 00:27:27 :
. debut implementation couches n-tiers . attention il faudra que je fasse une bonne sceance de tests (car il se peut qu'il y ait des erreurs)
28 février 2007 00:32:06 :
.
28 février 2007 09:59:16 :
.
29 avril 2007 00:01:15 :
. correction bug pour sql server
01 mai 2007 01:44:47 :
. amélioration gestion namespaces,mise à jour de la fenêtre de connexion à une source de données,..
01 mai 2007 10:30:17 :
.

Commentaires et avis

signaler à un administrateur
Commentaire de romagny13 le 16/01/2007 18:29:32

Salut,
juste un mot pour vous dire soyez patient je suis conscient qu'il y a plusieurs choses a ajouter,ameliorer
(tester les DBNull value) mettre en place la gestion des relations, egalement mettre en placedes relations plus complexes(tables ayant plusieurs cles pour former la cle primaire ou etrangere), ameliorer la gestion des types de données , la lecture des bases de données(justement types,valeurs max et relations),enfin bref...
je suis dessus

actuellement l'application marche impeccablement pour generer des tables disposant d'une (et une seule cle primaire,auto incrementée encore mieux) et la version la ne doit pas gerer les relations entre tables mais ca vient lol ...

en fait le but avec ce genre d'appli c'est que je reflechisse bien, j'etudie bien la problematique et seulement ensuite je mette en place ce qui permettra d'y repondre efficacement, et donc pas se precipiter a coder
donc ca vient patientez lol ...

signaler à un administrateur
Commentaire de leprov le 17/01/2007 09:36:10

petit commentaire apres avoir regardé ton code tres rapidement (disons meme survolé) :
if (machintruc() == true), cest redondant....
si machintruc() renvoie un bool, tu test :
if (true == true) ou if (false == true)...et true == true est "une fonction qui renvoie true"....
voila, cest juste que ca me choque (apres si question lisibilité tu prefere, cest ton code ^^)

sinon ca a lair detre un sacré boulot, et meme si cest qu'une ébauche, félicitations pour le boulot déjà effectué

signaler à un administrateur
Commentaire de romagny13 le 17/01/2007 11:08:34

salut
oui en effet j'ai tendance a tout bien definir ainsi je prefere mettre machin==true car deja ainsi on sait instantanement le type de machin, et j'ai tendance a tout bien separer et definir(ainsi on peut plus facilement traiter chaque element au lieu de traiter un ensemble d'elements, pratique pour verifier par exemple la validite de cet ellement etc.)

sinon une version mise a jour va arriver(j'ai implementer les relations 0,1 et 1,1)

:) ++

signaler à un administrateur
Commentaire de Escob le 17/01/2007 14:25:37

Salut,

Tout simplement, Génial ! Je commence un nouveau projet avec une base de données sql server 2000 et j'ai gagné un temps fou !

Merci beaucoup

Je vais essayer d'ajouter le reverse engenering pour mysql car je vais en avoir besoin dans un futur proche !

signaler à un administrateur
Commentaire de Liptipoyon le 17/01/2007 17:10:26

Salut

Ton travail me laisse sans Voix (heureusement je sais encore écrire;o)
Je suis très impressionné par ton travail et surtout l'utilité qu'il confer déjà en l’état...

bonne continuation
Je suivrait de prés


signaler à un administrateur
Commentaire de romagny13 le 18/01/2007 13:22:21

lol Liptipoyon j'espere que tu as retrouvé la voix quand meme xp

le projet est bien plus gros que je me l'imaginais au debut surtout que j'envisage de permettre la generation egalement pour .net 1.x, enfin bref tellement de choses qu'il va falloir que je recentre bien le projet et que j'optimise ce qui a deja ete fait

merci
++

signaler à un administrateur
Commentaire de Liptipoyon le 18/01/2007 16:24:32

Oui
Merci
pas de problème je chante de nouveau comme un rossignol. :°

Juste un petit bug... et oui ça arrive mais comme tu l'avais fait remarqué ce n'était pas encore bien géré...

La fonction supprimer sur des table à clés multiple est générée comme suit :SupprimerTS_PARAM(String TYPPARAMString VALUE)
=>il manque simplement une petite virgule..

De même si les nom de champs contient des espaces... mais là je reconnais que cela peux être contourné par un peux de systématisme dans la structure DB.

J'espère que cela t’aidera mais franchement c'est vrai que tu t’attaques à  quelque chose de très vaste.

Encore une fois félicitation pour ton courage...
;]

signaler à un administrateur
Commentaire de romagny13 le 18/01/2007 18:20:18

oui tout a fait je l'ai aussi remarqué, c'est en faite parce que je n'ai pas encore reflechi pour mettre en place la gestion de tables ayant des cles primaires sur plusieurs colonnes mais je vais pas tarder a y reflechir, j'ai aussi remarquer avec une base access que cela pose des pb si il y a des caracteres speciaux tels "° " (les fameux N°) ou "/" (ex:code/postal) donc j'ai commence a mettre en place une fonction pour gerer cela

merci ++
ouai si tu vois des bugs et que tu passes par la tu peux m'en faire part +

signaler à un administrateur
Commentaire de Liptipoyon le 19/01/2007 14:21:10

Nickel les modifs

Bon on continue ?

La gestion des clés étrangères c'est très bien sauf en cas de clé étrangère multiple...
Car si on défini deux fois une clé étrangère vers la table mère, certaine procédure ce crée plusieurs fois...

Ex. table mère la clé est ID, ARCHIVE_ID... Pour gérer des version archivé d'un même dossier...
La clé étrangère des tables filles est bien sur basée sur ces deux clés...

Mais dans ton outil on ne peut pas définir une multiple clé étrangère ...

Je sais c'est pas piqué des vers comme modif... ; °

Sinon je te le répète c'est franchement super comme idée et comme résultat A+++

signaler à un administrateur
Commentaire de romagny13 le 19/01/2007 22:01:18

oui tout a fait lol
ba a yé j'ai arrangé tout ca (enfin il faut que je teste teste teste et reteste car on sait jamais)
j'ai egalement mis en place une gestion a 2 niveaux des noms des tables et des champs ainsi on peut parfaitement avoir des tables et des champs ayant des espaces ou caracteres speciaux (ex : N° Produit)

l'application permet egalement maintenant d'extraire les relations (cles etrangeres) pour les bases Access (pas encore fait pour Sql Server)

et on peut avoir des cles sur plusieurs champs desormais (mais il faut quand meme comme je l'ai dit que je teste encore) et les procedures ne devraient plus etre en double

voila plus plusieurs petites autres choses ca devient pas mal

++ :)

signaler à un administrateur
Commentaire de Liptipoyon le 22/01/2007 11:57:20

Salut, me re-voilà
j'apprécie ta ténacité et ton sérieux ;)

J'ai vu pour l'extraction des clés c'est bien mieux,
j'ai vu aussi pour les noms de champs avec des caract. spéciaux. cool


Mais pour moi subsiste le problème des procédures en double avec des clés étrangères multiple...

public void ModifierPATIENTDeVACCIN(Int32 ID_VACC,Int32 ARCH_ID)
{int  nIndex = this.TrouverIndexVACCINRecherchee(ID_VACC);
this.ListVACCINs[nIndex].ARCH_ID = ARCH_ID;
}

public void ModifierPATIENTDeVACCIN(Int32 ID_VACC,Int32 ID_PATIENT)
{int  nIndex = this.TrouverIndexVACCINRecherchee(ID_VACC);
this.ListVACCINs[nIndex].ID_PATIENT = ID_PATIENT;
}

enfin c'est pas essentiel y'a facilement moyen de corriger à la main

Grand merci pour to travail

Je l'ai déjà adopté.

A+ ;)




signaler à un administrateur
Commentaire de Malkuth le 22/01/2007 13:21:16

Super !!!

signaler à un administrateur
Commentaire de Liptipoyon le 22/01/2007 13:30:36

Salut romagny13

Sans te commander ce serait cool aussi de mettre à dispo les sources de Net2CsGen.Metier.

ça me plairais bien d'élargir to travail vers oracle..;) avec retour de source (off course)

Merci

Liptipoyon

signaler à un administrateur
Commentaire de romagny13 le 23/01/2007 02:15:10

éé une mise a jour arrive
je viens d'implementer la generation pour .net 1.1
et je mets egalement en place la generation Vb
donc surement demain soir ...

sinon ca m'etonne ce que tu dis Liptipoyon parce que j'ai un peu tester et j'ai plus de doublons
maintenant il faudrait voir les relations de tes tables si tu pouvais un peu m'expliquer lol que je puisse cibler exactement lorsque ca fait un doublon,enfin je vois apparemment tu dois avoir deux cles ... je vais essayer de trouver


++

signaler à un administrateur
Commentaire de Liptipoyon le 23/01/2007 09:22:50

Bien, bien,

J’attends donc,

Pour t'expliquer mes clés étrangères, je pense qu'il y a une petite confusion entre deux clés et une clé double ... dans mon cas il s'agit bien d'une clé double.

Ex: dans la table mère dossiers avec deux dossiers  (1,2) avec chaque fois 2 versions du dossier (0 actuelle & 1 première archive) soit 4 records.
La clé est définie comme suit (PK).:(ID = identifiant du dossier + VERS = Numéro de Version) ou seul la combinaison des deux clé est unique !!

La table des autorisations d'accès sur les dossiers est donc liée par une double clé étrangère à la table des dossiers.
Cette table est une table de clés.
PK = la clé unique de la table des autorisations.
FK_ID  & FK_VERS  = la clé étrangère vers la table des dossiers
FK_PERS = une clé étrangère vers les personnes (ici id de 45 à 47 => les trois même personnes ont accès aux deux dossiers et à leurs deux versions)

Soit
DOSSIER     => 1, n       => AUTORISATION
ID   VERS   =>            PK   FK_ID  FK_VERS  FK_PERS
1     0                   1     1       0       45
----------------------->   2     1       0       46
----------------------->   3     1       0       47
1     1                   4