(1)创建您自己的解决方案 文件夹结构如以下:

(2)编写代码:

(要使用数据库 建议创建随意数据库就可以)

创建配置文件App.config代码例如以下:

<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="connstr" connectionString="Data Source=.; Initial Catalog=HRMSYSDB;User ID=hrmsa;Password=你的数据库密码"/>
</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{  下边的内容就可以</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())
{
//仅仅获得表的架构信息(列信息)
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("连接数据库出错!错误消息:" + 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
} //为例避免每次都输入链接数据库字符串 将保存的代码封装到函数中
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)
{
//在每次载入的时候都要载入 保存在目录内的 连接字符串
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的结束 //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结束 sb.AppendLine("}");
txtDALCode.Text = sb.ToString();
} //以数组形式返回列名
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;
} //以数组形式返回@列名
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

假设导入数据库mdf不熟悉的请參考:

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

版权声明:本文博主原创文章,博客,未经同意不得转载。

我已经写了DAL层的代码生成器的更多相关文章

  1. [置顶] 自己写代码生成器之生成Dal层代码(获取数据库所有表名称)

    自己写代码生成器之生成Dal层代码(获取数据库所有表名称) --得到数据库birthday所有表名称 select name from sysobjects where [type]='U' --se ...

  2. ASP.NET MVC5+EF6+EasyUI 后台管理系统(58)-DAL层重构

    系列目录 前言:这是对本文系统一次重要的革新,很久就想要重构数据访问层了,数据访问层重复代码太多.主要集中增删该查每个模块都有,所以本次是为封装相同接口方法 如果你想了解怎么重构普通的接口DAL层请查 ...

  3. MyFramework框架搭建(一)DAL层

    一直以来有一个想法,搭建一个属于自己的框架,将自己学到的东西整合到框架里,不断的完善,让它随着我的成长而成长,下面介绍我第一阶段的总结:DAL层搭建 一.基础配置 1.我用的是Ibatis.net框架 ...

  4. asp.net mvc 简单项目框架的搭建过程(一)对Bll层和Dal层进行充分解耦

    学习asp.net 已经有近三个月的时间了,在asp.net mvc上花的时间最多,但个人真是有些菜,不得不说,asp.net mvc的水真的还是蛮深的.目前在公司实习,也见过公司几个项目的代码了.对 ...

  5. 使用抽象工厂反射获取不到Dal层对象,未能加载文件或程序集......

    Put aside the fog and see the essence 解决问题之前,要明白问题为什么会出现 我相信能点开这篇帖子的人,都是具有探索精神的人,因为,只有心存疑问才会搜索 如果只想单 ...

  6. [EF] - 作为DAL层遇到的问题

    今天在部署一个经典三层的项目的时候,用到了EntityFramework,碰到几个问题: 在用EntityFramework将数据库导入到DAL层后,在BL层引用该DAL后,在测试项目的时候,想要查询 ...

  7. 动态创建DAL层类的实例

    为了可扩展性,方便以后对于代码的修改维护,使用动态创建DAL层对象. 1.首先在webconfig中的configuration下添加配置项 <appSettings> <add k ...

  8. 数据库中int类型存在空数据开发过程中model和dal层处理方法

    model层 public Int32? IsFullAttendance { get; set; } dal层  if (dr["IsFullAttendance"] + &qu ...

  9. MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

随机推荐

  1. Qt的焦点策略

    Qt的窗口部件在图形用户界面中按用户的习惯的方式来处理键盘焦点.基本出发点是用户的击键能定向到屏幕上窗口中的任何一个,和在窗口中任何一个部件中.当用户按下一个键,他们期望键盘焦点能够到达正确的位置,并 ...

  2. Linux下的lds链接脚本简介(四)

    十一. 表达式 lds中表达式的文法与C语言的表达式文法一致,表达式的值都是整型,如果ld的运行主机和生成文件的目标机都是32位,则表达式是32位数据,否则是64位数据. 以下是一些常用的表达式: _ ...

  3. POJ 2983 Is the Information Reliable? 依旧差分约束

    http://poj.org/problem?id=2983 题目大意: 星际大战开始了.你购买了情报,需要判断它的准确性.已知地方的根据地在由南向北排成一条直线.P A B X,表示A在B北面距离X ...

  4. LA 2678 – Subsequence

    看到限时3S,自己写了一个二重循环的,然后华丽的 TLE...T T 瞄了瞄书上,作者的思路果然是很好.膜拜中. 他只枚举了终点,然后用二分查找. 用到了lower_bound函数,这个lower_b ...

  5. <转> Intel VTune分析结果中的名词释译

    原文转自http://blog.chinaunix.net/uid-26000296-id-3369740.html Elapsed Time(执行耗时): the total time your t ...

  6. UVA 11728 - Alternate Task (数论)

    Uva 11728 - Alternate Task 题目链接 题意:给定一个因子和.求出相应是哪个数字 思路:数字不可能大于因子和,对于每一个数字去算出因子和,然后记录下来就可以 代码: #incl ...

  7. 6、USB Video Class Specification

    关于USB Class 将设备归为既定的类别,并对相应类别的设备的在USB协议的应用级协议和接口作出规范,这样只要按照类设备的标准实现驱动程序和设备,则一套驱动可以驱动这一类的所有设备,而这一类设备可 ...

  8. ANSCII码和BCD码互转

    bool AtoBCD(unsigned char* Asc,unsigned char* BCD,int len) { int i; unsigned char ch; //高位 unsigned ...

  9. 【u237】分数化小数

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 写一个程序,输入一个形如N/D的分数(N是分子,D是分母),输出它的小数形式.如果小数有循环节的话,把 ...

  10. POJ 3628 Bookshelf 2 (01背包)

    Bookshelf 2 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7496   Accepted: 3451 Descr ...