我的服務器瀏覽數據庫文件中有多個表。我想爲表生成類的自動代碼,因此所有具有它們的屬性,構造函數和getter setter方法的類都會自動生成。在Visual Studio中爲表生成C#類代碼
請告訴我這樣做的步驟。
我的服務器瀏覽數據庫文件中有多個表。我想爲表生成類的自動代碼,因此所有具有它們的屬性,構造函數和getter setter方法的類都會自動生成。在Visual Studio中爲表生成C#類代碼
請告訴我這樣做的步驟。
如果您使用實體框架檢查步驟的這篇文章:
Generating EF Code First model classes from an existing database
你可以嘗試這樣的事情......
創建一個名爲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 !!");
}
}
一旦調用此方法,它會爲您執行所有操作。
我希望它會幫助你....
嗨,你可以把任何CreateClassBottom,CreateClassTop或CreateClassBody的代碼? – Kaushik
不是自動生成,但它不是很難使用SQL和INFORMATION_SCHEMA輸出類的定義,與表命名的類和列被mappped到性能。從那裏,你可以讓它產生創建,更新和刪除(我喜歡在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;
其餘的就留給讀者做練習,因爲他們說主要是因爲細節是你的,而不是自動屬性,你可以使用後盾變量,把標準的邏輯在屬性中,使值類型爲空時,使自己的代碼生成器,使其適合您的模式/風格/需求。
我已經修改了上面的類,幷包括所有失蹤方法
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());
}
}
}
我認爲,產生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複製打印結果的文本
我希望對你的作品
好運
有幾種方法,以「生成代碼」,這取決於它是什麼代碼,你想生成。你想使用舊的DataSet技術,還是使用較新的「實體框架」? –
你想使用實體框架嗎? –