Создать код класса C # для таблицы в Visual Studio - PullRequest
4 голосов
/ 23 октября 2011

У меня есть несколько таблиц в моем файле базы данных Server Explore. Я хочу сгенерировать автоматический код Классов для таблиц, чтобы автоматически генерировались все классы с их атрибутами, методами конструктора и метода установки.

Пожалуйста, скажите мне, как это сделать.

Ответы [ 5 ]

5 голосов
/ 23 октября 2011

Не генерируется автоматически, но нетрудно использовать sql и information_schema для вывода определения класса, в котором класс назван в честь таблицы, а столбцы сопоставлены со свойствами.Оттуда вы можете создавать, обновлять и удалять (мне нравится использовать слияние для ящиков / обновлений в SQL Server 2008).

Делайте их по одному, и это в основном конкатенация строк.Ниже следует начать ....

declare @class varchar(max);

; with typemapping as (
 Select 'varchar' as DATA_TYPE, 'string' ctype
 union
 Select 'int', 'int'
)
select @class = isnull(@class + char(10), '') + 'public ' +
       tm.ctype +' ' + column_name +
       ' { get; set; }'
from information_schema.columns sc
   inner join typemapping tm on sc.data_type = tm.data_type
where table _name ='yourtbl'

print @class;

Остальное оставлено в качестве упражнения для читателя, поскольку они говорят, главным образом, потому что детали зависят от вас, вместо автоматических свойств вы можете использовать переменные поддержкиустановите стандартную логику в свойствах, сделайте типы значений обнуляемыми, сделайте свой собственный генератор кода соответствующим вашим шаблонам / стилям / потребностям.

3 голосов
/ 23 октября 2011

Если вы используете Entity Framework, проверьте шаги, описанные в этой статье:

Генерация кода EF Первые классы модели из существующей базы данных

1 голос
/ 26 июля 2016

Я изменил класс выше и включил все отсутствующие методы

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;

using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Data.SqlClient;
using System.Configuration;
using System.Data.Common;

namespace CodeGenerator

{
    public partial class Form1 : Form
    {

    public Form1()
    {
        InitializeComponent();
    }

    private void btnGenerateCode_Click(object sender, EventArgs e)
    {
        string conStrJobsDB = ConfigurationSettings.AppSettings["jobsDBConStrKey"].ToString();
        CreateEntitiesFromDBTables(GetDataReader(conStrJobsDB));
    }

    private void CreateEntitiesFromDBTables(SqlDataReader dr)
    {
        if (dr != null)
        {
            string lstrOldTableName = string.Empty;
            StreamWriter swClassWriter = null;
            System.Text.StringBuilder sbFileName = null;
            System.Text.StringBuilder sbConstructorCode = null;
            System.Text.StringBuilder sbClassCode = null;
            FileInfo tableClassFile = null;

            while (dr.Read())
            {
                string lstrTableName = dr.GetString(0);
                string lstrAttributeName = dr.GetString(1);
                string lstrAttributeType = GetDotNetType(dr.GetString(2));

                //If table name is changed...
                if (lstrOldTableName != lstrTableName)
                {
                    //and stream writer is already opened so close this class generation...
                    if (swClassWriter != null)
                    {
                        CreateClassBottom(swClassWriter);
                        swClassWriter.Close();
                    }

                    sbFileName = new System.Text.StringBuilder(lstrTableName);
                    sbFileName.Append("Entity.cs");
                    tableClassFile = new FileInfo(tbPath.Text + "\\" + sbFileName.ToString());
                    swClassWriter = tableClassFile.CreateText();
                    CreateClassTop(swClassWriter, lstrTableName);

                    //sbConstructorCode = new System.Text.StringBuilder("\r\n\t/// \r\n\t" +
                    //     "/// User defined Contructor\r\n\t/// \r\n\tpublic ");
                    //sbConstructorCode = new System.Text.StringBuilder();
                    //sbConstructorCode.Append(lstrTableName);
                    //sbConstructorCode.Append("(");
                }
                else
                {
                    this.CreateClassBody(swClassWriter, lstrAttributeType, lstrAttributeName);
                    //sbConstructorCode.AppendFormat("{0} {1}, \r\n\t\t",
                    //   new object[] { lstrAttributeType, lstrAttributeName });
                    //sbConstructorCode.AppendFormat("\r\n\t\tthis._{0} = {0};",
                    //   new object[] { lstrAttributeName });
                }

                lstrOldTableName = lstrTableName;
                this.pBarMain.Increment(1);
            }

            MessageBox.Show("All classes generated.", "Done");
        }
    }

