电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

尝试着写自己的代码生成器


发布日期:2020/3/1
 
我主要以三层模式为基础安装昨天的代码加以修改来完成自己的通用的代码生成器由于是初学而且专业课占去了大部分的时间只是尝试的写点功能还需要来熟悉下IO下的一些类所以这里写的只是为了作为练习作为以后的复习方便而已灰常不完善慢慢改进通过学习代码生成器和三层模式的结构如果我要在这两者学习间找到着力点重点是在三层模式不过基本还是要依托于对ADONET实现机制的熟悉程度如果熟悉了这两者代码生成器完全是数据拼接字符串的操作没有了技术含量

现在的专业的代码生成器很多作为新手就因该从基础学习而不是直接使用CodeSmith动软这样的企业用的代码生成器不要心急从本质上了解他是怎么一回事由于时间关系今天暂时粘贴一部分代码等我写完了在总结一下

开篇先说一下就是要明白我在下面代码中的对系统数据库视图的运用你会发现一切都很简单亲爱的同学们加油普通的应用开发不是搞科研所以没有什么不能学只要花时间就行不要崇拜谁一切都是要自己争取的

代码不是最重要的重要的是思想新手看见的不应该是控件窗体而是一个个的类对象……

好了下面就贴一下代码剩下的很简单了这两天会补全 里面的两个MessageBox只是为了测试方便没有意义

using System;

using SystemCollectionsGeneric;

using SystemComponentModel;

using SystemData;

using SystemDrawing;

using SystemText;

using SystemWindowsForms;

using SystemDataSqlClient;

namespace 代码生成器

{

public partial class Form : Form

{

public Form()

{

InitializeComponent()

}

public DataTable ExecuteDataTable(string sql params SqlParameter[] paramers)

{

using (SqlConnection con = new SqlConnection(tb_ConstrText))

{

conOpen()

using (SqlCommand cmd = conCreateCommand())

{

cmdCommandText = sql;

cmdParametersAddRange(paramers)

DataTable dt = new DataTable()

SqlDataAdapter adapter = new SqlDataAdapter(cmd)

adapterFill(dt)

return dt;

}

}

}

/// <summary>

/// 数据库字段类型转换为C#字符类型

/// </summary>

/// <param name=dataType>数据库中的字段类型</param>

/// <returns>C#中的字段类型</returns>

public static string StrToCsharp(string dataType)

{

switch (dataType)

{

caseint:

return int;

casenvarchar:

case varchar:

case char:

case nchar:

return string;

case bit:

return bool;

case datetime:

return DateTime;

default :

return object;

}

}

/// <summary>

/// 获取连接数据库的表名

/// </summary>

/// <param name=sender></param>

/// <param name=e></param>

private void btn_Bulider_Click(object sender EventArgs e)

{

DataTable Table =ExecuteDataTable(SELECT TABLE_NAME FROM INFORMATION_SCHEMATABLES

foreach (DataRow row in TableRows)

{

string TableName=row[]ToString()

clb_TableNameItemsAdd(TableName)

}

}

/// <summary>

/// 代码生成按钮

/// </summary>

private void btn_Bulider_Click_(object sender EventArgs e)

{

//被选中的表

foreach (string TableName in clb_TableNameCheckedItems)

{

CreateModel(TableName)

CreateDAL(TableName)

}

}

private void CreateDAL(string TableName)

{

//暂时假设主键名就是id

DataTable dt_column = ExecuteDataTable(select * from INFORMATION_SCHEMACOLUMNS where TABLE_NAME=@tablename and Column_Name<>id new SqlParameter(tablename TableName))

string[] ColumnNames=new string[dt_columnRowsCount];//保存所属表中的字段名

for(int i=;i<dt_columnRowsCount;i++)

{

string colname=(string)dt_columnRows[i][COLUMN_NAME];//获得列名

ColumnNames[i]=colname;//将循环获取的列名加入列名数组

}

string[] paramers = new string[dt_columnRowsCount];

for(int i=;i<paramersLength;i++)

{

paramers[i]=@+ColumnNames[i];

}

StringBuilder sb = new StringBuilder()

sbAppendLine(//添加操作

sbAppendLine( partial Class + TableName + DAL

sbAppendLine({

sbAppendLine(public static int AddNew( + TableName + model//返回新添加字段的主键

sbAppendLine({

sbAppendLine(object obj= SQLHelperExecuteScalar(

sbAppendLine(\insert into +TableName++stringJoin(ColumnNames)+) output insertedid values(+stringJoin(paramers)+)\

foreach (string colname in ColumnNames)

{

sbAppendLine(new SqlParameter(\+colname+\model+colname+

}

sbAppendLine(

sbAppendLine(return ConvertToInt(obj)

MessageBoxShow(sbToString())

}

/// <summary>

/// 生成Model

/// </summary>

/// <param name=TableName>被选中的表名</param>

/// <returns>model模型</returns>

private void CreateModel(string TableName)

{

DataTable dt_column = ExecuteDataTable(select * from INFORMATION_SCHEMACOLUMNS where TABLE_NAME=@tablename and Column_Name<>id new SqlParameter(tablename TableName))

StringBuilder sb = new StringBuilder()

sbAppendLine(Class + TableName)

sbAppendLine({

foreach (DataRow row in dt_columnRows)

{

string dt_Col = (string)row[COLUMN_NAME];

string col_Type = (string)row[DATA_TYPE];

string CsType = StrToCsharp(col_Type)

sbAppendLine(Public + CsType + + dt_Col + {get;set;}

}

sbAppendLine(}

//MessageBoxShow(sbToString())

}

}

}

上一篇:关注性能:字符串操作

下一篇:新手必看关于WCF协定概念总结