我的上个随笔提到我的代码生成器,已经可以生成用SQL语句操作数据库库,用存储过程操作数据库(并同时生成存储过程),和对数据进行映射。
我一直在努力想将他扩展成多种格式,语言,多数据库支持的。但我发现每种新格式必须新写不少代码,麻烦,而且格式只能写死在代码里。
大前天,我突然想到,为什么不设置一个格式文件通过解析格式生成代码呢,这样用户在拓展生成格式的时候只需要写个格式文件就可以了,跨语言,跨格式一步实现。
实现如下:
标识
<<TABLE_NAME>> 表名
<<U_TABLE_NAME>> 全部大写的表名
<<L_TABLE_NAME>> 全部小写的表名
<<UF_TABLE_NAME>> 首字母大写的表名
<<LF_TABLE_NAME>> 首字母小写的表名
<<COLUMN_NAME>> 列名
<<U_COLUMN_NAME>> 全部大写的列名
<<L_COLUMN_NAME>> 全部小写的列名
<<UF_COLUMN_NAME>> 首字母大写的列名
<<LF_COLUMN_NAME>> 首字母小写的列名
<<COLUMN_SIZE>> 列长度
<<COLUMN_TYPE>> 列类型
<<COLUMN_VALUE_TYPE>> 对应的数据类型
<<COLUMN_DB_Type>> 对应的数据库参数类型
命令
<<FOREACH_COLUMN>> <<END_FOREACH_COLUMN>> 在所有的字段循环
<<FOREACH_PKCOLUMN>> <<END_FOREACH_PKCOLUMN>> 在所有的关键字段循环
<<REMOVE_COMMA>> <<END_REMOVE_COMMA>> 去掉最后的逗号
下面是我写的一个格式
using System;
using System.Data;
using System.Data.SqlClient;

namespace 命名空间


