各种隐藏代码(三层-34)
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身份验证方式;另一种自己去添加测试
运行效果
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();//拼接好的代码显示在富文本框中
}
单击生成按钮运行效果
要想拼接生成的代码在富文本框中对齐,通过vs的格式化代码,先将代码格式对齐,然后复制对应的行粘贴到sb.AppendLine()方法中即可
在图中行号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(" }");
}
}
}
}
运行结果;与表中字段数量一致
下节将数据类型(包括判断是否为可空值类型),字段与属性名这些动态生成最终实体层代码,再简单说下动软与CodeSmith(包括三层模板)两个代码生成器软件的使用方法
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com