多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > 互聯(lián)網(wǎng) > 自己編寫的DAL三層代碼生成器

自己編寫的DAL三層代碼生成器

來源:程序員人生   發(fā)布時間:2014-09-13 08:00:00 閱讀次數(shù):3066次

(1)創(chuàng)建自己的解決方案 目錄結(jié)構(gòu)如下:


(2)編寫代碼:

(要使用數(shù)據(jù)庫 建議創(chuàng)建任意數(shù)據(jù)庫即可)

創(chuàng)建配置文件App.config代碼如下:

<?xml version="1.0"?> <configuration> <connectionStrings> <add name="connstr" connectionString="Data Source=.; Initial Catalog=HRMSYSDB;User ID=hrmsa;Password=你的數(shù)據(jù)庫密碼"/> </connectionStrings> <appSettings> <add key="passwordSalt" value="love?P3@9"/> <add key="aaa" value="333"/> </appSettings> </configuration>
MainWindow.xaml代碼如下:(在MainWindow.xaml下把Grid里邊的代碼換一下就好了)

<Grid> <TextBox Height="23" HorizontalAlignment="Left" Margin="16,7,0,0" Name="txtConnStr" VerticalAlignment="Top" Width="542" /> <Button Content="連接" Height="23" HorizontalAlignment="Left" Margin="564,7,0,0" Name="btnConnect" VerticalAlignment="Top" Width="41" Click="btnConnect_Click" /> <ComboBox Height="23" HorizontalAlignment="Left" Margin="16,36,0,0" Name="cmbTables" VerticalAlignment="Top" Width="210" IsEnabled="False" /> <Button Content="生成代碼" Height="23" HorizontalAlignment="Left" Margin="244,36,0,0" Name="btnGenerateCode" VerticalAlignment="Top" Width="75" IsEnabled="False" Click="btnGenerateCode_Click" /> <TextBox TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Height="483" HorizontalAlignment="Left" Margin="16,66,0,0" Name="txtModelCode" VerticalAlignment="Top" Width="342" IsReadOnly="True" /> <TextBox TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Height="483" HorizontalAlignment="Left" Margin="372,66,0,0" Name="txtDALCode" VerticalAlignment="Top" Width="494" IsReadOnly="True" /> </Grid>

MainWindow.xaml.cs代碼如下:

