我主要以三層模式為基礎
安裝昨天的代碼加以修改
來完成自己的通用的代碼生成器
由於是初學而且專業課占去了大部分的時間
只是嘗試的寫點功能
還需要來熟悉下IO下的一些類
所以這裡寫的只是為了作為練習作為以後的復習方便而已
灰常不完善
慢慢改進
通過學習代碼生成器和三層模式的結構
如果我要在這兩者學習間找到著力點
重點是在三層模式
不過基本還是要依托於對ADO
NET實現機制的熟悉程度
如果熟悉了這兩者
代碼生成器完全是數據拼接字符串的操作
沒有了技術含量
現在的專業的代碼生成器很多
作為新手就因該從基礎學習
而不是直接使用CodeSmith
動軟這樣的企業用的代碼生成器
不要心急
從本質上了解他是怎麼一回事
由於時間關系今天暫時粘貼一部分代碼
等我寫完了
在總結一下
開篇先說一下
就是要明白我在下面代碼中的對系統數據庫視圖的運用
你會發現一切都很簡單
親愛的同學們
加油
普通的應用開發不是搞科研
所以沒有什麼不能學
只要花時間就行
不要崇拜誰
一切都是要自己爭取的
代碼不是最重要的
重要的是思想
新手看見的不應該是控件
窗體
而是一個個的類
對象……
好了
下面就貼一下代碼
剩下的很簡單了
這兩天會補全
裡面的兩個MessageBox只是為了測試方便
沒有意義
using System;
using System
Collections
Generic;
using System
ComponentModel;
using System
Data;
using System
Drawing;
using System
Text;
using System
Windows
Forms;
using System
Data
SqlClient;
namespace 代碼生成器
{
public partial class Form
: Form
{
public Form
()
{
InitializeComponent()
}
public DataTable ExecuteDataTable(string sql
params SqlParameter[] paramers)
{
using (SqlConnection con = new SqlConnection(tb_Constr
Text))
{
con
Open()
using (SqlCommand cmd = con
CreateCommand())
{
cmd
CommandText = sql;
cmd
Parameters
AddRange(paramers)
DataTable dt = new DataTable()
SqlDataAdapter adapter = new SqlDataAdapter(cmd)
adapter
Fill(dt)
return dt;
}
}
}
/// <summary>
/// 數據庫字段類型轉換為C#字符類型
/// </summary>
/// <param name=
dataType
>數據庫中的字段類型</param>
/// <returns>C#中的字段類型</returns>
public static string StrToCsharp(string dataType)
{
switch (dataType)
{
case
int
:
return
int
;
case
nvarchar
:
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_SCHEMA
TABLES
)
foreach (DataRow row in Table
Rows)
{
string TableName=row[
]
ToString()
clb_TableName
Items
Add(TableName)
}
}
/// <summary>
/// 代碼生成按鈕
/// </summary>
private void btn_Bulider_Click_
(object sender
EventArgs e)
{
//被選中的表
foreach (string TableName in clb_TableName
CheckedItems)
{
CreateModel(TableName)
CreateDAL(TableName)
}
}
private void CreateDAL(string TableName)
{
//暫時假設主鍵名就是id
DataTable dt_column = ExecuteDataTable(
select * from INFORMATION_SCHEMA
COLUMNS where TABLE_NAME=@tablename and Column_Name<>
id
new SqlParameter(
tablename
TableName))
string[] ColumnNames=new string[dt_column
Rows
Count];//保存所屬表中的字段名
for(int i=
;i<dt_column
Rows
Count;i++)
{
string colname=(string)dt_column
Rows[i][
COLUMN_NAME
];//獲得列名
ColumnNames[i]=colname;//將循環獲取的列名加入列名數組
}
string[] paramers = new string[dt_column
Rows
Count];
for(int i=
;i<paramers
Length;i++)
{
paramers[i]=
@
+ColumnNames[i];
}
StringBuilder sb = new StringBuilder()
sb
AppendLine(
//添加操作
)
sb
AppendLine(
partial Class
+ TableName +
DAL
)
sb
AppendLine(
{
)
sb
AppendLine(
public static int AddNew(
+ TableName +
model
)
//返回新添加字段的主鍵
)
sb
AppendLine(
{
)
sb
AppendLine(
object obj= SQLHelper
ExecuteScalar(
)
sb
AppendLine(
\
insert into
+TableName+
(
+string
Join(
ColumnNames)+
) output inserted
id values(
+string
Join(
paramers)+
)\
)
foreach (string colname in ColumnNames)
{
sb
AppendLine(
new SqlParameter(\
+colname+
\
model
+colname+
)
)
}
sb
AppendLine(
)
)
sb
AppendLine(
return Convert
ToInt
(obj)
)
MessageBox
Show(sb
ToString())
}
/// <summary>
/// 生成Model
/// </summary>
/// <param name=
TableName
>被選中的表名</param>
/// <returns>model模型</returns>
private void CreateModel(string TableName)
{
DataTable dt_column = ExecuteDataTable(
select * from INFORMATION_SCHEMA
COLUMNS where TABLE_NAME=@tablename and Column_Name<>
id
new SqlParameter(
tablename
TableName))
StringBuilder sb = new StringBuilder()
sb
AppendLine(
Class
+ TableName)
sb
AppendLine(
{
)
foreach (DataRow row in dt_column
Rows)
{
string dt_Col = (string)row[
COLUMN_NAME
];
string col_Type = (string)row[
DATA_TYPE
];
string CsType = StrToCsharp(col_Type)
sb
AppendLine(
Public
+ CsType +
+ dt_Col +
{get;set;}
)
}
sb
AppendLine(
}
)
//MessageBox
Show(sb
ToString())
}
}
}
From:http://tw.wingwit.com/Article/program/net/201311/13667.html