@ -12,8 +12,11 @@ using System.Text;
using System.Threading.Tasks ;
using System.Windows.Forms ;
using static System . Windows . Forms . VisualStyles . VisualStyleElement ;
using GenerateClass.Util ;
using System.Xml.Linq ;
using JinianNet.JNTemplate ;
namespace WindowsFormsApp1
namespace GenerateClass
{
public partial class Form1 : Form
{
@ -21,47 +24,83 @@ namespace WindowsFormsApp1
{
InitializeComponent ( ) ;
}
string folderName = "GenFolder" ; // 文件夹名称
private void Form1_Load ( object sender , EventArgs e )
{
this . txt_tablename . Items . AddRange ( GetTableName ( ) . ToArray ( ) ) ;
this . txt_tablename . Items . AddRange ( DbUtil . GetTableName ( ) . ToArray ( ) ) ;
this . txt_tablename . TextUpdate + = ( childSender , childE ) = > {
string str = this . txt_tablename . Text ; //获取输入内容
List < string > sList = DbUtil . GetTableName ( str ) ; //存放数据库查询结果
//提前下拉,以显示搜索结果(必须要在添加项之前下拉,否则会将第一项自动添加到编辑框内 覆盖掉输入的内容)
this . txt_tablename . DroppedDown = true ; //显示下拉列表,但是显示后鼠标指针就不见了
Cursor . Current = Cursors . Default ; //将指针显示出来
//在表中已录入名字中寻找包含输入内容的项 有则添加到comboBox项中
this . txt_tablename . Items . Clear ( ) ;
this . txt_tablename . Items . AddRange ( sList . ToArray ( ) ) ;
this . txt_tablename . Select ( this . txt_tablename . Text . Length , 0 ) ;
} ;
Engine . Configure ( ( options ) = > {
options . OutMode = OutMode . Auto ;
} ) ;
}
/// <summary>
/// 将数据库字段转换为驼峰命名
/// </summary>
/// <param name="dbField"></param>
/// <returns></returns>
public static string ToCamelCase ( string dbField )
{
string [ ] words = dbField . Split ( '_' ) ;
for ( int i = 1 ; i < words . Length ; i + + )
private void button1_Click ( object sender , EventArgs e )
{
words [ i ] = char . ToUpper ( words [ i ] [ 0 ] ) + words [ i ] . Substring ( 1 ) ;
}
return string . Join ( "" , words ) ;
fillTemplate ( ) ;
}
// 根据数据库表名生成实体类名称
static string GenerateClassName ( string tableName )
private void fillTemplate ( )
{
string [ ] words = tableName . Split ( '_' ) ;
StringBuilder sb = new StringBuilder ( ) ;
foreach ( string word in words )
string tbname = txt_tablename . Text . Trim ( ) ; //要生成的表名
string namespaceName = namespace_name . Text . Trim ( ) ; //名称空间名称
DataTable dt = null ;
if ( textBox3 . Text . Trim ( ) = = "" )
{
sb. Append ( CultureInfo . CurrentCulture . TextInfo . ToTitleCase ( word . ToLower ( ) ) ) ;
dt = DbUtil . GetDbTableInfo ( tbname ) ;
}
return sb . ToString ( ) ;
else
{
dt = DbHelperMySQL . Query ( textBox3 . Text . Trim ( ) ) ;
}
List < Dictionary < string , string > > filedInfos = new List < Dictionary < string , string > > ( ) ;
for ( int i = 0 ; i < dt . Rows . Count ; i + + )
{
var dict = new Dictionary < string , string > ( ) ;
var Name = dt . Rows [ i ] [ "Name" ] . ToString ( ) ;
var COMMENT = dt . Rows [ i ] [ "COMMENT" ] . ToString ( ) ;
var KeyType = dt . Rows [ i ] [ "KeyType" ] . ToString ( ) ;
var Nullable = dt . Rows [ i ] [ "Nullable" ] . ToString ( ) ;
Type type = DbUtil . DbTypeStr_To_CsharpType ( dt . Rows [ i ] [ "Type" ] . ToString ( ) ) ;
dict [ "sql_field_name" ] = Name ;
dict [ "field_name" ] = DbUtil . ToCamelCase ( Name ) ;
dict [ "type_name" ] = type . Name ;
dict [ "comment" ] = COMMENT ;
dict [ "is_primary_key" ] = ( String . IsNullOrEmpty ( KeyType ) ? "false" : "true" ) ;
dict [ "is_nullable" ] = ( String . IsNullOrEmpty ( KeyType ) & & ! ( "NULL" . Equals ( Nullable ) ) ? "true" : "false" ) ;
filedInfos . Add ( dict ) ;
}
using ( StreamReader reader = new StreamReader ( @".\Template\ModelFile.template" ) )
{
string fileContent = reader . ReadToEnd ( ) ;
var template = Engine . CreateTemplate ( fileContent ) ;
template . Set ( "namespace_name" , namespaceName ) ;
template . Set ( "table_comment" , DbUtil . GetTableComment ( tbname ) ) ;
template . Set ( "sql_table_name" , DbUtil . GenerateClassName ( tbname ) ) ;
template . Set ( "table_name" , tbname ) ;
template . Set ( "filedInfos" , filedInfos ) ;
template . SetStaticType ( "string" , typeof ( string ) ) ;
var result = template . Render ( ) ;
this . txt_ret . Text = result ;
DbUtil . openFile ( tbname , result ) ;
}
}
private void button1_Click ( object sender , EventArgs e )
{
private void fillStr ( ) {
//string constr = txt_constr.Text.Trim();//数据库链接字符串
txt_ret . Text = "" ;
string tbname = txt_tablename . Text . Trim ( ) ; //要生成的表名
if ( tbname . Equals ( "请选择" ) | | tbname . Equals ( "" ) ) {
if ( tbname . Equals ( "请选择" ) | | tbname . Equals ( "" ) )
{
MessageBox . Show ( "请选择表" ) ;
return ;
} ;
@ -69,50 +108,44 @@ namespace WindowsFormsApp1
DataTable dt = null ;
if ( textBox3 . Text . Trim ( ) = = "" )
{
dt = GetDbTableInfo( tbname ) ;
dt = DbUtil. GetDbTableInfo( tbname ) ;
}
else
{
dt = DbHelperMySQL . Query ( textBox3 . Text . Trim ( ) ) ;
}
var list = new List < string > ( ) ;
txt_ret. Text + = "using System;\n" +
var infoStr = "" ;
infoStr + = "using System;\n" +
"using NCA_MES_Models.CommonUtils.DB.DBAttribute;\n\n" ;
txt_ret. Text + = $"namespace {namespaceName} {{\n\n";
txt_ ret. Text + = " /// <summary>" + "\n" +
$" /// {GetTableComment(tbname)}\n" +
" /// </summary>" + "\n" +
$" [TableName(\"{ tbname } \ ")]\n" +
$" public class {GenerateClassName(tbname)}: DBBaseModel<{GenerateClassName(tbname)}>{{";
infoStr + = $"namespace {namespaceName} \n {{\n\n";
infoS tr + = " \t /// <summary>" + "\n" +
$" \t /// {DbUtil. GetTableComment(tbname)}\n" +
" \t /// </summary>" + "\n" +
$" \t [TableName(\"{ tbname } \ ")]\n" +
$" \t public class {DbUtil. GenerateClassName(tbname)}: DBBaseModel<{DbUtil. GenerateClassName(tbname)}>\n\t {{";
for ( int i = 0 ; i < dt . Rows . Count ; i + + )
{
var Name = dt . Rows [ i ] [ "Name" ] . ToString ( ) ;
var Type = dt . Rows [ i ] [ "Type" ] . ToString ( ) ;
var IsNullable = dt . Rows [ i ] [ "COMMENT" ] . ToString ( ) ;
var KeyType = dt . Rows [ i ] [ "KeyType" ] . ToString ( ) ;
Type type = DbTypeStr_To_CsharpType ( Type ) ;
txt_ret . Text + = "\n\n\t" + "/// <summary>" +
"\n\t" + $"///{IsNullable}" +
"\n\t" + "/// </summary>" +
var Nullable = dt . Rows [ i ] [ "Nullable" ] . ToString ( ) ;
Type type = DbUtil . DbTypeStr_To_CsharpType ( Type ) ;
infoStr + = "\t\n\n\t" + "/// <summary>" +
"\t\n\t" + $"///{IsNullable}" +
"\t\n\t" + "/// </summary>" +
( String . IsNullOrEmpty ( KeyType ) ? "" : "\n\t[TableId]" ) +
"\n\t" + $"[TableField(\" { Name } \ ",\"{IsNullable}\")]" +
"\n\t" + $"public {type.Name} {ToCamelCase(Name)} {{ get; set; }}" ;
( String . IsNullOrEmpty ( KeyType ) & & ! ( "NULL" . Equals ( Nullable ) ) ? "\n\t[NotEmpty]" : "" ) +
"\t\n\t" + $"[TableField(\" { Name } \ ",\"{IsNullable}\")]" +
"\t\n\t" + $"public {type.Name} {DbUtil.ToCamelCase(Name)} {{ get; set; }}" ;
//加注释记得引用using
}
txt_ret . Text + = "\n}\n}" ;
// 创建文件夹
string folderPath = Path . Combine ( Environment . CurrentDirectory , folderName ) ;
Directory . CreateDirectory ( folderPath ) ;
// 创建文件并写入内容
string filePath = Path . Combine ( folderPath , GenerateClassName ( tbname ) + ".cs" ) ;
File . WriteAllText ( filePath , txt_ret . Text ) ;
// 打开文件夹
System . Diagnostics . Process . Start ( folderPath ) ;
infoStr + = "\n\t}" ;
infoStr + = "\n}" ;
this . txt_ret . Text = infoStr ;
DbUtil . openFile ( tbname , infoStr ) ;
}
private void button2_Click ( object sender , EventArgs e )
{
string tbname = txt_tablename . Text . Trim ( ) ; //要生成的表名
@ -124,7 +157,7 @@ namespace WindowsFormsApp1
DataTable dt = null ;
if ( textBox3 . Text . Trim ( ) = = "" )
{
dt = GetDbTableInfo( tbname ) ;
dt = DbUtil. GetDbTableInfo( tbname ) ;
}
else
{
@ -163,12 +196,11 @@ namespace WindowsFormsApp1
DataTable dt = null ;
if ( textBox3 . Text . Trim ( ) = = "" )
{
dt = GetDbTableInfo( tbname ) ;
dt = DbUtil. GetDbTableInfo( tbname ) ;
}
else {
dt = DbHelperMySQL . Query ( textBox3 . Text . Trim ( ) ) ;
}
string uidatagridview = textBox2 . Text . Trim ( ) ;
textBox1 . Text = $"this.{uidatagridview}.AutoGenerateColumns = false;" ;
textBox1 . Text + = $" string sql = $\" SELECT column_name , column_comment from information_schema . COLUMNS where table_name = ' { tbname } ' ORDER BY ORDINAL_POSITION ; \ ";\r\n" +
@ -205,8 +237,8 @@ namespace WindowsFormsApp1
textBox1 . Text + = $" {uidatagridview}.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader;\n" ;
textBox1 . Text + = $"DataTable data = DbHelperMySQL.Query(\" select * from { tbname } \ ");\n" ;
textBox1 . Text + = $"this.{uidatagridview}.DataSource = data;\n" ;
}
private void button4_Click ( object sender , EventArgs e )
{
string tbname = txt_tablename . Text . Trim ( ) ; //要生成的表名
@ -215,30 +247,26 @@ namespace WindowsFormsApp1
MessageBox . Show ( "请选择表" ) ;
return ;
} ;
DataTable dt = null ;
if ( textBox3 . Text . Trim ( ) = = "" )
{
dt = GetDbTableInfo ( tbname ) ;
}
else {
dt = DbHelperMySQL . Query ( textBox3 . Text . Trim ( ) ) ;
}
if ( textBox3 . Text . Trim ( ) = = "" ) dt = DbUtil . GetDbTableInfo ( tbname ) ;
else dt = DbHelperMySQL . Query ( textBox3 . Text . Trim ( ) ) ;
string uidatagridview = textBox2 . Text . Trim ( ) ;
textBox1 . Text = $"this.{uidatagridview}.AutoGenerateColumns = false;" ;
textBox1 . Text + = "List<DataGridViewColumn> cols = new List<DataGridViewColumn>();\n\n" ;
var list = new List < string > ( ) ;
for ( int i = 0 ; i < dt . Rows . Count ; i + + )
{
var Name = dt . Rows [ i ] [ "Name" ] . ToString ( ) ;
var IsNullable = dt . Rows [ i ] [ "COMMENT" ] . ToString ( ) ;
Type type = DbUtil . DbTypeStr_To_CsharpType ( dt . Rows [ i ] [ "Type" ] . ToString ( ) ) ;
if ( type . Name = = "DateTime" ) list . Add ( Name ) ;
textBox1 . Text + = $"DataGridViewTextBoxColumn {Name}Cloumn = new DataGridViewTextBoxColumn();\n" ;
textBox1 . Text + = $"{Name}Cloumn.Name = \" { Name } \ ";" +
$"{Name}Cloumn.HeaderText =\" { IsNullable } \ ";" +
$"{Name}Cloumn.DataPropertyName = \" { Name } \ ";" +
$"cols.Add({Name}Cloumn);\n\n" ;
}
textBox1 . Text + = "DataGridViewButtonColumn editBtn = new DataGridViewButtonColumn();\r\n" +
/ * textBox1 . Text + = "DataGridViewButtonColumn editBtn = new DataGridViewButtonColumn();\r\n" +
"editBtn.HeaderText = \"编辑\";\r\n" +
"editBtn.Name = \"editBtn\";\r\n" +
"editBtn.Text = \"编辑\";\r\n" +
@ -258,165 +286,37 @@ namespace WindowsFormsApp1
"}\r\n" +
$"this.{uidatagridview}.Columns.AddRange(cols.ToArray());\r\n\r\n" +
$"if (this.{uidatagridview}.Columns.Count > 0)\r\n" +
$"this.{uidatagridview}.FirstDisplayedScrollingColumnIndex = this.{uidatagridview}.Columns.Count - 2;\n" ;
$"this.{uidatagridview}.FirstDisplayedScrollingColumnIndex = this.{uidatagridview}.Columns.Count - 2;\n" ; * /
textBox1 . Text + = $" {uidatagridview}.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader;\n" ;
textBox1 . Text + = $"DataTable data = DbHelperMySQL.Query(\" select * from { tbname } \ ");\n" ;
textBox1 . Text + = $"this.{uidatagridview}.DataSource = data;\n" ;
/ * textBox1 . Text + = $"this.{uidatagridview}.Rows.AddRange(data.AsEnumerable().Select(row => {{\r\n" +
"DataGridViewRow dataGridViewRow = new DataGridViewRow();\r\n " +
"DataGridViewButtonCell addCell = new DataGridViewButtonCell();\r\n" +
"addCell.Value = \"新增\";\r\n " +
"dataGridViewRow.Cells.Add(addCell);\r\n " +
"DataGridViewButtonCell editCell = new DataGridViewButtonCell();\r\n" +
"editCell.Value = \"修改\";\r\n " +
"dataGridViewRow.Cells.Add(editCell);\r\n " +
"foreach (var item in row.ItemArray.Reverse())\r\n " +
"{\r\n" +
"DataGridViewTextBoxCell cell = new DataGridViewTextBoxCell();\r\n" +
"cell.Value = item;\r\n " +
"dataGridViewRow.Cells.Add(cell);\r\n" +
"}\r\n" +
"dataGridViewRow.Height = 40;\r\n" +
"return dataGridViewRow;\r\n" +
"}).ToArray());" ; * /
}
//订单下拉模糊搜索
private void orderId_TextUpdate ( object sender , EventArgs e ) //不要用TextChanged
{
string s = this . txt_tablename . Text ; //获取输入内容
List < string > sList = GetTableName ( s ) ; //存放数据库查询结果
//提前下拉,以显示搜索结果(必须要在添加项之前下拉,否则会将第一项自动添加到编辑框内 覆盖掉输入的内容)
this . txt_tablename . DroppedDown = true ; //显示下拉列表,但是显示后鼠标指针就不见了
Cursor . Current = Cursors . Default ; //将指针显示出来
//在表中已录入名字中寻找包含输入内容的项 有则添加到comboBox项中
this . txt_tablename . Items . Clear ( ) ;
this . txt_tablename . Items . AddRange ( sList . ToArray ( ) ) ;
this . txt_tablename . Select ( this . txt_tablename . Text . Length , 0 ) ;
}
/// <summary>
/// 根据参数,获取数据表信息
/// </summary>
/// <param name="tabname"></param>
public static DataTable GetDbTableInfo ( string tabname )
{
string sql = @ "SELECT
c . COLUMN_NAME AS Name ,
c . COLUMN_TYPE AS Type ,
c . COLUMN_COMMENT AS Comment ,
CASE WHEN CONSTRAINT_NAME = ' PRIMARY ' THEN ' PRIMARY KEY ' ELSE ' ' END AS KeyType
FROM
INFORMATION_SCHEMA . COLUMNS c
LEFT JOIN
INFORMATION_SCHEMA . KEY_COLUMN_USAGE k
ON
c . TABLE_SCHEMA = k . TABLE_SCHEMA
AND c . TABLE_NAME = k . TABLE_NAME
AND c . COLUMN_NAME = k . COLUMN_NAME
WHERE
c . TABLE_NAME = ' { 0 } '
ORDER BY
c . ORDINAL_POSITION ; ";
//string str = $"SELECT COLUMN_NAME AS Name, COLUMN_TYPE AS Type,COLUMN_COMMENT AS COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{tabname}' ORDER BY ORDINAL_POSITION;";
var dt = DbHelperMySQL . Query ( String . Format ( sql , tabname ) ) ;
return dt ;
}
public static List < string > GetTableName ( string tableName )
{
string sql = $"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{DbHelperMySQL.DbName}' AND TABLE_NAME LIKE '{tableName}%' limit 20;" ;
var dt = DbHelperMySQL . Query ( sql ) ;
//查询数据库表中所有已录入人员
List < string > sList = new List < string > ( ) ; //存放数据库查询结果
for ( int i = 0 ; i < dt . Rows . Count ; i + + )
{
sList . Add ( dt . Rows [ i ] [ "TABLE_NAME" ] . ToString ( ) ) ;
}
return sList ;
//return dt;
}
public static string GetTableComment ( string tableName )
{
string sql = $"SELECT TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{DbHelperMySQL.DbName}' AND TABLE_NAME ='{tableName}';" ;
var dt = DbHelperMySQL . Query ( sql ) ;
if ( dt . Rows . Count < 1 ) return tableName ;
return dt . Rows [ 0 ] [ "TABLE_COMMENT" ] . ToString ( ) ;
}
public static List < string > GetTableName ( )
{
string sql = $"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{DbHelperMySQL.DbName}';" ;
var dt = DbHelperMySQL . Query ( sql ) ;
//查询数据库表中所有已录入人员
List < string > sList = new List < string > ( ) ; //存放数据库查询结果
for ( int i = 0 ; i < dt . Rows . Count ; i + + )
{
sList . Add ( dt . Rows [ i ] [ "TABLE_NAME" ] . ToString ( ) ) ;
}
return sList ;
//return dt;
if ( list . Count > 0 )
{
textBox1 . Text + = $ @ "
DateTimePicker dtp = new DateTimePicker ( ) ;
convertBeginDgv . Controls . Add ( dtp ) ;
dtp . Visible = false ;
dtp . TextChanged + = ( sender , e ) = > convertBeginDgv . CurrentCell . Value = dtp . Value . ToString ( "" yyyy - MM - dd "" ) ;
dtp . CloseUp + = ( sender , e ) = > dtp . Visible = false ;
convertBeginDgv . CellClick + = ( sender , e ) = > { {
if ( e . ColumnIndex = = - 1 | | e . RowIndex = = - 1 ) return ;
DataGridView dgv = ( sender as DataGridView ) ;
if ( new List < string > ( ) { {
{ DbUtil . joinList ( list ) }
} } . Contains ( dgv . Columns [ e . ColumnIndex ] . Name ) )
{ {
var _Recatngle = dgv . GetCellDisplayRectangle ( e . ColumnIndex , e . RowIndex , true ) ;
dtp . Size = _Recatngle . Size ;
dtp . Location = _Recatngle . Location ;
dtp . Visible = true ;
} }
else dtp . Visible = false ;
} } ;
convertBeginDgv . Scroll + = ( sender , e ) = > dtp . Visible = false ;
convertBeginDgv . SizeChanged + = ( sender , e ) = > { { if ( dtp . Visible ) dtp . Visible = false ; } } ; ";
}
/// <summary>
/// 类型转换枚举
/// </summary>
protected Dictionary < string , Type > DbTypeDic { get ; } = new Dictionary < string , Type > ( )
{
{ "int" , typeof ( Int32 ) } ,
{ "text" , typeof ( string ) } ,
{ "enum" , typeof ( string ) } ,
{ "bigint" , typeof ( Int64 ) } ,
{ "binary" , typeof ( byte [ ] ) } ,
{ "bit" , typeof ( bool ) } ,
{ "char" , typeof ( string ) } ,
{ "date" , typeof ( DateTime ) } ,
{ "datetime" , typeof ( DateTime ) } ,
{ "datetime2" , typeof ( DateTime ) } ,
{ "decimal" , typeof ( decimal ) } ,
{ "float" , typeof ( double ) } ,
{ "image" , typeof ( byte [ ] ) } ,
{ "money" , typeof ( decimal ) } ,
{ "nchar" , typeof ( string ) } ,
{ "ntext" , typeof ( string ) } ,
{ "numeric" , typeof ( decimal ) } ,
{ "nvarchar" , typeof ( string ) } ,
{ "real" , typeof ( Single ) } ,
{ "smalldatetime" , typeof ( DateTime ) } ,
{ "smallint" , typeof ( Int16 ) } ,
{ "smallmoney" , typeof ( decimal ) } ,
{ "timestamp" , typeof ( DateTime ) } ,
{ "tinyint" , typeof ( string ) } ,
{ "varbinary" , typeof ( byte [ ] ) } ,
{ "varchar" , typeof ( string ) } ,
{ "variant" , typeof ( object ) } ,
{ "uniqueidentifier" , typeof ( Guid ) } ,
} ;
/// <summary>
/// 获取字段类型
/// </summary>
/// <param name="dbTypeStr"></param>
/// <returns></returns>
public virtual Type DbTypeStr_To_CsharpType ( string dbTypeStr )
{
if ( dbTypeStr . Contains ( '(' ) )
{
string [ ] strings = dbTypeStr . Split ( '(' ) ;
dbTypeStr = strings [ 0 ] ;
}
string _dbTypeStr = dbTypeStr . ToLower ( ) ;
Type type = null ;
if ( DbTypeDic . ContainsKey ( _dbTypeStr ) )
type = DbTypeDic [ _dbTypeStr ] ;
else
type = typeof ( string ) ;
return type ;
}
}
}