namespace MyCodeGen //這里要把命名空間改成自己的 也就是自己生成的 只需粘貼<span style="font-family: Arial, Helvetica, sans-serif;">public partial class MainWindow : Window{ 下邊的內(nèi)容即可</span> { /// <summary> /// MainWindow.xaml 的交互邏輯 /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private DataTable ExecuteDataTable(string sql) { using (SqlConnection conn = new SqlConnection(txtConnStr.Text)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { //只獲得表的架構(gòu)信息(列信息) cmd.CommandText = sql; DataSet ds = new DataSet(); SqlDataAdapter adapter = new SqlDataAdapter(cmd); adapter.FillSchema(ds, SchemaType.Source);//獲得表信息必須要寫 adapter.Fill(ds); return ds.Tables[0]; } } } private void btnConnect_Click(object sender, RoutedEventArgs e) { DataTable table; try { table = ExecuteDataTable(@"SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'"); } catch (SqlException sqlex) { MessageBox.Show("連接數(shù)據(jù)庫出錯!錯誤消息:" + sqlex.Message); return; } string[] tables = new string[table.Rows.Count]; for (int i = 0; i < table.Rows.Count; i++) { DataRow row = table.Rows[i]; tables[i] = (string)row["TABLE_NAME"]; } cmbTables.ItemsSource = tables; cmbTables.IsEnabled = true; btnGenerateCode.IsEnabled = true; //把連接字符串記錄到文件中,避免用戶每次都需要輸入連接字符串 //將連接字符串保存起來 string configFile = GetConfigFilePath(); File.WriteAllText(configFile, txtConnStr.Text); //除非真的有捕獲異常的需要,否則不要try...catch } //為例避免每次都輸入鏈接數(shù)據(jù)庫字符串 將保存的代碼封裝到函數(shù)中 private static string GetConfigFilePath() { string currenctDir = AppDomain.CurrentDomain.BaseDirectory; string configFile = System.IO.Path.Combine(currenctDir, "connstr.txt"); return configFile; } private void Window_Loaded(object sender, RoutedEventArgs e) { //在每次加載的時候都要加載 保存在文件夾內(nèi)的 連接字符串 string configFile = GetConfigFilePath(); txtConnStr.Text = File.ReadAllText(configFile); } private void btnGenerateCode_Click(object sender, RoutedEventArgs e) { string tablename = (string)cmbTables.SelectedItem; if (tablename == null) { MessageBox.Show("請選擇要生成的表"); return; } CreateModelCode(tablename); CreateDALCode(tablename); } private void CreateModelCode(string tablename) { DataTable table = ExecuteDataTable("select top 0 * from " + tablename); //在大量的字符串拼接的時候使用stringbuilder() StringBuilder sb = new StringBuilder(); sb.Append("public class ").AppendLine(tablename).AppendLine("{"); foreach (DataColumn column in table.Columns) { string columnDataType = GetDataTypeName(column); //判斷類型是否可空 sb.Append(" ").Append("public ").Append(columnDataType).Append(" ") .Append(column.ColumnName).AppendLine("{get;set;}"); } sb.AppendLine("}"); txtModelCode.Text = sb.ToString(); } //進行可空類型的處理 private static string GetDataTypeName(DataColumn column) { //如果列允許為null,并且列在C#中的類型是不可為空的(值類型ValueType) if (column.AllowDBNull && column.DataType.IsValueType) { return column.DataType + "?"; } else { return column.DataType.ToString(); } } //下邊是生成DALcode部分 private void CreateDALCode(string tablename) { DataTable table = ExecuteDataTable("select top 0 * from " + tablename); StringBuilder sb = new StringBuilder(); sb.Append("public class ").Append(tablename).AppendLine("DAL").AppendLine("{"); //tomodel開始 sb.Append(" ").Append("private ").Append(tablename) .AppendLine(" ToModel(DataRow row)").Append(" ").AppendLine("{"); sb.Append(" ").Append(tablename).AppendLine(" model = new " + tablename + "();"); foreach (DataColumn column in table.Columns) { //無論列是否允許為空,都進行判斷DbNull的處理(省事) //model.Id = (Guid)SqlHelper.FromDbValue(row["Id"]); sb.Append(" ").Append("model.").Append(column.ColumnName).Append("=(") .Append(GetDataTypeName(column)).Append(")SqlHelper.FromDbValue(row["") .Append(column.ColumnName).AppendLine(""]);"); } sb.Append(" ").AppendLine("return model;"); sb.AppendLine("}"); //tomodel的結(jié)束 //listall開始 sb.Append("public IEnumerable<").Append(table) .AppendLine("> ListAll()").AppendLine("{"); sb.Append(" ").Append("List<").Append(tablename).Append("> list=new List<") .Append(tablename).AppendLine(">();"); sb.Append("DataTable dt = SqlHelper.ExecuteDataTable("") .Append("select * from " + tablename).AppendLine("");"); sb.AppendLine("foreach (DataRow row in dt.Rows)"); sb.Append(tablename).AppendLine(" model=ToModel(row);"); sb.AppendLine("list.Add(model);}"); sb.AppendLine("}"); //生成器要求列名必須是Id,類型必須是Guid //Insert開始 //public void Insert(Operator op) sb.Append("public void Insert(") .Append(tablename).AppendLine(" model){"); //SqlHelper.ExecuteNonQuery(@"insert into T_Operator( sb.Append("SqlHelper.ExecuteNonQuery(@"") .Append("insert into ").Append(tablename).AppendLine("("); string[] colNames = GetColumnNames(table); sb.AppendLine(string.Join(",", colNames)); string[] colParamNames = GetParamColumnNames(table); sb.Append("values(").AppendLine(string.Join(",", colParamNames)); sb.AppendLine("}"); //Insert結(jié)束 sb.AppendLine("}"); txtDALCode.Text = sb.ToString(); } //以數(shù)組形式返回列名 private static string[] GetColumnNames(DataTable table) { string[] colnames = new string[table.Columns.Count]; for (int i = 0; i < table.Columns.Count; i++) { DataColumn dataCol = table.Columns[i]; colnames[i] = dataCol.ColumnName; } return colnames; } //以數(shù)組形式返回@列名 private static string[] GetParamColumnNames(DataTable table) { string[] colnames = new string[table.Columns.Count]; for (int i = 0; i < table.Columns.Count; i++) { DataColumn dataCol = table.Columns[i]; colnames[i] = "@" + dataCol.ColumnName; } return colnames; } } }

