Como posso gerar uma classe a partir de um objeto de tabela do SQL Server?
Eu não estou falando sobre o uso de algum ORM. Eu só preciso criar as entidades (classe simples). Algo como:
public class Person
{
public string Name { get;set; }
public string Phone { get;set; }
}
Dada uma tabela 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
fonte
fonte
Respostas:
Defina @TableName como o nome da sua tabela.
fonte
end
eColumnType
no 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'
" para "when 'float' then 'double'
e deve alterar"when 'real' then 'double'
"para"when 'real' then 'float'
. "Parece que você confundiu esses tipos. O C # equivalente a um float SQL é um duplo e o C # equivalente a um real SQL é um float .print @Result
paraprint CAST(@Result AS TEXT)
caso contrário, ele será truncado em tabelas grandes.Não consegui obter a resposta de Alex para trabalhar no Sql Server 2008 R2. Então, reescrevi usando os mesmos princípios básicos. Agora ele permite esquemas e várias correções foram feitas nos mapeamentos de propriedades da coluna (incluindo o mapeamento de tipos de datas anuláveis para tipos de valores C # anuláveis). Aqui está o Sql:
Produz C # como o seguinte:
Pode ser uma idéia usar EF, Linq to Sql ou mesmo Andaimes; no entanto, há momentos em que um código como esse é útil. Sinceramente, não gosto de usar as propriedades de navegação EF, onde o código gerado fez 19.200 chamadas de banco de dados separadas para preencher uma grade de 1000 linhas. Isso poderia ter sido alcançado em uma única chamada ao banco de dados. No entanto, pode ser que seu arquiteto técnico não queira que você use EF e similares. Portanto, é necessário reverter para um código como esse ... Aliás, também pode ser uma ideia decorar cada uma das propriedades com atributos para DataAnnotations etc., mas estou mantendo esse POCO estritamente.
EDIT corrigido para TimeStamp e Guid?
fonte
Versão VB
fonte
float
deve ir aDouble
,byte[]
aByte()
Um pouco tarde, mas eu criei uma ferramenta da web para ajudar a criar objetos C # (ou outros) a partir do resultado do SQL, da Tabela SQL e do SQL SP.
sql2object.com
Isso pode realmente garantir que você tenha que digitar todas as suas propriedades e tipos.
Se os tipos não forem reconhecidos, o padrão será selecionado.
fonte
CREATE TABLE
coisas, para que eu possa cortar e colar tudo. Além disso, se você tiver uma chance, poderá adicionar um 'Trim ()' - ele falhará se houver uma linha em branco no início e as pessoas desistirão dela. Simples se você souber removê-lo - mas você perderá pessoas quando der um erro.Estou tentando dar meus 2 centavos
0) QueryFirst https://marketplace.visualstudio.com/items?itemName=bbsimonbb.QueryFirst Query-first é uma extensão do visual studio para trabalhar de forma inteligente com SQL em projetos C #. Use o modelo .sql fornecido para desenvolver suas consultas. Quando você salva o arquivo, o Query-first executa sua consulta, recupera o esquema e gera duas classes e uma interface: uma classe de wrapper com os métodos Execute (), ExecuteScalar (), ExecuteNonQuery () etc, sua interface correspondente e um POCO encapsulando uma linha de resultados.
1) Sql2Objects Cria a classe iniciando no resultado de uma consulta (mas não no 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
fonte
Sim, esses são ótimos se você estiver usando um ORM simples como o Dapper.
Se você estiver usando .Net, poderá gerar um arquivo XSD em tempo de execução com qualquer DataSet usando o método WriteXmlSchema. http://msdn.microsoft.com/en-us/library/xt7k72x8(v=vs.110).aspx
Como isso:
A partir daí, você pode usar o xsd.exe para criar uma classe serializável em XML no prompt de comando do desenvolvedor. http://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.110).aspx
como isso:
fonte
Para imprimir propriedades NULLABLE, use isso.
Ele adiciona uma pequena modificação ao script de Alex Aza para o
CASE
bloco de instruções.fonte
Tentei usar as sugestões acima e, no processo, aprimorei as soluções neste segmento.
Digamos que você use uma classe base (ObservableObject neste caso) que implementa o PropertyChanged Event, você faria algo assim. Provavelmente, um dia, escreverei uma postagem no meu blog sqljana.wordpress.com
Substitua os valores pelas três primeiras variáveis:
A classe base é baseada no artigo de Josh Smith aqui De http://joshsmithonwpf.wordpress.com/2007/08/29/a-base-class-which-implements-inotifypropertychanged/
Renomeei a classe para ser chamada ObservableObject e também aproveitei o recurso ac # 5 usando o atributo CallerMemberName
Aqui está a parte que vocês vão gostar um pouco mais. Criei um script do Powershell para gerar para todas as tabelas em um banco de dados SQL. Ele é baseado no guru do Powershell chamado cmdlet Chaoke Miller, Invoke-SQLCmd2, que pode ser baixado aqui: http://gallery.technet.microsoft.com/ScriptCenter/7985b7ef-ed89-4dfd-b02a-433cc4e30894/
Depois de ter esse cmdlet, o script do Powershell a ser gerado para todas as tabelas se torna simples (substitua as variáveis pelos seus valores específicos).
fonte
Se você tiver acesso ao SQL Server 2016, poderá usar a opção FOR JSON (com INCLUDE_NULL_VALUES) para obter a saída JSON de uma instrução select. Copie a saída e, em Visual Studio, cole special -> paste JSON como classe.
É uma solução de orçamento, mas pode economizar algum tempo.
fonte
criar PROCEDURE para criar código personalizado usando modelo
agora crie código personalizado
por exemplo, classe c #
saída é
para LINQ
saída é
para classe java
saída é
para android sugarOrm model
saída é
fonte
Para imprimir propriedades NULLABLE COM COMENTÁRIOS (Resumo), use isso.
É uma ligeira modificação da primeira resposta
fonte
A Revista Visual Studio publicou isto:
Gerando classes .NET POCO para resultados de consulta SQL
Ele tem um projeto para download que você pode criar, fornecer suas informações SQL e iniciar a classe para você.
Agora, se essa ferramenta acabou de criar os comandos SQL para SELECT, INSERT e UPDATE ....
fonte
Comercial, mas o CodeSmith Generator faz isso: http://www.codesmithtools.com/product/generator
fonte
Estou confuso quanto ao que você quer disso, mas aqui estão as opções gerais ao projetar o que você deseja projetar.
fonte
Em agradecimento à solução de Alex e Guilherme por perguntar, fiz isso para o MySQL gerar classes C #
fonte
Agarre QueryFirst , extensão do visual studio que gera classes de wrapper a partir de consultas SQL. Você não só recebe ...
E como um bônus, ele jogará ...
Tem certeza de que deseja basear suas aulas diretamente em suas tabelas? As tabelas são uma noção estática e normalizada de armazenamento de dados que pertence ao banco de dados. As aulas são dinâmicas, fluidas, descartáveis, específicas ao contexto, talvez desnormalizadas. Por que não escrever consultas reais para os dados que você deseja para uma operação e deixar o QueryFirst gerar as classes a partir disso.
fonte
Esta postagem me salvou várias vezes. Eu só quero adicionar meus dois centavos. Para aqueles que não gostam de usar ORMs e, em vez disso, escrevem suas próprias classes DAL, quando você tem 20 colunas em uma tabela e 40 tabelas diferentes com suas respectivas operações CRUD, é doloroso e uma perda de tempo. Repeti o código acima, para gerar métodos CRUD com base na entidade e nas propriedades da tabela.
Claro que não é um código à prova de balas e pode ser melhorado. Só queria contribuir para esta excelente solução
fonte
ligeiramente modificado da resposta principal:
o que torna a saída necessária para o LINQ completo na declaração C #
fonte
A maneira mais simples é EF, engenheiro reverso. http://msdn.microsoft.com/en-US/data/jj593170
fonte
Eu gosto de configurar minhas aulas com membros locais privados e acessadores / mutadores públicos. Então, eu modifiquei o script de Alex acima para fazer isso também para qualquer pessoa interessada.
fonte
Uma pequena adição às soluções anteriores:
object_id(@TableName)
funciona apenas se você estiver no esquema padrão.funciona em qualquer esquema fornecido @tableName é exclusivo.
fonte
Caso seja útil para qualquer outra pessoa, trabalhando em uma abordagem Code-First usando mapeamentos de atributos, eu queria algo que me deixou precisando vincular uma entidade no modelo de objeto. Então, graças à resposta do Carnotaurus, estendi-a conforme sua própria sugestão e fiz alguns ajustes.
Isso depende, portanto, desta solução que compreende DUAS partes, ambas funções com valor escalar do SQL:
Uso no MS SQL Management Studio:
resultará em um valor de coluna que você pode copiar e colar no Visual Studio.
Se isso ajuda alguém, então ótimo!
fonte
Empacotei idéias de várias respostas baseadas em SQL aqui, principalmente a resposta raiz de Alex Aza, no klassify , um aplicativo de console que gera todas as classes para um banco de dados especificado de uma só vez:
Por exemplo, dada uma tabela
Users
que se parece com isso:klassify
irá gerar um arquivo chamadoUsers.cs
que se parece com isso:Ele produzirá um arquivo para cada tabela. Descarte o que você não usa.
Uso
fonte
Apenas pensei em adicionar minha própria variação da resposta principal para quem estiver interessado. As principais características são:
Ele adicionará atributos System.Data.Linq.Mapping à classe e a cada propriedade. Útil para quem usa o Linq to SQL.
fonte
Você acabou de fazer, desde que sua tabela contenha duas colunas e seja chamada algo como 'tblPeople'.
Você sempre pode escrever seus próprios wrappers SQL. Na verdade, eu prefiro fazê-lo dessa maneira, odeio código gerado, de qualquer maneira.
Talvez crie uma
DAL
classe e tenha um método chamadoGetPerson(int id)
que consulta o banco de dados para essa pessoa e depois cria seuPerson
objeto a partir do conjunto de resultados.fonte