基于三层结构C#代码生成器

本文介绍了一个动态代码生成器的设计与实现过程,包括数据库操作函数、代码模板生成及代码美化等功能。该工具能根据数据库表结构自动生成Model层、BLL层和DAL层代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[size=x-large] 一、功能简介:根据数据库表的字段生成相应的Model层(数据模型)、BLL层(业务处理)、DAL(数据访问层)

二、动态代码生成器的编写过程中所涉及的数据库操作函数
[/size]
[size=large]1.登陆验证 [/size]
#region 登陆验证
/// <summary>
/// 登陆验证
/// </summary>
/// <param name="conStr"></param>
/// <returns></returns>
public static bool login(string conStr)
{
try
{
conn = new SqlConnection(conStr);
conn.Open();
conn.Close();
return true;
}
catch
{
conn = null;
return false;
}
}
#endregion



[size=large] 2、获取所有的数据库 [/size]
 #region 获取所有数据库
/// <summary>
/// 获取所有数据库
/// </summary>
/// <returns></returns>
public static List<string> getDBName()
{
StringBuilder str = new StringBuilder();
string sql = "select name from master..sysdatabases";
List<string> list = new List<string>();
try
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
list.Add(dr[0].ToString().ToLower());
}
}
conn.Close();
}
catch(Exception e)
{
throw e;
}
return list;
}
#endregion


[size=large]3、获取数据库的所有用户表[/size]
    #region 获取数据库的所有用户表
/// <summary>
/// 获取数据库的所有用户表
/// </summary>
/// <returns>返回表名连接字符串</returns>
public static List<string> getTableName(string xtype)
{

//StringBuilder str = new StringBuilder();
List<string> list = new List<string>();
try
{
string sql = "select * from sysobjects where xtype='" + xtype + "' and category<>2";
if (conn != null)
{
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
conn.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
list.Add(dr[0].ToString().ToLower());
}
}
conn.Close();
}
list.Sort();
}
catch (Exception e)
{
throw e;
}
return list ;
}
#endregion


[size=large] 4、获取表的所有字段名和类型[/size]

   #region 获取表的所有字段名和字段类型
/// <summary>
/// 获取表的所有字段名和字段类型
/// </summary>
/// <param name="tblName">查询的表名</param>
/// <returns>字段名和类型名的连接字符串</returns>
public static List<Table> getTblColumns(string tblName)
{
List<Table> list = new List<Table>();
try
{
if (conn != null)
{
DataSet ds = new DataSet();
conn.Open();
using (SqlDataAdapter sda = new SqlDataAdapter())
{
using (SqlCommand cmd = new SqlCommand("sp_columns", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@table_Name", tblName));
sda.SelectCommand = cmd;
sda.Fill(ds);
conn.Close();

for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
Table model = new Table();
model.ColumnName = ds.Tables[0].Rows[i][3].ToString();
model.TypeName = ds.Tables[0].Rows[i][5].ToString();
model.Length = Convert.ToInt32(ds.Tables[0].Rows[i][7].ToString());
list.Add(model);
}

}
}
}
}
catch (Exception e)
{
throw e;
}
return list;
}
#endregion


[size=large][size=large]三、以上工作完成之后,我们就可以依此来生成代码
1、首先是model的生成,这一层代码的生成也是最简单的,根据数据库字段生成相应的get、set方法
2、其次是业务逻辑层的生成,这一层就要是控制业务逻辑,调用相应的数据库操纵函数实现数据的访问和显示控制
3、数据访问层,生成对数据库的增、删、改、查方法
4、每一层都有可以抽象成相应的模板代码,在具体写项目时,无需人工编写,大大节约时间
四、其中涉及的难点
1、字符串的拼接,最繁琐
2、关键字变色,相对来说难度较大,建立关键字库,处理生成的代码,识别类、借口、等关键字,并让他们高亮显示成不同的颜色[/size]
 #region 更改关键字的颜色