{

/**//// </summary>
///注释
/// </summary>
public class <<TABLE_NAME>>DB

{
private SqlConnection conn=new SqlConnection();
private SqlCommand command=new SqlCommand();

public <<TABLE_NAME>>DB()

{
conn.ConnectionString=ConStrLib.GetConStr();
}

<<FOREACH_COLUMN>>
private <<COLUMN_VALUE_TYPE>> <<LF_COLUMN_NAME>>;
public <<COLUMN_VALUE_TYPE>> <<UF_COLUMN_NAME>>

{
get

{
return <<LF_COLUMN_NAME>>;
}
set

{
<<LF_COLUMN_NAME>>= value ;
}
}

<<END_FOREACH_COLUMN>>

public bool Add()

{
string strSql = "insert into <<TABLE_NAME>>
(<<REMOVE_COMMA>><<FOREACH_COLUMN>><<COLUMN_NAME>>,<<END_FOREACH_COLUMN>><<END_REMOVE_COMMA>>)"
+"values(@AdminID, @PassWord)" ;
SqlCommand command = new SqlCommand(strSql,conn) ;

<<FOREACH_COLUMN>>
command.Parameters.Add("@<<COLUMN_NAME>>",<<COLUMN_DB_Type>>) ;
command.Parameters["@<<COLUMN_NAME>>"].Value = <<LF_COLUMN_NAME>>;
<<END_FOREACH_COLUMN>>

try

{
conn.Open() ;
command.ExecuteNonQuery() ;
return true ;
}
catch(Exception e)

{
throw(new Exception("Error in the Database"+e.Message)) ;
}
finally

{
conn.Close() ;
}
}

public bool Modify()

{
string strSql ="update <<TABLE_NAME>> set <<REMOVE_COMMA>><<FOREACH_COLUMN>><<COLUMN_NAME>> =

@<<COLUMN_NAME>>,<<END_FOREACH_COLUMN>><<END_REMOVE_COMMA>> "
+ " where <<REMOVE_COMMA>><<FOREACH_PKCOLUMN>><<COLUMN_NAME>> =

@<<COLUMN_NAME>>,<<END_FOREACH_PKCOLUMN>><<END_REMOVE_COMMA>>";
SqlCommand command = new SqlCommand(strSql,conn) ;
<<FOREACH_COLUMN>>
command.Parameters.Add("@<<COLUMN_NAME>>",<<COLUMN_DB_Type>>) ;
command.Parameters["@<<COLUMN_NAME>>"].Value = <<LF_COLUMN_NAME>>;
<<END_FOREACH_COLUMN>>
try

{
conn.Open() ;
command.ExecuteNonQuery() ;
return true ;
}
catch(Exception e)

{
throw(new Exception("Error in the Database"+e.Message)) ;
}
finally

{
conn.Close() ;
}
}

public bool Delete()

{
string strSql ="delete from <<TABLE_NAME>>"
+ " where <<REMOVE_COMMA>><<FOREACH_PKCOLUMN>><<COLUMN_NAME>> =

@<<COLUMN_NAME>>,<<END_FOREACH_PKCOLUMN>><<END_REMOVE_COMMA>>";
SqlCommand command = new SqlCommand(strSql,conn) ;
<<FOREACH_PKCOLUMN>>
command.Parameters.Add("@<<COLUMN_NAME>>",<<COLUMN_DB_Type>>) ;
command.Parameters["@<<COLUMN_NAME>>"].Value = <<LF_COLUMN_NAME>>;
<<END_FOREACH_PKCOLUMN>>
try

{
conn.Open() ;
command.ExecuteNonQuery() ;
return true ;
}
catch(Exception e)

{
throw(new Exception("Error in the Database"+e.Message)) ;
}
finally

{
conn.Close() ;
}
}
生成的代码如下
using System;
using System.Data;
using System.Data.SqlClient;

namespace 命名空间


{

/**//// </summary>
///注释
/// </summary>
public class AdminDB

{
private SqlConnection conn=new SqlConnection();
private SqlCommand command=new SqlCommand();

public AdminDB()

{
conn.ConnectionString=ConStrLib.GetConStr();
}

private string adminID;
public string AdminID

{
get

{
return adminID;
}
set

{
adminID= value ;
}
}

private string passWord;
public string PassWord

{
get

{
return passWord;
}
set

{
passWord= value ;
}
}


public bool Add()

{
string strSql = "insert into Admin
(AdminID,PassWord)"
+"values(@AdminID, @PassWord)" ;
SqlCommand command = new SqlCommand(strSql,conn) ;

command.Parameters.Add("@AdminID",SqlDbType.Char) ;
command.Parameters["@AdminID"].Value = adminID;
command.Parameters.Add("@PassWord",SqlDbType.VarChar) ;
command.Parameters["@PassWord"].Value = passWord;

try

{
conn.Open() ;
command.ExecuteNonQuery() ;
return true ;
}
catch(Exception e)

{
throw(new Exception("Error in the Database"+e.Message)) ;
}
finally

{
conn.Close() ;
}
}

public bool Modify()

{
string strSql ="update Admin set AdminID = @AdminID,PassWord = @PassWord "
+ " where AdminID = @AdminID";
SqlCommand command = new SqlCommand(strSql,conn) ;
command.Parameters.Add("@AdminID",SqlDbType.Char) ;
command.Parameters["@AdminID"].Value = adminID;
command.Parameters.Add("@PassWord",SqlDbType.VarChar) ;
command.Parameters["@PassWord"].Value = passWord;
try

{
conn.Open() ;
command.ExecuteNonQuery() ;
return true ;
}
catch(Exception e)

{
throw(new Exception("Error in the Database"+e.Message)) ;
}
finally

{
conn.Close() ;
}
}

public bool Delete()

{
string strSql ="delete from Admin"
+ " where AdminID = @AdminID";
SqlCommand command = new SqlCommand(strSql,conn) ;
command.Parameters.Add("@AdminID",SqlDbType.Char) ;
command.Parameters["@AdminID"].Value = adminID;
try

{
conn.Open() ;
command.ExecuteNonQuery() ;
return true ;
}
catch(Exception e)

{
throw(new Exception("Error in the Database"+e.Message)) ;
}
finally

{
conn.Close() ;
}
}
哈哈,挺不错
,现在我这个工具还在编码中,如果完成会马上通知大家,并公布代码。望多多指教。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构