---恢復內(nèi)容開始---
代碼生成器的原理很簡單,就是通過讀取數(shù)據(jù)庫的表結(jié)構(gòu),根據(jù)讀取到的數(shù)據(jù)組合成代碼,一個最基礎(chǔ)的代碼生成器有以下幾點
一 生成器界面,我用的是winform,界面如圖
第一行是數(shù)據(jù)庫鏈接字符串,點擊右邊的測試連接,就可以測試數(shù)據(jù)庫鏈接字符串是否正確。
如果測試鏈接成功后,自動抓取數(shù)據(jù)庫的所有表,將表名抓取到表名的下拉框中,表名的下拉框也變成可編輯的,右側(cè)的主鍵的下拉框,也會默認抓取左側(cè)表的主鍵。
點擊【生成代碼】按鈕,生成代碼到下面的文本框中
點擊【生成文件】按鈕,生成代碼到對應的cs文件下,文件路徑為保存路徑加表名
二 代碼解釋
1.抓取數(shù)據(jù)庫中所有的表,核心代碼如下:
//獲得數(shù)據(jù)庫所有表名string sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'";dt = ResultDataTable(sql);//表名 string[] tables = new string[dt.Rows.Count]; for (int i = 0; i < dt.Rows.Count; i++){ DataRow row = dt.Rows[i]; tables[i] = (string)row["TABLE_NAME"];}//把表名放在下拉框中cmbTables.DataSource = tables;cmbTables.SelectedIndex = 0;
ResultDataTable方法如下:
public DataTable ResultDataTable(string sql, params SqlParameter[] parameters) { using (SqlConnection connstr = new SqlConnection(txtConnStr.Text)) { //打開數(shù)據(jù)庫連接 connstr.Open(); using (SqlCommand command = connstr.CreateCommand()) { command.CommandText = sql; command.Parameters.AddRange(parameters); SqlDataAdapter sda = new SqlDataAdapter(command); DataSet ds = new DataSet(); //獲取表中的全部信息(如填充每個表中的主鍵和外鍵等) sda.FillSchema(ds, SchemaType.Source); sda.Fill(ds); return ds.Tables[0]; } } }
2.生成代碼到文本框中,先通過表名獲取表的所有列,然后根據(jù)所有的列生成代碼
//獲取表名string tableName = cmbTables.SelectedValue.ToString();//獲取字段名DataColumnCollection columns = Returncolumns(tableName);//將生成的代碼填入文本框中txtCode.Text = CreateModelCode(columns);
根據(jù)表名返回表中所有列名的方法Returncolumns
/// <summary>/// 返回數(shù)據(jù)表列名/// </summary>/// <param name="tablename">表名</param>/// <returns></returns>public DataColumnCollection Returncolumns(string tablename){DataTable datatable = ResultDataTable("select top 0 * from " + tablename);DataColumnCollection columns = datatable.Columns;return columns;}
根據(jù)列名生成代碼的方法CreateModelCode()。這個方法是生成的實體類,因為生成實體類最簡單,所以用這個做例子。。。
/// <summary>/// 生成Model代碼/// </summary>/// <param name="columns"></param>public string CreateModelCode(DataColumnCollection columns){StringBuilder sb = new StringBuilder();sb.Append("public class ").AppendLine(cmbTables.SelectedValue.ToString()).AppendLine("{");foreach (DataColumn column in columns){sb.Append(" public ").Append(ColumnType(column)).Append(" ");//例如 public string sb.Append(column.ColumnName); //例如 public string Idsb.AppendLine(" { get; set; }");//例如 public string Id { get; set;}}sb.Append("}");return sb.ToString();}
3.生成代碼到CS文件中,實現(xiàn)方式跟輸入到文本框中是一樣的,只不過最后一步是生成一個新的文件,主要代碼:
//判斷文件目錄是否存在string directory = txtDir.Text.Trim();if (string.IsNullOrWhiteSpace(directory)){MessageBox.Show("請輸入文件地址");return;}if (!Directory.Exists(directory)){MessageBox.Show("路徑不對,請重新輸入");}string tableName = cmbTables.SelectedValue.ToString();DataColumnCollection columns = Returncolumns(tableName);string fileName = tableName + ".cs";string filePath = directory + "//" + fileName;string fileStr = CreateModelCode(columns);try{MyCommonTools.WriteToFile(filePath, fileStr, true);MessageBox.Show("生成成功");}catch (Exception exception){MessageBox.Show("生成代碼出錯");throw exception;}
WriteToFile()方法代碼在下面:
/// <summary>/// 將字符串寫入到文件中/// </summary>/// <param name="filePath">文件的實際路徑</param>/// <param name="content">內(nèi)容</param>/// <param name="isCover">是否覆蓋,true就是重新寫一遍,false就是往里面添加內(nèi)容</param>public static void WriteToFile(string filePath, string content, bool isCover){ FileStream fs = null; try { if (!isCover && System.IO.File.Exists(filePath)) { fs = new FileStream(filePath, FileMode.Append, Fileaccess.Write); StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); sw.WriteLine(content); sw.Flush(); sw.Close(); } else { System.IO.File.WriteAllText(filePath, content, Encoding.UTF8); } } finally { if (fs != null) { fs.Close(); } }
}
代碼:http://files.VEVb.com/files/qigemingzihaonan/CodeBuilder.rar
這是一個最基礎(chǔ)的例子,僅僅能提供一種思路,然后這個例子也是參考了別人的文章,地址在這里:
http://www.survivalescaperooms.com/lishun1005/p/4069223.html?utm_source=tuicool
新聞熱點
疑難解答