1)为cmbDatabase下拉列表框加载数据库名

在窗体的加载事件中为数据库后面的下拉列表框添加查询得到的数据库名称

private void Form1_Load(object sender, EventArgs e)//窗体加载事件 { GetDatabases();//调用获取数据库文件方法 } private void GetDatabases() { //连接字符串 using (SqlConnection con = new SqlConnection("Data Source=.;Integrated Security=True")) { //系统存储过程 using (SqlCommand cmd = new SqlCommand("exec sp_databases", con)) { if (con.State == ConnectionState.Closed) //检测连接是否关闭 { con.Open(); } using (SqlDataReader sr = cmd.ExecuteReader()) { if (sr.HasRows) { while (sr.Read()) { //为数据库下拉列表框添加数据库名称 cmbDatabase.Items.Add(sr.GetString(0)); } } } } } }

2)为cmbTable下拉列表框加载数据表名

通过cmbDatabase控件的SelectedIndexChanged事件,为cmbTable控件添加数据表名

private void cmbDatabase_SelectedIndexChanged(object sender, EventArgs e) { GetTables(); } private void GetTables() { //数据库名称 using (SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=" cmbDatabase.Text ";Integrated Security=True")) { using (SqlCommand cmd = new SqlCommand("exec sp_tables null,dbo", con)) { if (con.State == ConnectionState.Closed) { con.Open(); } using (SqlDataReader sr = cmd.ExecuteReader()) { if (sr.HasRows) { while (sr.Read()) { cmbTable.Items.Add(sr.GetString(2)); } } } } } }

以上连接字符串都是使用的Windows身份验证方式;另一种自己去添加测试

各种隐藏代码(三层-34)(1)

运行效果

3)单击"生成"按钮生成代码

3.1检测命名空间,数据库与数据表控件的值是否为空(这里不牵涉什么设计模式)

private void button1_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(txtNameSp.Text.Trim())) { MessageBox.Show("请输入命名空间名称"); } else { if (string.IsNullOrEmpty(cmbDatabase.Text)) { MessageBox.Show("请选择数据库"); } else { if (string.IsNullOrEmpty(cmbTable.Text)) { MessageBox.Show("请选择数据表"); } else { GetSplicingCode();//调用拼接代码方法 } } } }

3.2生成拼接代码的方法

3.2.1先将引用类库,命名空间与类名的框架拼接出来

private void GetSplicingCode() { string tbName = cmbTable.Text;//获取表名当做实体类的类名 StringBuilder sb = new StringBuilder();//用于拼接代码的字符串 sb.AppendLine("using System;");//引用类库 sb.AppendLine("");//空一行 sb.AppendLine("namespace " txtNameSp.Text.Trim());//添加命名空间名称 sb.AppendLine("{"); sb.AppendLine(" public class " cmbTable.Text);//添加类名 sb.AppendLine(" {"); //SplicingFieldAndProp(sb);//调用此方法循环拼接出字段及其属性 sb.AppendLine(" }"); sb.AppendLine("}"); richTextBox1.Text = sb.ToString();//拼接好的代码显示在富文本框中 }

各种隐藏代码(三层-34)(2)

单击生成按钮运行效果

要想拼接生成的代码在富文本框中对齐,通过vs的格式化代码,先将代码格式对齐,然后复制对应的行粘贴到sb.AppendLine()方法中即可

各种隐藏代码(三层-34)(3)

在图中行号6的左侧单击就会选中这一行(图中浅蓝色方块即选中的整行),将其复制粘贴到sb.AppendLine()方法

3.2.2循环生成字段及属性

执行系统存储过程exec sp_columns '表名' 获取当前数据库(School)下的指定表(Test)的所有列的详细信息

private SqlDataReader GetColumnsDataReader () { SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=" cmbDatabase.Text ";Integrated Security=True"); { using (SqlCommand cmd = new SqlCommand("exec sp_columns '" cmbTable.Text "'", con)) { if (con.State == ConnectionState.Closed)//检测通道是关闭的才打开;重复打开报异常 { con.Open(); } return cmd.ExecuteReader(); } } }

通过循环拼接表中的字段和属性(字段与属性名暂不处理)

//将上面GetSplicingCode()方法中SplicingFieldAndProp()方法的注释去掉 private void SplicingFieldAndProp(StringBuilder sb) { using (SqlDataReader sr = GetColumnsDataReader()) { if (sr.HasRows) { while (sr.Read()) { //下面生成的字段与属性名,数据类型暂时都是死的,主要是查看与表中字段数量是否一致 sb.AppendLine(" private int _tid;"); sb.AppendLine(" public int Tid"); sb.AppendLine(" {"); sb.AppendLine(" set { _tid = value; }"); sb.AppendLine(" get { return _tid; }"); sb.AppendLine(" }"); } } } }

各种隐藏代码(三层-34)(4)

运行结果;与表中字段数量一致

下节将数据类型(包括判断是否为可空值类型),字段与属性名这些动态生成最终实体层代码,再简单说下动软与CodeSmith(包括三层模板)两个代码生成器软件的使用方法

,