/// <summary>
/// 更改关键字和注释的颜色
/// </summary>
private void SetKeysColor(RichTextBox rtb)
{
//listclasses.Add(txtModel.Text);
//listclasses.Add(txtModel.Text+"Service");
//listclasses.Add(txtModel.Text+"Manager");

//更改关键字的颜色
int start = 0;
string text = rtb.Text;
string[] strs = text.Split(listmarks.ToArray());
bool flag = false;
foreach (string s in strs)
{
flag = false;
//判断是否为关键字,变为 Blue
if (!flag)
{
foreach (string z in listkeys)
{
if (s == z)
{
rtb.Select(start, s.Length);
rtb.SelectionColor = Color.Blue;
flag = true;
break;
}
}
}
//判断是否为类、接口等,变为 CadetBlue
if (!flag)
{
foreach (string z in listclasses)
{
if (s == z)
{
rtb.Select(start, s.Length);
rtb.SelectionColor = Color.CadetBlue;
flag = true;
break;
}
}
}
start += s.Length + 1;
}
}
/// <summary>
/// 更改注释的颜色
/// </summary>
private void setColor(RichTextBox rtb)
{
//更改注释的颜色
string text = rtb.Text;
int count = 0;
while (true)
{
int _start = text.IndexOf("///", count) + 3;
if (_start == 2)
break;
int _end = text.IndexOf('\n', _start);
count = _end;
string str = text.Substring(_start, _end - _start);
str = str.Trim();
if (str[0] == '<' && str[str.Length - 1] == '>')
{
rtb.Select(_start - 3, (_end - _start) + 3);
rtb.SelectionColor = Color.Gray;
rtb.Select(0, 0);
rtb.SelectionColor = Color.Black;
}
else
{
rtb.Select(_start - 3, 3);
rtb.SelectionColor = Color.Gray;
rtb.Select(_start, (_end - _start) + 3);
rtb.SelectionColor = Color.Green;
rtb.Select(0, 0);
rtb.SelectionColor = Color.Black;
}
}
}

[size=large]3、对双引号字符串显红色的处理,使用正则表达式来处理,具体代码如下:
[/size][/size]
  #region 更改双引号中字符串的颜色

private string SetStringsColor(Match m)
{
//MessageBox.Show(m.Value);
System.Text.StringBuilder retCode = new System.Text.StringBuilder();
string[] lines = m.Value.Split('\n');
int start = 0;
foreach (string line in lines)
{
start = text_adl.Text.IndexOf(line);
text_adl.Select(start, line.Length);
while (start != -1)
{
if (text_adl.SelectionColor == Color.Red)
{
start = text_adl.Text.IndexOf(line, start + line.Length);
if (start > 0)
{
text_adl.Select(start, line.Length);
}
}
text_adl.SelectionColor = Color.Red;
}
retCode.Append(line);
}
return retCode.ToString();
}

/// <summary>
/// 更改双引号中字符串的颜色
/// </summary>
private void SetRedColor(RichTextBox rtb)
{
//更改双引号中字符串的颜色
Regex r = new Regex("(\"[A-Za-z =,)(_@\n]*\")", RegexOptions.Multiline);//
string str = rtb.Text;
r.Replace(str, new MatchEvaluator(this.SetStringsColor));
}

#endregion

#region 更改双引号中字符串的颜色

private string SetStringsColor(Match m)
{
//MessageBox.Show(m.Value);
System.Text.StringBuilder retCode = new System.Text.StringBuilder();
string[] lines = m.Value.Split('\n');
int start = 0;
foreach (string line in lines)
{
start = text_adl.Text.IndexOf(line);
text_adl.Select(start, line.Length);
while (start != -1)
{
if (text_adl.SelectionColor == Color.Red)
{
start = text_adl.Text.IndexOf(line, start + line.Length);
if (start > 0)
{
text_adl.Select(start, line.Length);
}
}
text_adl.SelectionColor = Color.Red;
}
retCode.Append(line);
}
return retCode.ToString();
}

/// <summary>
/// 更改双引号中字符串的颜色
/// </summary>
private void SetRedColor(RichTextBox rtb)
{
//更改双引号中字符串的颜色
Regex r = new Regex("(\"[A-Za-z =,)(_@\n]*\")", RegexOptions.Multiline);//
string str = rtb.Text;
r.Replace(str, new MatchEvaluator(this.SetStringsColor));
}

#endregion


[img]
[img]http://dl2.iteye.com/upload/attachment/0099/0861/0a4a7c06-0d1f-3b83-9b3b-124e14637e21.jpg[/img]
[/img]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值