¿Cómo puedo generar una clase desde un objeto de tabla de SQL Server?
No estoy hablando de usar algunos ORM. Solo necesito crear las entidades (clase simple). Algo como:
public class Person
{
public string Name { get;set; }
public string Phone { get;set; }
}
Dada alguna tabla como:
+----+-------+----------------+
| ID | Name | Phone |
+----+-------+----------------+
| 1 | Alice | (555) 555-5550 |
| 2 | Bob | (555) 555-5551 |
| 3 | Cathy | (555) 555-5552 |
+----+-------+----------------+
c#
sql
sql-server
tsql
Gui
fuente
fuente
Respuestas:
Establezca @TableName en el nombre de su tabla.
fuente
end
yColumnType
en el script SQL de Alex.+ 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'
" a "when 'float' then 'double'
y debería cambiar"when 'real' then 'double'
"a"when 'real' then 'float'
. "Parece que confundió esos tipos. El equivalente de C # a un flotante SQL es un doble y el equivalente de C # a un SQL real es un flotante .print @Result
paraprint CAST(@Result AS TEXT)
que de lo contrario se trunca en tablas grandes.No pude obtener la respuesta de Alex para trabajar en Sql Server 2008 R2. Entonces, lo reescribí usando los mismos principios básicos. Ahora permite esquemas y se han realizado varias correcciones para las asignaciones de propiedades de columna (incluida la asignación de tipos de fechas anulables a tipos de valores C # anulables). Aquí está el SQL:
Produce C # como el siguiente:
Puede ser una idea usar EF, Linq to Sql, o incluso Scaffolding; Sin embargo, hay momentos en que una codificación como esta es útil. Francamente, no me gusta usar las propiedades de navegación de EF donde el código que genera hizo 19.200 llamadas a la base de datos separadas para llenar una cuadrícula de 1000 filas. Esto podría haberse logrado en una sola llamada a la base de datos. No obstante, podría ser que su arquitecto técnico no quiera que use EF y similares. Por lo tanto, debe volver a un código como este ... Por cierto, también puede ser una idea decorar cada una de las propiedades con atributos para Anotaciones de datos, etc., pero mantengo esto estrictamente POCO.
EDITAR Corregido para TimeStamp y Guid?
fuente
Versión VB
fuente
float
debería ir aDouble
,byte[]
aByte()
Un poco tarde, pero he creado una herramienta web para ayudar a crear un C # (u otros) objetos a partir de resultados SQL, Tabla SQL y SQL SP.
sql2object.com
Esto realmente puede hacer que tenga que escribir todas sus propiedades y tipos.
Si no se reconocen los tipos, se seleccionará el predeterminado.
fuente
CREATE TABLE
cosas para que pueda cortar y pegar todo. Además, si tiene la oportunidad, ¿puede agregar un 'Trim ()' allí? Falla si hay una línea en blanco al principio y luego la gente se dará por vencida. Simple si sabe eliminarlo, pero perderá personas cuando cometa un error.Estoy tratando de dar mis 2 centavos
0) QueryFirst https://marketplace.visualstudio.com/items?itemName=bbsimonbb.QueryFirst Query-first es una extensión de estudio visual para trabajar de forma inteligente con SQL en proyectos de C #. Use la plantilla .sql proporcionada para desarrollar sus consultas. Cuando guarda el archivo, Query-first ejecuta su consulta, recupera el esquema y genera dos clases y una interfaz: una clase contenedora con los métodos Execute (), ExecuteScalar (), ExecuteNonQuery (), etc., su interfaz correspondiente y un POCO encapsulando Una línea de resultados.
1) Sql2Objects Crea la clase a partir del resultado de una consulta (pero no el 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
fuente
Sí, estos son geniales si estás usando un ORM simple como Dapper.
Si usa .Net, puede generar un archivo XSD en tiempo de ejecución con cualquier DataSet usando el método WriteXmlSchema. http://msdn.microsoft.com/en-us/library/xt7k72x8(v=vs.110).aspx
Me gusta esto:
Desde allí, puede usar xsd.exe para crear una clase que sea serializable en XML desde el Símbolo del sistema del desarrollador. http://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.110).aspx
Me gusta esto:
fuente
Para imprimir propiedades NULLABLE, use esto.
Agrega una ligera modificación al script de Alex Aza para el
CASE
bloque de instrucciones.fuente
Traté de usar las sugerencias anteriores y en el proceso mejoré las soluciones de este hilo.
Digamos que usa una clase base (ObservableObject en este caso) que implementa el evento PropertyChanged, haría algo como esto. Probablemente escribiré una publicación de blog algún día en mi blog sqljana.wordpress.com
Sustituya los valores de las tres primeras variables:
La clase base se basa en el artículo de Josh Smith aquí. De http://joshsmithonwpf.wordpress.com/2007/08/29/a-base-class-which-implements-inotifypropertychanged/
Cambié el nombre de la clase para que se llamara ObservableObject y también aproveché la función ac # 5 usando el atributo CallerMemberName
Aquí está la parte que les va a gustar un poco más. Creé un script de Powershell para generar todas las tablas en una base de datos SQL. Se basa en un gurú de Powershell llamado cmdlet Invoke-SQLCmd2 de Chad Miller que se puede descargar desde aquí: http://gallery.technet.microsoft.com/ScriptCenter/7985b7ef-ed89-4dfd-b02a-433cc4e30894/
Una vez que tenga ese cmdlet, el script de Powershell para generar todas las tablas se vuelve simple (sustituya las variables con sus valores específicos).
fuente
Si tiene acceso a SQL Server 2016, puede usar la opción FOR JSON (con INCLUDE_NULL_VALUES) para obtener la salida JSON de una instrucción select. Copie la salida, luego en Visual Studio, pegue especial -> pegue JSON como clase.
Una especie de solución de presupuesto, pero puede ahorrar algo de tiempo.
fuente
Crear PROCEDIMIENTO para crear código personalizado usando la plantilla
ahora crea un código personalizado
por ejemplo clase c #
la salida es
para LINQ
la salida es
para la clase java
la salida es
para el modelo android SugarOrm
la salida es
fuente
Para imprimir propiedades NULLABLE CON COMENTARIOS (Resumen), use esto.
Es una ligera modificación de la primera respuesta.
fuente
Visual Studio Magazine publicó esto:
Generación de clases .NET POCO para resultados de consultas SQL
Tiene un proyecto descargable que puede compilar, darle su información SQL y producirá la clase por usted.
Ahora, si esa herramienta acaba de crear los comandos SQL para SELECCIONAR, INSERTAR y ACTUALIZAR ...
fuente
Comercial, pero CodeSmith Generator hace eso: http://www.codesmithtools.com/product/generator
fuente
Estoy confundido en cuanto a lo que quieres de esto, pero aquí están las opciones generales al diseñar lo que quieres diseñar.
fuente
En agradecimiento a la solución de Alex y a Guilherme por preguntar, hice esto para MySQL para generar clases de C #
fuente
Grab QueryFirst , extensión de estudio visual que genera clases de contenedor a partir de consultas SQL. No solo obtienes ...
Y como beneficio adicional, arrojará ...
¿Estás seguro de que deseas basar tus clases directamente en tus tablas? Las tablas son una noción de almacenamiento de datos estática y normalizada que pertenece a la base de datos. Las clases son dinámicas, fluidas, desechables, específicas del contexto, quizás desnormalizadas. ¿Por qué no escribir consultas reales para los datos que desea para una operación y dejar que QueryFirst genere las clases a partir de eso?
fuente
Esta publicación me ha salvado varias veces. Solo quiero agregar mis dos centavos. Para aquellos a quienes no les gusta usar ORM y, en cambio, escriben sus propias clases DAL, cuando tienen como 20 columnas en una tabla y 40 tablas diferentes con sus respectivas operaciones CRUD, es doloroso y una pérdida de tiempo. Repetí el código anterior, para generar métodos CRUD basados en la entidad y las propiedades de la tabla.
Por supuesto, no es un código a prueba de balas, y se puede mejorar. Solo quería contribuir a esta excelente solución
fuente
ligeramente modificado de la respuesta superior:
lo que hace que la salida sea necesaria para LINQ completo en la declaración de C #
fuente
La forma más simple es EF, ingeniero inverso. http://msdn.microsoft.com/en-US/data/jj593170
fuente
Me gusta configurar mis clases con miembros locales privados y accesores / mutadores públicos. Así que modifiqué el script de Alex anterior para hacer eso también para cualquier persona interesada.
fuente
Una pequeña adición a las soluciones anteriores:
object_id(@TableName)
funciona solo si está en el esquema predeterminado.funciona en cualquier esquema siempre que @tableName sea único.
fuente
En caso de que sea útil para cualquier otra persona, trabajando en un enfoque de Código Primero usando mapeos de atributos, quería algo que simplemente me dejara con la necesidad de vincular una entidad en el modelo de objetos. Entonces, gracias a la respuesta de Carnotaurus, lo extendí según su propia sugerencia e hice un par de ajustes.
Por lo tanto, esto se basa en esta solución que comprende DOS partes, las cuales son funciones de valor escalar de SQL:
Uso desde MS SQL Management Studio:
dará como resultado un valor de columna que puede copiar y pegar en Visual Studio.
Si ayuda a alguien, ¡genial!
fuente
Empaqueté ideas de varias respuestas basadas en SQL aquí, principalmente la respuesta raíz de Alex Aza, en klassify , una aplicación de consola que genera todas las clases para una base de datos específica a la vez:
Por ejemplo, dada una tabla
Users
que se ve así:klassify
generará un archivo llamadoUsers.cs
que se ve así:Producirá un archivo para cada tabla. Desecha lo que no uses.
Uso
fuente
Solo pensé que agregaría mi propia variación de la respuesta principal para cualquier persona interesada. Las características principales son:
Agregará los atributos System.Data.Linq.Mapping a la clase y a cada propiedad. Útil para cualquiera que use Linq to SQL.
fuente
Acaba de hacerlo, siempre que su tabla contenga dos columnas y se llame algo así como 'tblPeople'.
Siempre puede escribir sus propios contenedores SQL. De hecho, prefiero hacerlo de esa manera, ODIO el código generado, de cualquier manera.
Quizás cree una
DAL
clase y haga que se llame un métodoGetPerson(int id)
que consulta la base de datos de esa persona y luego crea suPerson
objeto a partir del conjunto de resultados.fuente