    private SqlDataReader GetDataReader(string conStrJobsDB)
    {
        SqlConnection connection = null;
        try
        {
            connection = new SqlConnection(conStrJobsDB);
            if (connection == null)
                return null;
            connection.Open();
            SqlCommand command = new System.Data.SqlClient.SqlCommand("exec spGenerateEntitiesFromTables", connection);
            SqlDataReader dr = command.ExecuteReader();
            if (dr.HasRows)
                return dr;
            else
                return null;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            return null;
        }
    }

    private string GetDotNetType(string dbColumnType)
    {
        string returnType = string.Empty;
        if (dbColumnType.Equals("nvarchar"))
            returnType = "string";
        else if (dbColumnType.Equals("varchar"))
            returnType = "string";
        else if (dbColumnType.Equals("int"))
            returnType = "int";
        else if (dbColumnType.Equals("bit"))
            returnType = "bool";
        else if (dbColumnType.Equals("bigint"))
            returnType = "long";
        else if (dbColumnType.Equals("binary"))
            returnType = "byte[]";
        else if (dbColumnType.Equals("char"))
            returnType = "string";
        else if (dbColumnType.Equals("date"))
            returnType = "DateTime";
        else if (dbColumnType.Equals("datetime"))
            returnType = "DateTime";
        else if (dbColumnType.Equals("datetime2"))
            returnType = "DateTime";
        else if (dbColumnType.Equals("datetimeoffset"))
            returnType = "DateTimeOffset";
        else if (dbColumnType.Equals("decimal"))
            returnType = "decimal";
        else if (dbColumnType.Equals("float"))
            returnType = "float";
        else if (dbColumnType.Equals("image"))
            returnType = "byte[]";
        else if (dbColumnType.Equals("money"))
            returnType = "decimal";
        else if (dbColumnType.Equals("nchar"))
            returnType = "char";
        else if (dbColumnType.Equals("ntext"))
            returnType = "string";
        else if (dbColumnType.Equals("numeric"))
            returnType = "decimal";
        else if (dbColumnType.Equals("nvarchar"))
            returnType = "string";
        else if (dbColumnType.Equals("real"))
            returnType = "double";
        else if (dbColumnType.Equals("smalldatetime"))
            returnType = "DateTime";
        else if (dbColumnType.Equals("smallint"))
            returnType = "short";
        else if (dbColumnType.Equals("smallmoney"))
            returnType = "decimal";
        else if (dbColumnType.Equals("text"))
            returnType = "string";
        else if (dbColumnType.Equals("time"))
            returnType = "TimeSpan";
        else if (dbColumnType.Equals("timestamp"))
            returnType = "DateTime";
        else if (dbColumnType.Equals("tinyint"))
            returnType = "byte";
        else if (dbColumnType.Equals("uniqueidentifier"))
            returnType = "Guid";
        else if (dbColumnType.Equals("varbinary"))
            returnType = "byte[]";

        return returnType;
    }

    private void CreateClassTop(StreamWriter sw, string lstrTableName)
    {
        System.Text.StringBuilder sb = null;
        sb = new StringBuilder("public class " + lstrTableName +"Entity\n{");
        sw.Write(sb.ToString());
    }

    private void CreateClassBody(StreamWriter sw, string lstrAttributeType, string lstrAttributeName)
    {
        System.Text.StringBuilder sb = null;
        sb = new StringBuilder("\n\rpublic " + lstrAttributeType + " " + lstrAttributeName + " { get; set; }");
        sw.Write(sb.ToString());
    }

    private void CreateClassBottom(StreamWriter sw)
    {
        System.Text.StringBuilder sb = null;
        sb = new StringBuilder("\n\n}");
        sw.Write(sb.ToString());
    }



}

}

1 голос
/ 23 октября 2011

Вы можете попробовать что-то вроде этого ...

Создайте один основной класс с именем ModelCreator.cs, который выполняет все ключевые операции. Точкой входа в это приложение является событие нажатия кнопки «Подключиться и создать». Он запустит метод CreateConnectionString (), который в основном получает входные данные от пользователя и динамически создает строку подключения

private void lbtnConnect_Click(object sender, System.EventArgs e)
{
   if (CreateConnectionString())
  CreateModelClassFiles(tcGetDataReader());
}

// <summary>
/// Get the SqlDataReader object
/// SqlDataReader
/// </summary>

public SqlDataReader tcGetDataReader()
{
SqlConnection connection = null;
try
{
  connection = GetConnection(SQL_CONN_STRING);
  if (connection == null)
  return null;
  SqlDataReader dr = SqlHelper.ExecuteReader(
         connection,
         CommandType.StoredProcedure,
         "getData");
if (dr.HasRows)
  return dr;
else
  return null;
 }
 catch(Exception ex)
 {
  MessageBox.Show(ex.Message);
  return null;
 }   
}

Получить имена таблиц, атрибуты и их типы из базы данных

 CREATE PROCEDURE getData AS 
 select table_name, column_name, data_type
  from information_schema.columns
  where table_name in
  (
   select table_name
   from Information_Schema.Tables
   where Table_Type='Base Table'
  ) order by table_name
