diff --git a/DatabasetoEntityclass/Class1.cs b/DatabasetoEntityclass/Class1.cs deleted file mode 100644 index 674e89e..0000000 --- a/DatabasetoEntityclass/Class1.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace WindowsFormsApp1 -{ - internal class Class1 - { - - } -} diff --git a/DatabasetoEntityclass/DatabasetoEntityclass.csproj b/DatabasetoEntityclass/DatabasetoEntityclass.csproj index c2fb37d..241459d 100644 --- a/DatabasetoEntityclass/DatabasetoEntityclass.csproj +++ b/DatabasetoEntityclass/DatabasetoEntityclass.csproj @@ -6,8 +6,8 @@ AnyCPU {7D7B530A-23A4-4024-B263-A942AA53DCC5} WinExe - WindowsFormsApp1 - WindowsFormsApp1 + GenerateClass + GenerateClass v4.7.2 512 true @@ -39,6 +39,9 @@ ..\packages\Google.Protobuf.3.21.9\lib\net45\Google.Protobuf.dll + + ..\packages\JinianNet.JNTemplate.2.3.3\lib\net46\JinianNet.JNTemplate.dll + ..\packages\K4os.Compression.LZ4.1.3.5\lib\net462\K4os.Compression.LZ4.dll @@ -86,8 +89,8 @@ - - + + Form @@ -96,6 +99,8 @@ + + Form1.cs @@ -107,6 +112,7 @@ True Resources.resx + True @@ -118,6 +124,18 @@ Settings.settings True + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + diff --git a/DatabasetoEntityclass/Form1.Designer.cs b/DatabasetoEntityclass/Form1.Designer.cs index bcc6d58..ff79308 100644 --- a/DatabasetoEntityclass/Form1.Designer.cs +++ b/DatabasetoEntityclass/Form1.Designer.cs @@ -1,4 +1,4 @@ -namespace WindowsFormsApp1 +namespace GenerateClass { partial class Form1 { @@ -28,7 +28,7 @@ /// private void InitializeComponent() { - this.button1 = new System.Windows.Forms.Button(); + this.modelGen = new System.Windows.Forms.Button(); this.label2 = new System.Windows.Forms.Label(); this.txt_ret = new System.Windows.Forms.TextBox(); this.label3 = new System.Windows.Forms.Label(); @@ -44,22 +44,24 @@ this.button4 = new System.Windows.Forms.Button(); this.textBox3 = new System.Windows.Forms.TextBox(); this.label5 = new System.Windows.Forms.Label(); + this.isGenOperationColumn = new System.Windows.Forms.CheckBox(); + this.label6 = new System.Windows.Forms.Label(); this.SuspendLayout(); // - // button1 + // modelGen // - this.button1.Location = new System.Drawing.Point(81, 322); - this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(75, 23); - this.button1.TabIndex = 0; - this.button1.Text = "开始"; - this.button1.UseVisualStyleBackColor = true; - this.button1.Click += new System.EventHandler(this.button1_Click); + this.modelGen.Location = new System.Drawing.Point(105, 322); + this.modelGen.Name = "modelGen"; + this.modelGen.Size = new System.Drawing.Size(75, 23); + this.modelGen.TabIndex = 0; + this.modelGen.Text = "开始"; + this.modelGen.UseVisualStyleBackColor = true; + this.modelGen.Click += new System.EventHandler(this.modelGen_Click); // // label2 // this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(296, 16); + this.label2.Location = new System.Drawing.Point(357, 16); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(41, 12); this.label2.TabIndex = 4; @@ -68,16 +70,17 @@ // txt_ret // this.txt_ret.Font = new System.Drawing.Font("宋体", 11F); - this.txt_ret.Location = new System.Drawing.Point(453, 61); + this.txt_ret.Location = new System.Drawing.Point(518, 61); this.txt_ret.Multiline = true; this.txt_ret.Name = "txt_ret"; + this.txt_ret.ScrollBars = System.Windows.Forms.ScrollBars.Both; this.txt_ret.Size = new System.Drawing.Size(335, 341); this.txt_ret.TabIndex = 68; // // label3 // this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(453, 43); + this.label3.Location = new System.Drawing.Point(515, 43); this.label3.Name = "label3"; this.label3.Size = new System.Drawing.Size(53, 12); this.label3.TabIndex = 69; @@ -85,16 +88,16 @@ // // namespace_name // - this.namespace_name.Location = new System.Drawing.Point(131, 86); + this.namespace_name.Location = new System.Drawing.Point(118, 86); this.namespace_name.Name = "namespace_name"; - this.namespace_name.Size = new System.Drawing.Size(218, 21); + this.namespace_name.Size = new System.Drawing.Size(353, 21); this.namespace_name.TabIndex = 70; this.namespace_name.Text = "default_namespace"; // // lable2 // this.lable2.AutoSize = true; - this.lable2.Location = new System.Drawing.Point(67, 91); + this.lable2.Location = new System.Drawing.Point(54, 91); this.lable2.Name = "lable2"; this.lable2.Size = new System.Drawing.Size(59, 12); this.lable2.TabIndex = 71; @@ -103,25 +106,25 @@ // txt_tablename // this.txt_tablename.FormattingEnabled = true; - this.txt_tablename.Location = new System.Drawing.Point(343, 12); + this.txt_tablename.Location = new System.Drawing.Point(404, 12); this.txt_tablename.Name = "txt_tablename"; this.txt_tablename.Size = new System.Drawing.Size(218, 20); this.txt_tablename.TabIndex = 72; this.txt_tablename.Text = "请选择"; - this.txt_tablename.TextUpdate += new System.EventHandler(this.orderId_TextUpdate); // // textBox1 // this.textBox1.Font = new System.Drawing.Font("宋体", 11F); - this.textBox1.Location = new System.Drawing.Point(455, 425); + this.textBox1.Location = new System.Drawing.Point(517, 425); this.textBox1.Multiline = true; this.textBox1.Name = "textBox1"; + this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both; this.textBox1.Size = new System.Drawing.Size(335, 341); this.textBox1.TabIndex = 73; // // textBox2 // - this.textBox2.Location = new System.Drawing.Point(142, 469); + this.textBox2.Location = new System.Drawing.Point(164, 469); this.textBox2.Name = "textBox2"; this.textBox2.Size = new System.Drawing.Size(218, 21); this.textBox2.TabIndex = 74; @@ -130,7 +133,7 @@ // label1 // this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(70, 472); + this.label1.Location = new System.Drawing.Point(92, 472); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(65, 12); this.label1.TabIndex = 75; @@ -138,18 +141,18 @@ // // button2 // - this.button2.Location = new System.Drawing.Point(69, 630); + this.button2.Location = new System.Drawing.Point(91, 630); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(75, 23); this.button2.TabIndex = 76; this.button2.Text = "生成1"; this.button2.UseVisualStyleBackColor = true; - this.button2.Click += new System.EventHandler(this.button2_Click); + this.button2.Click += new System.EventHandler(this.dgvGen1_Click); // // label4 // this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(25, 405); + this.label4.Location = new System.Drawing.Point(87, 405); this.label4.Name = "label4"; this.label4.Size = new System.Drawing.Size(827, 12); this.label4.TabIndex = 77; @@ -158,27 +161,27 @@ // // button3 // - this.button3.Location = new System.Drawing.Point(176, 630); + this.button3.Location = new System.Drawing.Point(198, 630); this.button3.Name = "button3"; this.button3.Size = new System.Drawing.Size(75, 23); this.button3.TabIndex = 78; this.button3.Text = "生成2"; this.button3.UseVisualStyleBackColor = true; - this.button3.Click += new System.EventHandler(this.button3_Click); + this.button3.Click += new System.EventHandler(this.dgvGen2_Click); // // button4 // - this.button4.Location = new System.Drawing.Point(285, 630); + this.button4.Location = new System.Drawing.Point(307, 630); this.button4.Name = "button4"; this.button4.Size = new System.Drawing.Size(75, 23); this.button4.TabIndex = 79; this.button4.Text = "生成3"; this.button4.UseVisualStyleBackColor = true; - this.button4.Click += new System.EventHandler(this.button4_Click); + this.button4.Click += new System.EventHandler(this.dgvGen3_Click); // // textBox3 // - this.textBox3.Location = new System.Drawing.Point(858, 344); + this.textBox3.Location = new System.Drawing.Point(920, 344); this.textBox3.Multiline = true; this.textBox3.Name = "textBox3"; this.textBox3.Size = new System.Drawing.Size(98, 131); @@ -187,17 +190,37 @@ // label5 // this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(840, 322); + this.label5.Location = new System.Drawing.Point(902, 322); this.label5.Name = "label5"; this.label5.Size = new System.Drawing.Size(137, 12); this.label5.TabIndex = 81; this.label5.Text = "查询字段sql自定义,可空"; // + // isGenOperationColumn + // + this.isGenOperationColumn.AutoSize = true; + this.isGenOperationColumn.Location = new System.Drawing.Point(256, 538); + this.isGenOperationColumn.Name = "isGenOperationColumn"; + this.isGenOperationColumn.Size = new System.Drawing.Size(15, 14); + this.isGenOperationColumn.TabIndex = 82; + this.isGenOperationColumn.UseVisualStyleBackColor = true; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(89, 538); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(161, 12); + this.label6.TabIndex = 83; + this.label6.Text = "是否生成操作列(生成2和3):"; + // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(1084, 778); + this.Controls.Add(this.label6); + this.Controls.Add(this.isGenOperationColumn); this.Controls.Add(this.label5); this.Controls.Add(this.textBox3); this.Controls.Add(this.button4); @@ -213,7 +236,7 @@ this.Controls.Add(this.label3); this.Controls.Add(this.txt_ret); this.Controls.Add(this.label2); - this.Controls.Add(this.button1); + this.Controls.Add(this.modelGen); this.Name = "Form1"; this.Text = "Form1"; this.Load += new System.EventHandler(this.Form1_Load); @@ -224,7 +247,7 @@ #endregion - private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button modelGen; private System.Windows.Forms.Label label2; private System.Windows.Forms.TextBox txt_ret; private System.Windows.Forms.Label label3; @@ -240,6 +263,8 @@ private System.Windows.Forms.Button button4; private System.Windows.Forms.TextBox textBox3; private System.Windows.Forms.Label label5; + private System.Windows.Forms.CheckBox isGenOperationColumn; + private System.Windows.Forms.Label label6; } } diff --git a/DatabasetoEntityclass/Form1.cs b/DatabasetoEntityclass/Form1.cs index 38e7114..f625df6 100644 --- a/DatabasetoEntityclass/Form1.cs +++ b/DatabasetoEntityclass/Form1.cs @@ -1,19 +1,11 @@ using System; -using System.Collections; using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Data.SqlTypes; -using System.Drawing; -using System.Globalization; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; -using static System.Windows.Forms.VisualStyles.VisualStyleElement; +using GenerateClass.Util; +using JinianNet.JNTemplate; -namespace WindowsFormsApp1 +namespace GenerateClass { public partial class Form1 : Form { @@ -21,402 +13,121 @@ 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 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); + }; + } - /// - /// 将数据库字段转换为驼峰命名 - /// - /// - /// - public static string ToCamelCase(string dbField) + private void modelGen_Click(object sender, EventArgs e) { - string[] words = dbField.Split('_'); - for (int i = 1; i < words.Length; i++) - { - words[i] = char.ToUpper(words[i][0]) + words[i].Substring(1); - } - return string.Join("", words); + fillModelTemplate(); } - - // 根据数据库表名生成实体类名称 - static string GenerateClassName(string tableName) + private void dgvGen1_Click(object sender, EventArgs e) { - string[] words = tableName.Split('_'); - - StringBuilder sb = new StringBuilder(); - foreach (string word in words) - { - sb.Append(CultureInfo.CurrentCulture.TextInfo.ToTitleCase(word.ToLower())); - } - - return sb.ToString(); + fillDgv1Template(); } - - - private void button1_Click(object sender, EventArgs e) + private void dgvGen2_Click(object sender, EventArgs e) { - //string constr = txt_constr.Text.Trim();//数据库链接字符串 - txt_ret.Text = ""; - string tbname = txt_tablename.Text.Trim();//要生成的表名 - if (tbname.Equals("请选择") || tbname.Equals("")) { - MessageBox.Show("请选择表"); - return; - }; - string namespaceName = namespace_name.Text.Trim(); - DataTable dt = null; - if (textBox3.Text.Trim() == "") - { - dt = GetDbTableInfo(tbname); - } - else - { - dt = DbHelperMySQL.Query(textBox3.Text.Trim()); - } - var list = new List(); - txt_ret.Text += "using System;\n" + - "using NCA_MES_Models.CommonUtils.DB.DBAttribute;\n\n"; - txt_ret.Text += $"namespace {namespaceName} {{\n\n"; - txt_ret.Text += "/// " + "\n" + - $"/// {GetTableComment(tbname)}\n" + - "/// " + "\n" + - $"[TableName(\"{tbname}\")]\n" + - $"public class {GenerateClassName(tbname)}: DBBaseModel<{GenerateClassName(tbname)}>{{"; - 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" + "/// " + - "\n\t" + $"///{IsNullable}" + - "\n\t" + "/// " + - (String.IsNullOrEmpty(KeyType)?"":"\n\t[TableId]") + - "\n\t" + $"[TableField(\"{Name}\",\"{IsNullable}\")]" + - "\n\t" + $"public {type.Name} {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); + fillDgv2Template(); } - - - private void button2_Click(object sender, EventArgs e) + private void dgvGen3_Click(object sender, EventArgs e) { - string tbname = txt_tablename.Text.Trim();//要生成的表名 - if (tbname.Equals("请选择") || tbname.Equals("")) - { - MessageBox.Show("请选择表"); - return; - }; - DataTable dt = null; - if (textBox3.Text.Trim() == "") - { - dt = GetDbTableInfo(tbname); - } - else - { - dt = DbHelperMySQL.Query(textBox3.Text.Trim()); - } - string uidatagridview = textBox2.Text.Trim(); - textBox1.Text = ""; - textBox1.Text += $"DataTable data = DbHelperMySQL.Query(\"select * from {tbname}\");\n"; - textBox1.Text += "this."+ uidatagridview + ".DataSource = new BindingSource {DataSource = data};\n"; - for (int i = 0; i < dt.Rows.Count; i++) - { - var Name = dt.Rows[i]["Name"].ToString(); - textBox1.Text += $"var {Name}Column = {uidatagridview}.Columns[\"{Name}\"];\n"; - } - - for (int i = 0; i < dt.Rows.Count; i++) - { - var Name = dt.Rows[i]["Name"].ToString(); - var IsNullable = dt.Rows[i]["COMMENT"].ToString(); - textBox1.Text += $"{Name}Column.HeaderText = \"{IsNullable}\";\n"; - } - - textBox1.Text += $" {uidatagridview}.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader;\n"; - textBox1.Text += $" {uidatagridview}.AutoGenerateColumns = true;\n"; - // textBox1.Text += $" {uidatagridview}.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;\n"; + fillDgv3Template(); } - - private void button3_Click(object sender, EventArgs e) + private void fillModelTemplate() { string tbname = txt_tablename.Text.Trim();//要生成的表名 - if (tbname.Equals("请选择") || tbname.Equals("")) - { - MessageBox.Show("请选择表"); - return; - }; - DataTable dt = null; - if (textBox3.Text.Trim() == "") - { - dt = GetDbTableInfo(tbname); - } - else { - dt = DbHelperMySQL.Query(textBox3.Text.Trim()); + string namespaceName = namespace_name.Text.Trim();//名称空间名称 + List> filedInfos = DbUtil.getTableInfo(tbname, textBox3.Text.Trim()); + 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", tbname); + template.Set("table_name", DbUtil.GenerateClassName(tbname)); + template.Set("filedInfos", filedInfos); + template.SetStaticType("string", typeof(string)); + var result = template.Render(); + this.txt_ret.Text = result; + DbUtil.openFile(tbname, result); } - - 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" + - $" DataTable dt = DbHelperMySQL.Query(sql);\n"; - textBox1.Text += "List cols = new List();\n"; - textBox1.Text += "for (int i = 0; i < dt.Rows.Count; i++){\n" + - " DataGridViewTextBoxColumn temp = new DataGridViewTextBoxColumn();\n" + - "temp.Name = dt.Rows[i][0].ToString();\n" + - "temp.HeaderText = dt.Rows[i][1].ToString();\n" + - "temp.DataPropertyName= dt.Rows[i][0].ToString();\n" + - "cols.Add(temp);" + - "}\n"; - textBox1.Text += "DataGridViewButtonColumn editBtn = new DataGridViewButtonColumn();\r\n" + - "editBtn.HeaderText = \"编辑\";\r\n" + - "editBtn.Name = \"editBtn\";\r\n" + - "editBtn.Text = \"编辑\";\r\n" + - "editBtn.UseColumnTextForButtonValue = true;\r\n" + - "editBtn.Frozen = true;\n"; - textBox1.Text += " DataGridViewButtonColumn addBtn = new DataGridViewButtonColumn();\r\n" + - "addBtn.HeaderText = \"新增\";\r\n" + - "addBtn.Name = \"addBtn\";\r\n" + - "addBtn.Text = \"新增\";\r\n" + - "addBtn.UseColumnTextForButtonValue = true;\r\n" + - "addBtn.Frozen = true;\n "; - textBox1.Text += "cols.Add(editBtn);\n cols.Add(addBtn);\n"; - textBox1.Text += "if (cols.Last().Frozen)\r\n" + - "{\r\n " + - $"this.{uidatagridview}.RightToLeft = RightToLeft.Yes;\r\n" + - "cols.Reverse();\r\n" + - "}\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"; - 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) + private void fillDgv1Template() { string tbname = txt_tablename.Text.Trim();//要生成的表名 - if (tbname.Equals("请选择") || tbname.Equals("")) - { - MessageBox.Show("请选择表"); - return; - }; - - - DataTable dt = null; - if (textBox3.Text.Trim() == "") - { - dt = GetDbTableInfo(tbname); + string dgvName = textBox2.Text.Trim(); //dgv空间名称 + List> filedInfos = DbUtil.getTableInfo(tbname, textBox3.Text.Trim()); + List timeFileds = DbUtil.getTimeFields(filedInfos); + using (StreamReader reader = new StreamReader(@".\Template\DataGridView_1.template")) + { + string fileContent = reader.ReadToEnd(); + var template = Engine.CreateTemplate(fileContent); + template.Set("table_comment", DbUtil.GetTableComment(tbname)); + template.Set("sql_table_name", tbname); + template.Set("table_name", DbUtil.GenerateClassName(tbname)); + template.Set("dgv_name", dgvName); + template.Set("filedInfos", filedInfos); + template.Set("timeFiledStr", DbUtil.joinList(timeFileds)); + template.SetStaticType("string", typeof(string)); + var result = template.Render(); + this.textBox1.Text = result; } - else { - dt = DbHelperMySQL.Query(textBox3.Text.Trim()); - } - string uidatagridview = textBox2.Text.Trim(); - textBox1.Text = $"this.{uidatagridview}.AutoGenerateColumns = false;"; - textBox1.Text += "List cols = new List();\n\n"; - for (int i = 0; i < dt.Rows.Count; i++) - { - var Name = dt.Rows[i]["Name"].ToString(); - var IsNullable = dt.Rows[i]["COMMENT"].ToString(); - 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" + - "editBtn.HeaderText = \"编辑\";\r\n" + - "editBtn.Name = \"editBtn\";\r\n" + - "editBtn.Text = \"编辑\";\r\n" + - "editBtn.UseColumnTextForButtonValue = true;\r\n" + - "editBtn.Frozen = true;\n"; - textBox1.Text += " DataGridViewButtonColumn addBtn = new DataGridViewButtonColumn();\r\n" + - "addBtn.HeaderText = \"新增\";\r\n" + - "addBtn.Name = \"addBtn\";\r\n" + - "addBtn.Text = \"新增\";\r\n" + - "addBtn.UseColumnTextForButtonValue = true;\r\n" + - "addBtn.Frozen = true;\n "; - textBox1.Text += "cols.Add(editBtn);\n cols.Add(addBtn);\n"; - textBox1.Text += "if (cols.Last().Frozen)\r\n" + - "{\r\n " + - $"this.{uidatagridview}.RightToLeft = RightToLeft.Yes;\r\n" + - "cols.Reverse();\r\n" + - "}\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"; - 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 + private void fillDgv2Template() { - string s = this.txt_tablename.Text; //获取输入内容 - List 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); - } - - /// - /// 根据参数,获取数据表信息 - /// - /// - 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 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 sList = new List(); //存放数据库查询结果 - 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 GetTableName() - { - string sql = $"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{DbHelperMySQL.DbName}';"; - var dt = DbHelperMySQL.Query(sql); - //查询数据库表中所有已录入人员 - List sList = new List(); //存放数据库查询结果 - for (int i = 0; i < dt.Rows.Count; i++) - { - sList.Add(dt.Rows[i]["TABLE_NAME"].ToString()); + string tbname = txt_tablename.Text.Trim();//要生成的表名 + string dgvName = textBox2.Text.Trim(); //dgv空间名称 + List timeFileds = DbUtil.getTimeFields(DbUtil.getTableInfo(tbname, textBox3.Text.Trim())); + using (StreamReader reader = new StreamReader(@".\Template\DataGridView_2.template")) + { + string fileContent = reader.ReadToEnd(); + var template = Engine.CreateTemplate(fileContent); + template.Set("table_comment", DbUtil.GetTableComment(tbname)); + template.Set("sql_table_name", tbname); + template.Set("table_name", DbUtil.GenerateClassName(tbname)); + template.Set("dgv_name", dgvName); + template.Set("isGenOperationColumn", isGenOperationColumn.Checked); + template.Set("timeFiledStr", DbUtil.joinList(timeFileds)); + template.SetStaticType("string", typeof(string)); + var result = template.Render(); + this.textBox1.Text = result; } - return sList; - //return dt; } - - /// - /// 类型转换枚举 - /// - protected Dictionary DbTypeDic { get; } = new Dictionary() + private void fillDgv3Template() { - { "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) }, - }; - /// - /// 获取字段类型 - /// - /// - /// - public virtual Type DbTypeStr_To_CsharpType(string dbTypeStr) - { - if (dbTypeStr.Contains('(')) - { - string[] strings = dbTypeStr.Split('('); - dbTypeStr = strings[0]; + string tbname = txt_tablename.Text.Trim();//要生成的表名 + string dgvName = textBox2.Text.Trim(); //dgv空间名称 + List> filedInfos = DbUtil.getTableInfo(tbname, textBox3.Text.Trim()); + List timeFileds = DbUtil.getTimeFields(filedInfos); + using (StreamReader reader = new StreamReader(@".\Template\DataGridView_3.template")) + { + string fileContent = reader.ReadToEnd(); + var template = Engine.CreateTemplate(fileContent); + template.Set("table_comment", DbUtil.GetTableComment(tbname)); + template.Set("sql_table_name", tbname); + template.Set("table_name", DbUtil.GenerateClassName(tbname)); + template.Set("dgv_name", dgvName); + template.Set("filedInfos", filedInfos); + template.Set("isGenOperationColumn", isGenOperationColumn.Checked); + template.Set("timeFiledStr", DbUtil.joinList(timeFileds)); + template.SetStaticType("string", typeof(string)); + var result = template.Render(); + this.textBox1.Text = result; } - string _dbTypeStr = dbTypeStr.ToLower(); - Type type = null; - if (DbTypeDic.ContainsKey(_dbTypeStr)) - type = DbTypeDic[_dbTypeStr]; - else - type = typeof(string); - - return type; } - - } } diff --git a/DatabasetoEntityclass/Program.cs b/DatabasetoEntityclass/Program.cs index 389dad4..c176f9e 100644 --- a/DatabasetoEntityclass/Program.cs +++ b/DatabasetoEntityclass/Program.cs @@ -1,10 +1,11 @@ -using System; +using GenerateClass.Util; +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; -namespace WindowsFormsApp1 +namespace GenerateClass { internal static class Program { @@ -14,6 +15,7 @@ namespace WindowsFormsApp1 [STAThread] static void Main() { + Config.GlobalInit(); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); diff --git a/DatabasetoEntityclass/Properties/Resources.Designer.cs b/DatabasetoEntityclass/Properties/Resources.Designer.cs index 8b479b7..db55268 100644 --- a/DatabasetoEntityclass/Properties/Resources.Designer.cs +++ b/DatabasetoEntityclass/Properties/Resources.Designer.cs @@ -1,69 +1,61 @@ //------------------------------------------------------------------------------ // // 此代码由工具生成。 -// 运行时版本: 4.0.30319.42000 +// 运行时版本:4.0.30319.42000 // -// 对此文件的更改可能导致不正确的行为,如果 -// 重新生成代码,则所做更改将丢失。 +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ -namespace WindowsFormsApp1.Properties -{ - - +namespace GenerateClass.Properties { + using System; + + /// - /// 强类型资源类,用于查找本地化字符串等。 + /// 一个强类型的资源类,用于查找本地化的字符串等。 /// // 此类是由 StronglyTypedResourceBuilder // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen // (以 /str 作为命令选项),或重新生成 VS 项目。 - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - + internal class Resources { + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { + internal Resources() { } - + /// - /// 返回此类使用的缓存 ResourceManager 实例。 + /// 返回此类使用的缓存的 ResourceManager 实例。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WindowsFormsApp1.Properties.Resources", typeof(Resources).Assembly); + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("GenerateClass.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } - + /// /// 重写当前线程的 CurrentUICulture 属性,对 /// 使用此强类型资源类的所有资源查找执行重写。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { + internal static global::System.Globalization.CultureInfo Culture { + get { return resourceCulture; } - set - { + set { resourceCulture = value; } } diff --git a/DatabasetoEntityclass/Properties/Settings.Designer.cs b/DatabasetoEntityclass/Properties/Settings.Designer.cs index 438df21..c4cca6f 100644 --- a/DatabasetoEntityclass/Properties/Settings.Designer.cs +++ b/DatabasetoEntityclass/Properties/Settings.Designer.cs @@ -1,28 +1,24 @@ //------------------------------------------------------------------------------ // -// This code was generated by a tool. -// Runtime Version:4.0.30319.42000 +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 // -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ -namespace WindowsFormsApp1.Properties -{ - - +namespace GenerateClass.Properties { + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { + + public static Settings Default { + get { return defaultInstance; } } diff --git a/DatabasetoEntityclass/Template/DataGridView_1.template b/DatabasetoEntityclass/Template/DataGridView_1.template new file mode 100644 index 0000000..4760c21 --- /dev/null +++ b/DatabasetoEntityclass/Template/DataGridView_1.template @@ -0,0 +1,35 @@ + DataTable data = DbHelperMySQL.Query("select * from `${sql_table_name}`"); + this.${dgv_name}.DataSource = new BindingSource {DataSource = data}; +$foreach(filedInfo in filedInfos) + var ${filedInfo["field_name"]}Column = ${dgv_name}.Columns["${filedInfo["sql_field_name"]}"]; +$end + +$foreach(filedInfo in filedInfos) + ${filedInfo["field_name"]}Column.HeaderText = "${filedInfo["comment"]}"; +$end + ${dgv_name}.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader; + ${dgv_name}.AutoGenerateColumns = true; + +$if(timeFiledStr != "") + DateTimePicker dtp = new DateTimePicker(); + ${dgv_name}.Controls.Add(dtp); + dtp.Visible = false; + dtp.TextChanged += (sender, e) => ${dgv_name}.CurrentCell.Value = dtp.Value.ToString("yyyy-MM-dd"); + dtp.CloseUp += (sender, e) => dtp.Visible = false; + ${dgv_name}.CellClick += (sender, e) => { + if (e.ColumnIndex == -1 || e.RowIndex == -1) return; + DataGridView dgv = (sender as DataGridView); + if (new List() { + ${timeFiledStr} + }.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; + }; + ${dgv_name}.Scroll += (sender, e) => dtp.Visible = false; + ${dgv_name}.SizeChanged += (sender, e) => { if (dtp.Visible) dtp.Visible = false; }; +$end \ No newline at end of file diff --git a/DatabasetoEntityclass/Template/DataGridView_2.template b/DatabasetoEntityclass/Template/DataGridView_2.template new file mode 100644 index 0000000..16f7a93 --- /dev/null +++ b/DatabasetoEntityclass/Template/DataGridView_2.template @@ -0,0 +1,65 @@ + this.${dgv_name}.AutoGenerateColumns = false; + string sql = $"SELECT column_name, column_comment from information_schema.COLUMNS where table_name = '${sql_table_name}' ORDER BY ORDINAL_POSITION; "; + DataTable dt = DbHelperMySQL.Query(sql); + List cols = new List(); + for (int i = 0; i < dt.Rows.Count; i++){ + DataGridViewTextBoxColumn temp = new DataGridViewTextBoxColumn(); + temp.Name = dt.Rows[i][0].ToString(); + temp.HeaderText = dt.Rows[i][1].ToString(); + temp.DataPropertyName= dt.Rows[i][0].ToString(); + cols.Add(temp); + } +$if(isGenOperationColumn) + DataGridViewButtonColumn editBtn = new DataGridViewButtonColumn(); + editBtn.HeaderText = "编辑"; + editBtn.Name = "editBtn"; + editBtn.Text = "编辑"; + editBtn.UseColumnTextForButtonValue = true; + editBtn.Frozen = true; + + DataGridViewButtonColumn addBtn = new DataGridViewButtonColumn(); + addBtn.HeaderText = "新增"; + addBtn.Name = "addBtn"; + addBtn.Text = "新增"; + addBtn.UseColumnTextForButtonValue = true; + addBtn.Frozen = true; + cols.Add(editBtn); + cols.Add(addBtn); + if (cols.Last().Frozen) + { + this.${dgv_name}.RightToLeft = RightToLeft.Yes; + cols.Reverse(); + } +$end + this.${dgv_name}.Columns.AddRange(cols.ToArray()); +$if(isGenOperationColumn) + if (cols.Count > 0) + this.${dgv_name}.FirstDisplayedScrollingColumnIndex = cols.Count - 2; +$end + ${dgv_name}.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader; + DataTable data = DbHelperMySQL.Query("select * from ${sql_table_name}"); + this.${dgv_name}.DataSource = data; + +$if(timeFiledStr != "") + DateTimePicker dtp = new DateTimePicker(); + ${dgv_name}.Controls.Add(dtp); + dtp.Visible = false; + dtp.TextChanged += (sender, e) => ${dgv_name}.CurrentCell.Value = dtp.Value.ToString("yyyy-MM-dd"); + dtp.CloseUp += (sender, e) => dtp.Visible = false; + ${dgv_name}.CellClick += (sender, e) => { + if (e.ColumnIndex == -1 || e.RowIndex == -1) return; + DataGridView dgv = (sender as DataGridView); + if (new List() { + ${timeFiledStr} + }.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; + }; + ${dgv_name}.Scroll += (sender, e) => dtp.Visible = false; + ${dgv_name}.SizeChanged += (sender, e) => { if (dtp.Visible) dtp.Visible = false; }; +$end \ No newline at end of file diff --git a/DatabasetoEntityclass/Template/DataGridView_3.template b/DatabasetoEntityclass/Template/DataGridView_3.template new file mode 100644 index 0000000..75c80fc --- /dev/null +++ b/DatabasetoEntityclass/Template/DataGridView_3.template @@ -0,0 +1,66 @@ + this.${dgv_name}.AutoGenerateColumns = false; + List cols = new List(); +$foreach(filedInfo in filedInfos) + + DataGridViewTextBoxColumn ${filedInfo["field_name"]}Cloumn = new DataGridViewTextBoxColumn(); +$if(filedInfo["is_primary_key"]=="true") + ${filedInfo["field_name"]}Cloumn.Visible= false; +$end + ${filedInfo["field_name"]}Cloumn.Name = "${filedInfo["sql_field_name"]}"; ${filedInfo["field_name"]}Cloumn.HeaderText = "${filedInfo["comment"]}"; + ${filedInfo["field_name"]}Cloumn.DataPropertyName = "${filedInfo["sql_field_name"]}"; cols.Add(${filedInfo["field_name"]}Cloumn); +$end + +$if(isGenOperationColumn) + DataGridViewButtonColumn editBtn = new DataGridViewButtonColumn(); + editBtn.HeaderText = "编辑"; + editBtn.Name = "editBtn"; + editBtn.Text = "编辑"; + editBtn.UseColumnTextForButtonValue = true; + editBtn.Frozen = true; + + DataGridViewButtonColumn addBtn = new DataGridViewButtonColumn(); + addBtn.HeaderText = "新增"; + addBtn.Name = "addBtn"; + addBtn.Text = "新增"; + addBtn.UseColumnTextForButtonValue = true; + addBtn.Frozen = true; + cols.Add(editBtn); + cols.Add(addBtn); + if (cols.Last().Frozen) + { + this.${dgv_name}.RightToLeft = RightToLeft.Yes; + cols.Reverse(); + } +$end + this.${dgv_name}.Columns.AddRange(cols.ToArray()); +$if(isGenOperationColumn) + if (cols.Count > 0) + this.${dgv_name}.FirstDisplayedScrollingColumnIndex = cols.Count - 2; +$end + ${dgv_name}.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader; + DataTable data = DbHelperMySQL.Query($"select * from ${sql_table_name}"); + this.${dgv_name}.DataSource = data; + +$if(timeFiledStr != "") + DateTimePicker dtp = new DateTimePicker(); + ${dgv_name}.Controls.Add(dtp); + dtp.Visible = false; + dtp.TextChanged += (sender, e) => ${dgv_name}.CurrentCell.Value = dtp.Value.ToString("yyyy-MM-dd"); + dtp.CloseUp += (sender, e) => dtp.Visible = false; + ${dgv_name}.CellClick += (sender, e) => { + if (e.ColumnIndex == -1 || e.RowIndex == -1) return; + DataGridView dgv = (sender as DataGridView); + if (new List() { + ${timeFiledStr} + }.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; + }; + ${dgv_name}.Scroll += (sender, e) => dtp.Visible = false; + ${dgv_name}.SizeChanged += (sender, e) => { if (dtp.Visible) dtp.Visible = false; }; +$end \ No newline at end of file diff --git a/DatabasetoEntityclass/Template/ModelFile.template b/DatabasetoEntityclass/Template/ModelFile.template new file mode 100644 index 0000000..69d131d --- /dev/null +++ b/DatabasetoEntityclass/Template/ModelFile.template @@ -0,0 +1,28 @@ +using System; +using NCA_MES_Models.CommonUtils.DB.DBAttribute; + +namespace ${namespace_name} +{ + /// + /// ${table_comment} + /// + [TableName("${sql_table_name}")] + public class ${table_name} : DBBaseModel<${table_name}> + { +$foreach(filedInfo in filedInfos) + + /// + /// ${filedInfo["comment"]} + /// +$if(filedInfo["is_primary_key"]=="true") + [TableId] +$end +$if(filedInfo["is_nullable"]=="true") + [NotEmpty] +$end + [TableField("${filedInfo["sql_field_name"]}", "${filedInfo["comment"]}")] + public ${filedInfo["type_name"]} ${filedInfo["field_name"]} { get; set; } +$end + + } +} \ No newline at end of file diff --git a/DatabasetoEntityclass/Util/Config.cs b/DatabasetoEntityclass/Util/Config.cs new file mode 100644 index 0000000..c4f9b08 --- /dev/null +++ b/DatabasetoEntityclass/Util/Config.cs @@ -0,0 +1,14 @@ +using JinianNet.JNTemplate; + +namespace GenerateClass.Util +{ + public class Config + { + public static void GlobalInit() + { + Engine.Configure((options) => { + options.OutMode = OutMode.Auto; + }); + } + } +} diff --git a/DatabasetoEntityclass/DbHelper.cs b/DatabasetoEntityclass/Util/DbHelper.cs similarity index 99% rename from DatabasetoEntityclass/DbHelper.cs rename to DatabasetoEntityclass/Util/DbHelper.cs index 11d5207..9408a1a 100644 --- a/DatabasetoEntityclass/DbHelper.cs +++ b/DatabasetoEntityclass/Util/DbHelper.cs @@ -11,7 +11,7 @@ using System.Configuration; using System.Xml; using System.Text.RegularExpressions; -namespace WindowsFormsApp1 +namespace GenerateClass { public class DbHelperMySQL { diff --git a/DatabasetoEntityclass/Util/DbUtil.cs b/DatabasetoEntityclass/Util/DbUtil.cs new file mode 100644 index 0000000..10295ee --- /dev/null +++ b/DatabasetoEntityclass/Util/DbUtil.cs @@ -0,0 +1,277 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GenerateClass.Util +{ + public class DbUtil + { + public static string folderName = "GenFolder"; // 文件夹名称 + + public static void openFile(string tbname, string infoStr) + { + // 创建文件夹 + string folderPath = Path.Combine(Environment.CurrentDirectory, folderName); + Directory.CreateDirectory(folderPath); + // 创建文件并写入内容 + string filePath = Path.Combine(folderPath, DbUtil.GenerateClassName(tbname) + ".cs"); + File.WriteAllText(filePath, infoStr); + // 打开文件夹 + System.Diagnostics.Process.Start(folderPath); + } + + public static string joinList(List list) + { + string str = ""; + foreach (var item in list) + { + str += (str == "" ? "" : ",") + "\"" + item + "\""; + } + return str; + } + + public static List> getTableInfo(string tbname, string sql = "") + { + DataTable dt = null; + if (sql == "") + dt = DbUtil.GetDbTableInfo(tbname); + else + dt = DbHelperMySQL.Query(sql); + List> filedInfos = new List>(); + for (int i = 0; i < dt.Rows.Count; i++) + { + var dict = new Dictionary(); + 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); + } + return filedInfos; + } + + public static List getTimeFields(List> filedInfos) + { + var list = new List(); + filedInfos.ForEach(info => { + if (info["type_name"] == "DateTime") list.Add(info["sql_field_name"]); + }); + return list; + } + /// + /// 根据参数,获取数据表信息 + /// + /// + 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, + CASE WHEN c.IS_NULLABLE = 'NO' THEN 'NOT NULL' ELSE 'NULL' END AS Nullable + 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 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 sList = new List(); //存放数据库查询结果 + 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 GetTableName() + { + string sql = $"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{DbHelperMySQL.DbName}';"; + var dt = DbHelperMySQL.Query(sql); + //查询数据库表中所有已录入人员 + List sList = new List(); //存放数据库查询结果 + for (int i = 0; i < dt.Rows.Count; i++) + { + sList.Add(dt.Rows[i]["TABLE_NAME"].ToString()); + } + return sList; + } + + public static Dictionary DbTypeDic { get; } = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "int", typeof(int) }, + { "integer", typeof(int) }, + { "tinyint", typeof(byte) }, + { "smallint", typeof(short) }, + { "mediumint", typeof(int) }, + { "bigint", typeof(long) }, + { "float", typeof(float) }, + { "double", typeof(double) }, + { "decimal", typeof(decimal) }, + { "char", typeof(string) }, + { "varchar", typeof(string) }, + { "text", typeof(string) }, + { "mediumtext", typeof(string) }, + { "longtext", typeof(string) }, + { "enum", typeof(string) }, + { "date", typeof(DateTime) }, + { "time", typeof(TimeSpan) }, + { "datetime", typeof(DateTime) }, + { "timestamp", typeof(DateTime) }, + { "year", typeof(int) }, + { "binary", typeof(byte[]) }, + { "varbinary", typeof(byte[]) }, + { "blob", typeof(byte[]) }, + { "mediumblob", typeof(byte[]) }, + { "longblob", typeof(byte[]) }, + { "bit", typeof(bool) }, + { "boolean", typeof(bool) }, + { "json", typeof(string) }, + { "geometry", typeof(object) }, // Geometry 数据类型的映射可能需要特殊处理 + // 更多其他数据类型 + }; + /// + /// 获取字段类型 + /// + /// + /// + public static 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; + } + /// + /// 将数据库字段转换为驼峰命名 + /// + /// + /// + public static string ToCamelCase(string dbField) + { + string[] words = dbField.Split('_'); + for (int i = 1; i < words.Length; i++) + { + words[i] = char.ToUpper(words[i][0]) + words[i].Substring(1); + } + return string.Join("", words); + } + + // 根据数据库表名生成实体类名称 + public static string GenerateClassName(string tableName) + { + string[] words = tableName.Split('_'); + + StringBuilder sb = new StringBuilder(); + foreach (string word in words) + { + sb.Append(CultureInfo.CurrentCulture.TextInfo.ToTitleCase(word.ToLower())); + } + + return sb.ToString(); + } + /* /// + /// 类型转换枚举 + /// + protected Dictionary DbTypeDic { get; } = new Dictionary() + { + { "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(bool) }, + { "varbinary", typeof(byte[]) }, + { "varchar", typeof(string) }, + { "variant", typeof(object) }, + { "uniqueidentifier", typeof(Guid) }, + }; + /// + /// 获取字段类型 + /// + /// + /// + 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; + } +*/ + } +} diff --git a/DatabasetoEntityclass/Util/OldInfo.cs b/DatabasetoEntityclass/Util/OldInfo.cs new file mode 100644 index 0000000..91c8a61 --- /dev/null +++ b/DatabasetoEntityclass/Util/OldInfo.cs @@ -0,0 +1,234 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace GenerateClass.Util +{ + internal class OldInfo + { + /*private void fillDgv3Str() + { + string tbname = txt_tablename.Text.Trim();//要生成的表名 + if (tbname.Equals("请选择") || tbname.Equals("")) + { + MessageBox.Show("请选择表"); + return; + }; + DataTable dt = null; + 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 cols = new List();\n\n"; + var list = new List(); + 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" + + "editBtn.HeaderText = \"编辑\";\r\n" + + "editBtn.Name = \"editBtn\";\r\n" + + "editBtn.Text = \"编辑\";\r\n" + + "editBtn.UseColumnTextForButtonValue = true;\r\n" + + "editBtn.Frozen = true;\n"; + textBox1.Text += " DataGridViewButtonColumn addBtn = new DataGridViewButtonColumn();\r\n" + + "addBtn.HeaderText = \"新增\";\r\n" + + "addBtn.Name = \"addBtn\";\r\n" + + "addBtn.Text = \"新增\";\r\n" + + "addBtn.UseColumnTextForButtonValue = true;\r\n" + + "addBtn.Frozen = true;\n "; + textBox1.Text += "cols.Add(editBtn);\n cols.Add(addBtn);\n"; + textBox1.Text += "if (cols.Last().Frozen)\r\n" + + "{\r\n " + + $"this.{uidatagridview}.RightToLeft = RightToLeft.Yes;\r\n" + + "cols.Reverse();\r\n" + + "}\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"; + textBox1.Text += $" {uidatagridview}.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader;\n"; + textBox1.Text += $"DataTable data = DbHelperMySQL.Query(\"select * from {tbname}\");\n"; + textBox1.Text += $"this.{uidatagridview}.DataSource = data;\n"; + 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() {{ + {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; }};"; + } + + }*/ + /* private void fillDgv2Str() + { + string tbname = txt_tablename.Text.Trim();//要生成的表名 + if (tbname.Equals("请选择") || tbname.Equals("")) + { + MessageBox.Show("请选择表"); + return; + }; + DataTable dt = null; + 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 += $" string sql = $\"SELECT column_name, column_comment from information_schema.COLUMNS where table_name = '{tbname}' ORDER BY ORDINAL_POSITION; \";\r\n" + + $" DataTable dt = DbHelperMySQL.Query(sql);\n"; + textBox1.Text += "List cols = new List();\n"; + textBox1.Text += "for (int i = 0; i < dt.Rows.Count; i++){\n" + + " DataGridViewTextBoxColumn temp = new DataGridViewTextBoxColumn();\n" + + "temp.Name = dt.Rows[i][0].ToString();\n" + + "temp.HeaderText = dt.Rows[i][1].ToString();\n" + + "temp.DataPropertyName= dt.Rows[i][0].ToString();\n" + + "cols.Add(temp);" + + "}\n"; + textBox1.Text += "DataGridViewButtonColumn editBtn = new DataGridViewButtonColumn();\r\n" + + "editBtn.HeaderText = \"编辑\";\r\n" + + "editBtn.Name = \"editBtn\";\r\n" + + "editBtn.Text = \"编辑\";\r\n" + + "editBtn.UseColumnTextForButtonValue = true;\r\n" + + "editBtn.Frozen = true;\n"; + textBox1.Text += " DataGridViewButtonColumn addBtn = new DataGridViewButtonColumn();\r\n" + + "addBtn.HeaderText = \"新增\";\r\n" + + "addBtn.Name = \"addBtn\";\r\n" + + "addBtn.Text = \"新增\";\r\n" + + "addBtn.UseColumnTextForButtonValue = true;\r\n" + + "addBtn.Frozen = true;\n "; + textBox1.Text += "cols.Add(editBtn);\n cols.Add(addBtn);\n"; + textBox1.Text += "if (cols.Last().Frozen)\r\n" + + "{\r\n " + + $"this.{uidatagridview}.RightToLeft = RightToLeft.Yes;\r\n" + + "cols.Reverse();\r\n" + + "}\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"; + 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 fillDgv1Str() + { + string tbname = txt_tablename.Text.Trim();//要生成的表名 + if (tbname.Equals("请选择") || tbname.Equals("")) + { + MessageBox.Show("请选择表"); + return; + }; + DataTable dt = null; + if (textBox3.Text.Trim() == "") + { + dt = DbUtil.GetDbTableInfo(tbname); + } + else + { + dt = DbHelperMySQL.Query(textBox3.Text.Trim()); + } + string uidatagridview = textBox2.Text.Trim(); + textBox1.Text = ""; + textBox1.Text += $"DataTable data = DbHelperMySQL.Query(\"select * from {tbname}\");\n"; + textBox1.Text += "this." + uidatagridview + ".DataSource = new BindingSource {DataSource = data};\n"; + for (int i = 0; i < dt.Rows.Count; i++) + { + var Name = dt.Rows[i]["Name"].ToString(); + textBox1.Text += $"var {Name}Column = {uidatagridview}.Columns[\"{Name}\"];\n"; + } + + for (int i = 0; i < dt.Rows.Count; i++) + { + var Name = dt.Rows[i]["Name"].ToString(); + var IsNullable = dt.Rows[i]["COMMENT"].ToString(); + textBox1.Text += $"{Name}Column.HeaderText = \"{IsNullable}\";\n"; + } + + textBox1.Text += $" {uidatagridview}.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.ColumnHeader;\n"; + textBox1.Text += $" {uidatagridview}.AutoGenerateColumns = true;\n"; + }*/ + + /* private void fillModelStr() + { + //string constr = txt_constr.Text.Trim();//数据库链接字符串 + txt_ret.Text = ""; + string tbname = txt_tablename.Text.Trim();//要生成的表名 + if (tbname.Equals("请选择") || tbname.Equals("")) + { + MessageBox.Show("请选择表"); + return; + }; + string namespaceName = namespace_name.Text.Trim(); + DataTable dt = null; + if (textBox3.Text.Trim() == "") + { + dt = DbUtil.GetDbTableInfo(tbname); + } + else + { + dt = DbHelperMySQL.Query(textBox3.Text.Trim()); + } + var infoStr = ""; + infoStr += "using System;\n" + + "using NCA_MES_Models.CommonUtils.DB.DBAttribute;\n\n"; + infoStr += $"namespace {namespaceName} \n{{\n\n"; + infoStr += "\t/// " + "\n" + + $"\t/// {DbUtil.GetTableComment(tbname)}\n" + + "\t/// " + "\n" + + $"\t[TableName(\"{tbname}\")]\n" + + $"\tpublic 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(); + var Nullable = dt.Rows[i]["Nullable"].ToString(); + Type type = DbUtil.DbTypeStr_To_CsharpType(Type); + infoStr += "\t\n\n\t" + "/// " + + "\t\n\t" + $"///{IsNullable}" + + "\t\n\t" + "/// " + + (String.IsNullOrEmpty(KeyType) ? "" : "\n\t[TableId]") + + (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 + } + infoStr += "\n\t}"; + infoStr += "\n}"; + this.txt_ret.Text = infoStr; + DbUtil.openFile(tbname, infoStr); + }*/ + } +} diff --git a/DatabasetoEntityclass/packages.config b/DatabasetoEntityclass/packages.config new file mode 100644 index 0000000..4139890 --- /dev/null +++ b/DatabasetoEntityclass/packages.config @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file