以前很多时候都是使用CodeSmith或动软生成相关的数据库访问代码(不喜欢使用持久化框架),可以CodeSmith对中文的支持不好,新下载的6.5的版本,怎样都不能正确显示中文,动软代码生成器的表字段的注释永远都显示不了(李天平的败笔),有几个属性如MySql的smallint,tinyint,得重新更改选项的映射表,太麻烦了。虽然说动软现在提供了模块生成功能,批量生成中对表的重命名也不能够,功能有点弱呀,于是自己写个代码生成器,按自己的规则去生成,注释也出来了,多了注释提示,对开发帮助很大的。代码如下:
private void CreateModel()
{
string connectionString = "server=127.0.0.1;port=3306;User Id=root;Password=root;database=ipbroadcast;Connect Timeout=60;Treat Tiny As Boolean=False";
MySql.Data.MySqlClient.MySqlConnection conn = new MySql.Data.MySqlClient.MySqlConnection(connectionString);
conn.Open();
DataTable table = conn.GetSchema("TABLES");
foreach (DataRow row in table.Rows)
{
DataTable sheetTable = GetSchemaTable(conn, row);
string tName = row["TABLE_NAME"].ToString();
CreateEntityFile(conn, tName, sheetTable);
}
conn.Close();
}
private DataTable GetSchemaTable(MySqlConnection conn, DataRow row)
{
string sheetName = row["TABLE_Name"].ToString();
MySqlCommand com = conn.CreateCommand();
com.CommandType = CommandType.Text;
com.CommandText = "Select * From " + sheetName;
IDataReader reader = com.ExecuteReader(CommandBehavior.SchemaOnly);
DataTable table = reader.GetSchemaTable();
com.Dispose();
reader.Close();
return table;
}
private void CreateEntityFile(MySqlConnection conn, string tName, DataTable table)
{
//定义生成文件的路径
string tableName = tName;
string schemaName = "";
string colName = "";
string path = @"F:\IPBroadcastModel\Model1";
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
MySqlCommand com = conn.CreateCommand();
com.CommandType = CommandType.Text;
Dictionary<string, string> dict = new Dictionary<string, string>();
bool isGetComment = false;
//写文件
string clsName = "Ety" + tableName.Substring(3, 1).ToUpper() + tableName.Substring(4);
string fileName = clsName + ".cs";
string fullName = Path.Combine(path, fileName);
using (FileStream fs = new FileStream(fullName, FileMode.Create))
{
StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);
sw.WriteLine("using System;");
sw.WriteLine("using System.Text;");
sw.WriteLine("using System.Collections.Generic; ");
sw.WriteLine("using System.Data;");
sw.WriteLine("namespace AEBell.DBManager");
sw.WriteLine("{");
sw.WriteLine("\t[Serializable]");
sw.WriteLine("\tpublic class " + clsName);
sw.WriteLine("\t{");
foreach (DataRow row in table.Rows)
{
//tableName = row["BaseTableName"].ToString();
colName = row["ColumnName"].ToString();
schemaName = row["BaseSchemaName"].ToString();
if (!isGetComment)
{
isGetComment = true;
GetFielComment(tableName, schemaName, com, dict);
}
sw.WriteLine("\t\t/// <summary>");
sw.WriteLine("\t\t/// " + dict[colName]);
sw.WriteLine("\t\t/// </summary>");
Type info = row["DataType"] as Type;
string declear = info.Name;
if (declear.ToUpper() == "SBYTE") //为了适应动软。
declear = "Byte";
bool isNull = (bool)row["AllowDBNull"];
if (isNull && info.BaseType.Name == "ValueType")
declear += "?";
sw.WriteLine("\t\tpublic " + declear + " " + colName.Substring(0, 1).ToUpper() + colName.Substring(1));
sw.WriteLine("\t\t{");
sw.WriteLine("\t\t\tget;");
sw.WriteLine("\t\t\tset;");
sw.WriteLine("\t\t}");
}
sw.WriteLine("\t}");
sw.WriteLine("}");
sw.Close();
}
}
private static void GetFielComment(string tableName, string schemaName, MySqlCommand com, Dictionary<string, string> dict)
{
string comment = "";
com.CommandText = "Select COLUMN_NAME,DATA_TYPE, COLUMN_COMMENT From INFORMATION_SCHEMA.COLUMNS where table_name ='"
+ tableName + "' AND table_schema = '" + schemaName + "'"; // AND column_name LIKE '" + colName + "'";
IDataReader reader = com.ExecuteReader();
while (reader.Read())
{
string colName = reader.GetString(0);
comment = reader.GetString(2);
dict[colName] = comment;
}
reader.Close();
}
虽然实现不是很严谨,DAL和BLL层也没有实现,但有需要之人是可以很快实现的。不对之处,请指正。