Wie kann ich eine Klasse aus einem SQL Server-Tabellenobjekt generieren?
Ich spreche nicht von ORM. Ich muss nur die Entitäten erstellen (einfache Klasse). Etwas wie:
public class Person
{
public string Name { get;set; }
public string Phone { get;set; }
}
Gegeben eine Tabelle wie:
+----+-------+----------------+
| ID | Name | Phone |
+----+-------+----------------+
| 1 | Alice | (555) 555-5550 |
| 2 | Bob | (555) 555-5551 |
| 3 | Cathy | (555) 555-5552 |
+----+-------+----------------+
c#
sql
sql-server
tsql
Gui
quelle
quelle
Antworten:
Setzen Sie @TableName auf den Namen Ihrer Tabelle.
quelle
end
undColumnType
in Alex 'SQL-Skript an.+ CASE WHEN col.is_nullable=1 AND typ.name NOT IN ('binary', 'varbinary', 'image', 'text', 'ntext', 'varchar', 'nvarchar', 'char', 'nchar') THEN '?' ELSE '' END
float' then 'float'
" in "when 'float' then 'double'
und"when 'real' then 'double'
"in" ändernwhen 'real' then 'float'
. Es scheint, dass Sie diese Typen verwirrt haben. Das C # -Äquivalent zu einem SQL-Float ist ein Double und das C # -Äquivalent zu einem SQL-Real ist ein Float .print @Result
,print CAST(@Result AS TEXT)
sonst wird es auf großen Tabellen abgeschnitten.Ich konnte Alex 'Antwort nicht dazu bringen, an SQL Server 2008 R2 zu arbeiten. Also habe ich es nach den gleichen Grundprinzipien umgeschrieben. Es ermöglicht jetzt Schemata und es wurden mehrere Korrekturen für Zuordnungen von Spalteneigenschaften vorgenommen (einschließlich der Zuordnung von nullbaren Datumstypen zu nullbaren C # -Werttypen). Hier ist das SQL:
Es erzeugt C # wie folgt:
Es kann eine Idee sein, EF, Linq to Sql oder sogar Scaffolding zu verwenden. Es gibt jedoch Zeiten, in denen eine solche Codierung nützlich ist. Ehrlich gesagt mag ich es nicht, EF-Navigationseigenschaften zu verwenden, bei denen der generierte Code 19.200 separate Datenbankaufrufe zum Auffüllen eines 1000-Zeilen-Rasters ausführte. Dies hätte in einem einzigen Datenbankaufruf erreicht werden können. Es kann jedoch auch sein, dass Ihr technischer Architekt nicht möchte, dass Sie EF und dergleichen verwenden. Sie müssen also auf Code wie diesen zurückgreifen ... Übrigens kann es auch eine Idee sein, jede der Eigenschaften mit Attributen für DataAnnotations usw. zu dekorieren, aber ich behalte dies streng POCO.
EDIT Feste für Timestamp und Guid?
quelle
VB-Version
quelle
float
sollte gehenDouble
,byte[]
umByte()
Ein bisschen spät, aber ich habe ein Web-Tool erstellt, mit dem Sie ein C # -Objekt (oder ein anderes Objekt) aus dem SQL-Ergebnis, der SQL-Tabelle und SQL SP erstellen können.
sql2object.com
Dies kann wirklich sicher sein, dass Sie alle Ihre Eigenschaften und Typen eingeben müssen.
Wenn die Typen nicht erkannt werden, wird die Standardeinstellung ausgewählt.
quelle
CREATE TABLE
damit ich alles ausschneiden und einfügen kann. Auch wenn Sie eine Chance bekommen, können Sie dort ein 'Trim ()' hinzufügen - es schlägt fehl, wenn am Anfang eine leere Zeile steht und die Leute es aufgeben. Einfach, wenn Sie wissen, dass Sie es entfernen müssen - aber Sie verlieren Menschen, wenn Sie einen Fehler machen.Ich versuche meine 2 Cent zu geben
0) QueryFirst https://marketplace.visualstudio.com/items?itemName=bbsimonbb.QueryFirst Query-first ist eine Visual Studio-Erweiterung für die intelligente Arbeit mit SQL in C # -Projekten. Verwenden Sie die bereitgestellte SQL-Vorlage, um Ihre Abfragen zu entwickeln. Wenn Sie die Datei speichern, führt Query-first Ihre Abfrage aus, ruft das Schema ab und generiert zwei Klassen und eine Schnittstelle: eine Wrapper-Klasse mit den Methoden Execute (), ExecuteScalar (), ExecuteNonQuery () usw., der entsprechenden Schnittstelle und einer POCO-Kapselung eine Reihe von Ergebnissen.
1) Sql2Objects Erstellt die Klasse ausgehend vom Ergebnis einer Abfrage (jedoch nicht der 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
quelle
Ja, diese sind großartig, wenn Sie ein einfaches ORM wie Dapper verwenden.
Wenn Sie .Net verwenden, können Sie zur Laufzeit mit jedem DataSet mithilfe der WriteXmlSchema-Methode eine XSD-Datei generieren. http://msdn.microsoft.com/en-us/library/xt7k72x8(v=vs.110).aspx
So was:
Von dort aus können Sie mit xsd.exe eine Klasse erstellen, deren XML über die Eingabeaufforderung des Entwicklers serialisierbar ist. http://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.110).aspx
so was:
quelle
Verwenden Sie diese Option, um NULLABLE-Eigenschaften auszudrucken.
Es fügt eine geringfügige Änderung an Alex Azas Skript für den
CASE
Anweisungsblock hinzu.quelle
Ich habe versucht, die obigen Vorschläge zu verwenden, und dabei die Lösungen in diesem Thread verbessert.
Angenommen, Sie verwenden eine Basisklasse (in diesem Fall ObservableObject), die das PropertyChanged-Ereignis implementiert. Sie würden so etwas tun. Ich werde wahrscheinlich eines Tages einen Blog-Beitrag in meinem Blog sqljana.wordpress.com schreiben
Bitte ersetzen Sie die ersten drei Variablen durch die Werte:
Die Basisklasse basiert auf Josh Smiths Artikel hier. Von http://joshsmithonwpf.wordpress.com/2007/08/29/a-base-class-which-implements-inotifypropertychanged/
Ich habe die Klasse in ObservableObject umbenannt und auch die Funktion ac # 5 mithilfe des CallerMemberName-Attributs genutzt
Hier ist der Teil, den ihr noch mehr mögen werdet. Ich habe ein Powershell-Skript erstellt, das für alle Tabellen in einer SQL-Datenbank generiert wird. Es basiert auf einem Powershell-Guru namens Chad Millers Cmdlet Invoke-SQLCmd2, das hier heruntergeladen werden kann: http://gallery.technet.microsoft.com/ScriptCenter/7985b7ef-ed89-4dfd-b02a-433cc4e30894/
Sobald Sie dieses Cmdlet haben, wird das für alle Tabellen zu generierende Powershell-Skript einfach (ersetzen Sie die Variablen durch Ihre spezifischen Werte).
quelle
Wenn Sie Zugriff auf SQL Server 2016 haben, können Sie die Option FOR JSON (mit INCLUDE_NULL_VALUES) verwenden, um die JSON-Ausgabe von einer select-Anweisung abzurufen. Kopieren Sie die Ausgabe und fügen Sie in Visual Studio special -> JSON als Klasse ein.
Eine Art Budgetlösung, kann aber Zeit sparen.
quelle
Erstellen Sie ein Verfahren zum Erstellen von benutzerdefiniertem Code mithilfe einer Vorlage
Erstellen Sie jetzt benutzerdefinierten Code
Zum Beispiel c # Klasse
Ausgabe ist
für LINQ
Ausgabe ist
für Java-Klasse
Ausgabe ist
für Android SugarOrm Modell
Ausgabe ist
quelle
Verwenden Sie diese Option, um NULLABLE-Eigenschaften MIT KOMMENTAR (Zusammenfassung) auszudrucken.
Es ist eine geringfügige Änderung der ersten Antwort
quelle
Das Visual Studio Magazine hat Folgendes veröffentlicht:
Generieren von .NET POCO-Klassen für SQL-Abfrageergebnisse
Es hat ein herunterladbares Projekt, das Sie erstellen können, geben Sie ihm Ihre SQL-Informationen und es wird die Klasse für Sie herausholen.
Wenn dieses Tool gerade die SQL-Befehle für SELECT, INSERT und UPDATE erstellt hat ....
quelle
Kommerziell, aber CodeSmith Generator macht das: http://www.codesmithtools.com/product/generator
quelle
Ich bin verwirrt darüber, was Sie davon wollen, aber hier sind die allgemeinen Optionen beim Entwerfen dessen, was Sie entwerfen möchten.
quelle
In Anerkennung von Alex 'Lösung und Guilherme für die Bitte habe ich dies für MySQL gemacht, um C # -Klassen zu generieren
quelle
Holen Sie sich QueryFirst , eine Visual Studio-Erweiterung, die Wrapper-Klassen aus SQL-Abfragen generiert. Sie bekommen nicht nur ...
Und als Bonus wird es einwerfen ...
Sind Sie sicher, dass Sie Ihre Klassen direkt auf Ihren Tischen aufbauen möchten? Tabellen sind ein statischer, normalisierter Datenspeicherungsbegriff, der in die Datenbank gehört. Klassen sind dynamisch, flüssig, verfügbar, kontextspezifisch, möglicherweise denormalisiert. Schreiben Sie echte Abfragen für die Daten, die Sie für eine Operation benötigen, und lassen Sie QueryFirst die Klassen daraus generieren.
quelle
Dieser Beitrag hat mich mehrmals gerettet. Ich möchte nur meine zwei Cent hinzufügen. Für diejenigen, die keine ORMs verwenden möchten und stattdessen ihre eigenen DAL-Klassen schreiben, wenn Sie 20 Spalten in einer Tabelle und 40 verschiedene Tabellen mit ihren jeweiligen CRUD-Operationen haben, ist dies schmerzhaft und Zeitverschwendung. Ich habe den obigen Code wiederholt, um CRUD-Methoden basierend auf der Tabellenentität und den Eigenschaften zu generieren.
Natürlich ist es kein kugelsicherer Code und kann verbessert werden. Ich wollte nur zu dieser hervorragenden Lösung beitragen
quelle
leicht modifiziert von oben Antwort:
Dadurch wird die Ausgabe für die vollständige LINQ in der C # -Deklaration benötigt
quelle
Der einfachste Weg ist EF, Reverse Engineer. http://msdn.microsoft.com/en-US/data/jj593170
quelle
Ich richte meine Klassen gerne mit privaten lokalen Mitgliedern und öffentlichen Accessoren / Mutatoren ein. Also habe ich Alex 'Skript oben geändert, um dies auch für alle zu tun, die interessiert sind.
quelle
Eine kleine Ergänzung zu den vorherigen Lösungen: Funktioniert
object_id(@TableName)
nur, wenn Sie sich im Standardschema befinden.funktioniert in jedem Schema, sofern @tableName eindeutig ist.
quelle
Für den Fall, dass es für andere nützlich ist, an einem Code-First-Ansatz mit Attributzuordnungen zu arbeiten, wollte ich etwas, bei dem ich nur eine Entität im Objektmodell binden musste. Dank der Antwort von Carnotaurus habe ich sie gemäß ihrem eigenen Vorschlag erweitert und einige Änderungen vorgenommen.
Dies beruht daher auf dieser Lösung, die ZWEI Teile umfasst, die beide SQL-skalarwertige Funktionen sind:
Verwendung in MS SQL Management Studio:
führt zu einem Spaltenwert, den Sie kopieren und in Visual Studio einfügen können.
Wenn es jemandem hilft, dann großartig!
quelle
Ich habe hier Ideen aus mehreren SQL-basierten Antworten, hauptsächlich der Stammantwort von Alex Aza, in klassify zusammengefasst , einer Konsolenanwendung, die alle Klassen für eine bestimmte Datenbank gleichzeitig generiert:
Beispiel: Eine Tabelle
Users
sieht folgendermaßen aus:klassify
generiert eine Datei mit dem NamenUsers.cs
:Für jede Tabelle wird eine Datei ausgegeben. Verwerfen Sie, was Sie nicht verwenden.
Verwendung
quelle
Ich dachte nur, ich würde meine eigene Variation der Top-Antwort für jeden hinzufügen, der interessiert ist. Die Hauptmerkmale sind:
Es werden der Klasse und jeder Eigenschaft System.Data.Linq.Mapping-Attribute hinzugefügt. Nützlich für alle, die Linq to SQL verwenden.
quelle
Sie haben es gerade getan, solange Ihre Tabelle zwei Spalten enthält und so etwas wie "tblPeople" heißt.
Sie können jederzeit Ihre eigenen SQL-Wrapper schreiben. Eigentlich mache ich es lieber so, ich HASSE generierten Code auf jede Art und Weise.
Erstellen Sie möglicherweise eine
DAL
Klasse und lassen Sie eine Methode aufrufenGetPerson(int id)
, die die Datenbank nach dieser Person abfragt und dann IhrPerson
Objekt aus der Ergebnismenge erstellt.quelle