Générer de la classe à partir de la table de base de données
Comment puis-je créer une classe à partir d'une table SQL Server objet?
Je ne parle pas de l'aide de certains ORM. J'ai juste besoin de créer des entités (classe simple). Quelque chose comme:
public class Person
{
public string Name { get;set; }
public string Phone { get;set; }
}
Donné quelques table:
+----+-------+----------------+
| ID | Name | Phone |
+----+-------+----------------+
| 1 | Alice | (555) 555-5550 |
| 2 | Bob | (555) 555-5551 |
| 3 | Cathy | (555) 555-5552 |
+----+-------+----------------+
- Pourquoi ne pas laisser Entité Cadre de générer les classes pour vous, mais il suffit de ne pas utiliser les classes qui ont à faire avec la base de données d'accès?
- Je ne pouvais pas d'accord avec @John Saunders plus. Je l'ai fait moi-même manuellement dans le passé, mais c'est juste trop de temps. EF juste-t-il droit la première fois dans la plupart des cas. Si non, le fait de modifier les classes générées est donc beaucoup moins de temps que de le faire tout vous-même. J'ai de meilleures choses à faire avec mon temps que d'écrire le code qu'un ORM générateur peut le faire pour moi. Je comprends une aversion pour le code généré, mais en échange dans le temps (et le coût) de l'épargne est tellement la peine, au moins pour moi.
- Je pense que EF serait en effet la meilleure solution. Une autre possibilité serait de Classes LINQ to sql. Vous venez d'ajouter à votre projet et lui donner une connexion de base de données. Ensuite il vous suffit de sélectionner les tables dont vous avez besoin et il vous permettra de certaines classes pour vous.
- Dans la pratique, l'EF n'est pas toujours la meilleure solution dans chaque cas. Pour un exemple, il pourrait y avoir plusieurs développeurs inexpérimentés qui font de la crasse, des modifications au fichier edmx qui cause des conflits de version pour le moins... Aussi, cette option peut ne pas toujours être disponible. Par exemple, le responsable technique tout simplement ne peut pas vous voulez l'utiliser pour quelque raison que ce soit.
- gist.github.com/joey-qc/6710702
Vous devez vous connecter pour publier un commentaire.
Set @TableName est le nom de votre table.
end
etColumnType
dans Alex script SQL.+ CASE WHEN col.is_nullable=1 AND typ.name NOT IN ('binary', 'varbinary', 'image', 'text', 'ntext', 'varchar', 'nvarchar', 'char', 'nchar') THEN '?' ELSE '' END
AND col.user_type_id = typ.user_type_id
car il peut y avoir plusieurs lignes avec le même system_type_id (par exemple, les deux de type sysname et nvarchar). Le débogage de cela, j'ai aussi ajouté unelse 'UNKNOWN_' + typ.name
pour le CAS de la clause, ce qui peut être pratique pour référence ultérieure (sans cela, il ajoute de la valeur NULL et ne renvoie pas de sortie). (Edit: j'ai modifié Alex réponse avec ces correctifs)float' then 'float'
" à "when 'float' then 'double'
et vous devriez changer "when 'real' then 'double'
" à "when 'real' then 'float'
." Il semble que tu as ces types confondus. Le C# équivalent à un float SQL est un double et le C# équivalent à un real SQL est un float.print @Result
àprint CAST(@Result AS TEXT)
sinon, il obtient tronquée sur de grandes tables.select cast('<root><![CDATA[' + @Result + ']]></root>' as xml)
. Ce ne sera pas tronquer le résultat que la fonction PRINT.as xml
ne fonctionne pas dans SQL Server 2000, maisprint CAST(@Result AS TEXT)
n'. Il également ne pas envelopper la réponse dans un nœud xml, et il ne souffre pas de problèmes d'encodage xml (très utile si vous souhaitez imprimer sur du xml), et ne pas interférer avec les résultats retournés. Aucun de ces éléments n', mais ceux sont les pièges que vous pourriez avoir besoin de s'inquiéter à propos dans les autres cas.DECLARE @r varchar(max); SET @r='1]]>' + CAST(REPLICATE('x',7996) as varchar(max))+ '1'; PRINT @r; PRINT CAST(@r as TEXT); select cast('<root><![CDATA[' + @r + ']]></root>' as xml);
La première impression trucates la réponse, le second fonctionne, le troisième renvoie une erreur.byte[]
. Voir le MME type de table de mappage dans le docs.microsoft.com/en-us/dotnet/framework/data/adonet/...Je ne pouvais pas Alex en réponse à des travaux sur Sql Server 2008 R2. Donc, je l'ai réécrit en utilisant les mêmes principes de base. Il permet maintenant de schémas et de plusieurs corrections ont été apportées pour la colonne des mappages de propriétés (y compris la cartographie nullable date de types nullables C# types de valeur). Voici le Sql:
Il produit C# comme suit:
Il peut être une bonne idée d'utiliser EF, Linq to Sql, ou même de l'Échafaudage; cependant, il ya des moments où un morceau de codage comme c'est pratique. Franchement, je n'aime pas utiliser EF propriétés de navigation où le code qu'il génère faite de 19 200 séparer les appels de base de données pour remplir un 1000 ligne de la grille. Cela pourrait avoir été réalisé dans une seule base de données téléphonique. Néanmoins, il pourrait être simplement que votre architecte technique ne veut pas que vous utiliser EF et la comme. Donc, vous avez à revenir à un code comme celui-ci... d'ailleurs, il peut aussi être une idée pour décorer chacune des propriétés avec des attributs pour DataAnnotations, etc., mais je vais garder cette strictement POCO.
MODIFIER
Fixe pour TimeStamp et Guid?
VB version
float
devrait aller àDouble
,byte[]
àByte()
Un peu en retard mais j'ai créé un outil en ligne pour aider à créer un C# (ou autre) des objets à partir de SQL résultat, Table SQL et SQL SP.
sql2object.com
Cela peut vraiment sûr que vous ayez à taper tous vos propriétés et types.
Si les types ne sont pas comptabilisés à la valeur par défaut est sélectionné.
CREATE TABLE
de choses donc je peux couper et coller le tout. Aussi, si vous obtenez une chance d'ajouter un " Trim()' là - il ne parvient pas si il y a une ligne vide au début et puis les gens vont renoncer à elle. Simple si vous savez à l'enlever, mais vous perdrez les gens, quand vous donnez une erreur.J'essaie de donner à mes 2 cents
0) QueryFirst
https://marketplace.visualstudio.com/items?itemName=bbsimonbb.QueryFirst
De requête-la première est une extension de visual studio pour travailler intelligemment avec SQL dans les projets C#. Utilisez le .modèle sql pour développer vos requêtes. Lorsque vous enregistrez le fichier, la Requête s'exécute en premier votre requête, récupère le schéma et génère deux classes et d'une interface: une classe wrapper avec des méthodes Execute(), ExecuteScalar(), la méthode ExecuteNonQuery (), etc, son interface correspondante, et un POCO de l'encapsulation d'une ligne de résultats.
1) Sql2Objects
Crée la classe à partir du résultat d'une requête (mais pas le DAL)
2) https://docs.microsoft.com/en-us/ef/ef6/resources/tools
3) https://visualstudiomagazine.com/articles/2012/12/11/sqlqueryresults-code-generation.aspx
4) http://www.codesmithtools.com/product/generator#features
Oui ce sont de grands si votre la simple utilisation d'un ORM comme Dapper.
Si votre aide .Net, vous pouvez générer un fichier XSD au moment de l'exécution avec un ensemble de données à l'aide de la méthode WriteXmlSchema. http://msdn.microsoft.com/en-us/library/xt7k72x8(v=vs. 110).aspx
Comme ceci:
À partir de là, vous pouvez utiliser xsd.exe pour créer une classe qui est la sérialisation XML par le Développeur Invite de Commande.
http://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs. 110).aspx
comme ceci:
À imprimer NULLABLE propriétés, l'utilisation de ce.
Il ajoute une légère modification à Alex Aza du script pour le
CASE
bloc d'instructions.J'ai essayé d'utiliser les suggestions ci-dessus et dans le processus amélioré les solutions dans ce fil.
Disons que vous utilisez une classe de base (ObservableObject dans ce cas) qui implémente l'Événement PropertyChanged, vous faites quelque chose comme cela. Je vais probablement écrire un article de blog, un jour, dans mon blog
sqljana.wordpress.com
S'il vous plaît ne remplacez les valeurs pour les trois premières variables:
La classe de base est basé sur Josh Smith article ici
De http://joshsmithonwpf.wordpress.com/2007/08/29/a-base-class-which-implements-inotifypropertychanged/
Je n'ai renommer la classe d'être appelé ObservableObject et a également bénéficié d'une c# 5 fonctionnalité à l'aide de la CallerMemberName attribut
Voici la partie que vous les gars, vous allez aimer un peu plus. J'ai construit un script Powershell pour générer de toutes les tables dans une base de données SQL. Il est basé sur une Powershell gourou nommé Tchad Miller Invoke-SQLCmd2 applet de commande qui peut être téléchargé à partir d'ici:
http://gallery.technet.microsoft.com/ScriptCenter/7985b7ef-ed89-4dfd-b02a-433cc4e30894/
Une fois que vous avez cette applet de commande, le script Powershell pour générer pour toutes les tables devient simple (faire remplacer les variables par vos propres valeurs).
Si vous avez accès à SQL Server 2016, vous pouvez utiliser le JSON (avec INCLUDE_NULL_VALUES) option pour obtenir une sortie JSON à partir d'une instruction select. Copier la sortie, puis dans Visual Studio, collage spécial -> coller JSON de la classe.
Genre de solution budgétaire, mais d'en sauver quelques temps.
créer la PROCÉDURE pour créer un code personnalisé à l'aide du modèle de
maintenant créer un code personnalisé
par exemple de classe c#
de sortie est
pour LINQ
de sortie est
pour la classe java
de sortie est
pour android sugarOrm modèle
de sortie est
Visual Studio Magazine a publié ceci:
La génération .NET Classes POCO pour les Résultats de la Requête SQL
Il est téléchargeable projet que vous pouvez construire, donnez-lui votre SQL info, et il va manivelle de la classe pour vous.
Maintenant, si c'outil créé les Commandes SQL SELECT, INSERT et UPDATE....
Commercial, mais permet d'économiser beaucoup de temps pour les développeurs qui n'utilisent pas Entity Framework.
https://codverter.com/src/sqltoclass
Cet outil en ligne génère une classe à partir de la table SQL. La classe est basée sur la
CREATE TABLE
script dansMS-SQL
,ORACLE
ouMYSQL
bases de données, à une classe en C# et d'autres langages de programmation.Commercial, mais CodeSmith Générateur n'est que: http://www.codesmithtools.com/product/generator
Je suis confus quant à ce que vous voulez, mais voici les options générales lors de la conception de ce que vous souhaitez concevoir.
À imprimer NULLABLE propriétés AVEC des COMMENTAIRES (Résumé), par l'utilisation de ce.
C'est une légère modification de la première réponse
Dans l'appréciation de Alex de la solution et Guilherme pour demander j'ai fait ceci pour MySQL pour générer des classes C#
Saisir QueryFirst, extension de visual studio qui génère des classes wrapper à partir de requêtes SQL. Vous n'obtenez pas seulement...
Et en prime, il va jeter dans...
Êtes-vous sûr que vous voulez la base de vos cours directement sur vos tables? Les Tables sont statiques, des données normalisées de stockage notion qui appartient à la DB. Les cours sont dynamiques, fluides, jetable, spécifiques au contexte, peut-être dénormalisé. Pourquoi ne pas écrire réel les requêtes pour les données que vous voulez pour une opération, et de laisser QueryFirst générer les classes à partir de cela.
légèrement modifié à partir du haut de réponse:
qui rend la sortie nécessaires pour la pleine LINQ en C# déclaration
Vous venez de le faire, aussi longtemps que votre table contient deux colonnes et est appelé quelque chose comme "tblPeople'.
Vous pouvez toujours écrire vos propres SQL wrappers. En fait je préfère le faire de cette façon, je DÉTESTE le code généré, de toute façon.
Peut-être créer un
DAL
classe, et ont une méthode appeléeGetPerson(int id)
, qui interroge la base de données pour cette personne, puis crée votrePerson
objet à partir de l'ensemble de résultats.La façon la plus simple est EF, désosser. http://msdn.microsoft.com/en-US/data/jj593170
J'aime l'installation de mes cours privés avec les membres locaux publique et des accesseurs /mutateurs.
Donc j'ai modifié Alex script ci-dessus pour le faire pour quelqu'un qui est interessé.
Un petit plus pour les solutions avant:
object_id(@TableName)
ne fonctionne que si vous êtes dans le schéma par défaut.fonctionne dans n'importe quel schéma fourni @tableName est unique.
Dans le cas où c'est utile à quelqu'un d'autre, de travailler sur un Code-Première approche à l'aide de l'attribut mappages, je voulais quelque chose qui m'a laissé avoir besoin de lier une entité dans le modèle objet. Ainsi, grâce à Carnotaurus réponse, j'ai étendu comme par leur propre suggestion et fait un couple de réglages.
Cela repose donc sur cette solution composé de DEUX parties, qui sont tous deux SQL fonctions Scalaires:
Utilisation de MS SQL Management Studio:
le résultat sera une valeur de colonne vous pouvez copier et coller dans Visual Studio.
Si ça aide quelqu'un, puis la grande!