2011-10-22 17 views
4

我的服務器瀏覽數據庫文件中有多個表。我想爲表生成類的自動代碼,因此所有具有它們的屬性,構造函數和getter setter方法的類都會自動生成。在Visual Studio中爲表生成C#類代碼

請告訴我這樣做的步驟。

+1

有幾種方法,以「生成代碼」,這取決於它是什麼代碼,你想生成。你想使用舊的DataSet技術,還是使用較新的「實體框架」? –

+0

你想使用實體框架嗎? –

回答

1

你可以嘗試這樣的事情......

創建一個名爲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

嗨,你可以把任何CreateClassBottom,CreateClassTop或CreateClassBody的代碼? – Kaushik

5

不是自動生成,但它不是很難使用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; 

其餘的就留給讀者做練習,因爲他們說主要是因爲細節是你的,而不是自動屬性,你可以使用後盾變量,把標準的邏輯在屬性中,使值類型爲空時,使自己的代碼生成器,使其適合您的模式/風格/需求。

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



} 

}

0

我認爲,產生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複製打印結果的文本

我希望對你的作品

好運

相關問題