4

ServerExploreデータベースファイルに複数のテーブルがあります。テーブルのクラスの自動コードを生成したいので、属性、コンストラクター、およびゲッターセッターメソッドを持つすべてのクラスが自動的に生成されます。

そのための手順を教えてください。

4

5 に答える 5

6

自動生成ではありませんが、sql と information_schema を使用してクラス定義を出力することは難しくありません。クラスはテーブルにちなんで名付けられ、列はプロパティにマップされます。そこから、作成、更新、および削除を生成できます (SQL Server 2008 でクレート/更新にマージを使用するのが好きです)。

一度に 1 つずつ実行します。主に文字列の連結です。以下はあなたを始めるはずです....

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;

残りは、主に詳細があなた次第であるため、読者の演習として残されています。独自のコードを作成するときに、自動プロパティの代わりにバッキング変数を使用し、プロパティに標準ロジックを配置し、値の型を null 可能にすることができます。ジェネレーター、パターン/スタイル/ニーズに合わせてください。

于 2011-10-23T00:10:06.200 に答える
3

Entity Frameworkを使用する場合は、この記事の手順を確認してください。

既存のデータベースからのEFコードファーストモデルクラスの生成

于 2011-10-22T22:29:09.413 に答える
1

あなたはこのようなことを試すことができます...

すべての主要な操作を行う ModelCreator.cs という名前のメイン クラスを 1 つ作成します。このアプリケーションへのエントリ ポイントは、[接続して作成] ボタンのクリック イベントです。基本的にユーザーからの入力を取得し、接続文字列を動的に作成する 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 !!");
  }
}

このメソッドが呼び出されると、すべての処理が行われます。

それがあなたに役立つことを願っています....

于 2011-10-22T22:36:28.190 に答える
1

上記のクラスを変更し、不足しているすべてのメソッドを含めました

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());
    }



}

}

于 2016-07-26T12:23:38.483 に答える