ServerExploreデータベースファイルに複数のテーブルがあります。テーブルのクラスの自動コードを生成したいので、属性、コンストラクター、およびゲッターセッターメソッドを持つすべてのクラスが自動的に生成されます。
そのための手順を教えてください。
ServerExploreデータベースファイルに複数のテーブルがあります。テーブルのクラスの自動コードを生成したいので、属性、コンストラクター、およびゲッターセッターメソッドを持つすべてのクラスが自動的に生成されます。
そのための手順を教えてください。
自動生成ではありませんが、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 可能にすることができます。ジェネレーター、パターン/スタイル/ニーズに合わせてください。
Entity Frameworkを使用する場合は、この記事の手順を確認してください。
あなたはこのようなことを試すことができます...
すべての主要な操作を行う 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 !!");
}
}
このメソッドが呼び出されると、すべての処理が行われます。
それがあなたに役立つことを願っています....
上記のクラスを変更し、不足しているすべてのメソッドを含めました
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());
}
}
}