SqlHelper.cs代碼如下:(命名空間里邊的代碼)

namespace MyCodeGen { static class SqlHelper { //app.config文件的繼承: public static readonly string connstr = ConfigurationManager.ConnectionStrings["connstr"].ConnectionString; //別忘了添加引用 System.configuration 然后在解析到 步驟:右鍵點擊引用--添加引用--.NET--找到System.configuration 確定即可 public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters) { using (SqlConnection conn = new SqlConnection(connstr)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; cmd.Parameters.AddRange(parameters); return cmd.ExecuteNonQuery(); } } } public static object ExecuteScalar(string sql, params SqlParameter[] parameters) { using (SqlConnection conn = new SqlConnection(connstr)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; cmd.Parameters.AddRange(parameters); return cmd.ExecuteScalar(); } } } public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters) { using (SqlConnection conn = new SqlConnection(connstr)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = sql; cmd.Parameters.AddRange(parameters); DataSet dataset = new DataSet(); SqlDataAdapter adapter = new SqlDataAdapter(cmd); adapter.Fill(dataset); return dataset.Tables[0]; } } } public static object FromDbValue(object value) { if (value == DBNull.Value) { return null; } else { return value; } } public static object ToDbValue(object value) { if (value == null) { return DBNull.Value; } else { return value; } } } }



好了 全部代碼都好了!點擊運行效果如下:



另外需要完整項目的請點擊:

http://download.csdn.net/detail/u010870518/7837691


如果導(dǎo)入數(shù)據(jù)庫mdf不熟悉的請參考:

http://blog.csdn.net/xlgen157387/article/details/38844315


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产女乱淫真高清免费视频 | 在线 成人| 亚洲成人黄色在线观看 | 国产成人精品久久综合 | 视频一区二区三区自拍 | 国产一区二区免费视频 | 亚洲成aⅴ人在线观看 | 波多野结衣在线观看3人 | 91在线一区二区 | 看黄色的网址 | 性猛交xxxx乱大交孕妇 | 亚洲a在线观看 | 久久久久久综合 | 亚洲午夜久久影院 | 欧美成人性色大片在线观看 | 亚洲最大黄色 | 国产精品v欧美精品v日韩精品 | 毛片毛片毛是个毛毛片 | 亚洲jizzjizz在线播放久 | 国产成人亚洲精品影院 | 国产精品一区二区国产 | 精品久久一区二区三区 | 熟妇毛片 | 国产啪精品视频网免费 | 日韩欧美视频在线一区二区 | 中文字幕之中文字幕 | 现代激情校园春色 | 男人午夜小视频 | 成人精品一区二区久久 | 久久一区二区三区四区 | 免费永久国产在线视频 | 2020在线不卡观看视频 | 久草精品视频在线观看 | 亚洲国产最新 | 91九色最新地址 | 欧美区一区二区三 | 欧美freesex呦交6_10 | 欧美一级在线观看播放 | 亚洲欧洲日产国码二区首页 | 欧美成人 一区二区三区 | 日产精品久久久一区二区 |