GO

Основной метод, CreateModelClassFiles

  /// <summary>
 /// Create the Model class list iterating through the tables
/// </summary>
/// <param name="dr">Sql Data reader for the database schema</param>

    private void CreateModelClassFiles(SqlDataReader dr)
    {
     if (dr != null)
    {
    string lstrOldTableName = string.Empty;
    StreamWriter sw = null;
    System.Text.StringBuilder sb = null;
    System.Text.StringBuilder sbAttr = null;
    while(dr.Read())
    {
      string lstrTableName = dr.GetString(0);
      string lstrAttributeName = dr.GetString(1);
      string lstrAttributeType = GetSystemType(dr.GetString(2));
      if (lstrOldTableName != lstrTableName)
      {
        if (sw != null)
        {
          this.CreateClassBottom(sw, sb.ToString().TrimEnd(
                     new char[]{',', ' ', '\r', '\t', '\n'}),
                     sbAttr.ToString());
            sw.Close();
        }
        sb = new System.Text.StringBuilder(lstrTableName);
        sb.Append(".cs");
        FileInfo lobjFileInfo = new FileInfo(sb.ToString());
        sw = lobjFileInfo.CreateText();
        this.CreateClassTop(sw, lstrTableName);
        sb = new System.Text.StringBuilder("\r\n\t/// \r\n\t" + 
             "/// User defined Contructor\r\n\t/// \r\n\tpublic ");
        sbAttr = new System.Text.StringBuilder();
        sb.Append(lstrTableName);
        sb.Append("(");
      }
      else
      {
        this.CreateClassBody(sw, lstrAttributeType, lstrAttributeName);
        sb.AppendFormat("{0} {1}, \r\n\t\t", 
           new object[]{lstrAttributeType, lstrAttributeName});
        sbAttr.AppendFormat("\r\n\t\tthis._{0} = {0};", 
           new object[]{lstrAttributeName});
      }
      lstrOldTableName = lstrTableName;
      this.progressBarMain.Increment(1); 
    }
    MessageBox.Show("Done !!");
  }
}

Как только этот метод вызывается, он делает все для вас.

Я надеюсь, что это поможет вам ....

0 голосов
/ 13 июня 2017

я думаю, что самый простой способ создать класс cs из таблицы - это запрос к вашей базе данных, например, на SQL-сервере вы можете использовать этот запрос:

declare @tblName sysname = 'SetYourTableName'
declare @ResultText varchar(max) = 'public class ' + @tblName + '
{'

select @ResultText = @ResultText + '
    public ' + ColumnType + NullableSign + ' ' + ColumnName + ' { get; set; }
'
from
(
    select 
        replace(col.name, ' ', '_') ColumnName,
        column_id ColumnId,
        case typ.name 
            when 'bigint' then 'long'
            when 'binary' then 'byte[]'
            when 'bit' then 'bool'
            when 'char' then 'string'
            when 'date' then 'DateTime'
            when 'datetime' then 'DateTime'
            when 'datetime2' then 'DateTime'
            when 'datetimeoffset' then 'DateTimeOffset'
            when 'decimal' then 'decimal'
            when 'float' then 'float'
            when 'image' then 'byte[]'
            when 'int' then 'int'
            when 'money' then 'decimal'
            when 'nchar' then 'string'
            when 'ntext' then 'string'
            when 'numeric' then 'decimal'
            when 'nvarchar' then 'string'
            when 'real' then 'double'
            when 'smalldatetime' then 'DateTime'
            when 'smallint' then 'short'
            when 'smallmoney' then 'decimal'
            when 'text' then 'string'
            when 'time' then 'TimeSpan'
            when 'timestamp' then 'DateTime'
            when 'tinyint' then 'byte'
            when 'uniqueidentifier' then 'Guid'
            when 'varbinary' then 'byte[]'
            when 'varchar' then 'string'
            else 'UNKNOWN_' + typ.name
        end ColumnType,
        case 
            when col.is_nullable = 1 and typ.name in ('bigint', 'bit', 'date', 'datetime', 'datetime2', 'datetimeoffset', 'decimal', 'float', 'int', 'money', 'numeric', 'real', 'smalldatetime', 'smallint', 'smallmoney', 'time', 'tinyint', 'uniqueidentifier') 
            then '?' 
            else '' 
        end NullableSign
    from sys.columns col
        join sys.types typ on
            col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id
    where object_id = object_id(@tblName)
) t
order by ColumnId

set @ResultText = @ResultText  + '
}'

print @ResultText

, затем запустите этот запрос и скопируйте напечатанный текст результата в новый класс в Visual Studio

Я надеюсь, что работает для вас

удачи

...