做.NET开发的同学都知道,有时候总会重复地写着重复对数据库操作的增、删、改、查代码,不同的只是针对不同的表、不同的字段编码而已,尽管有自动代码生成软件,但有时仍需批量修改代码,为了减少重复的编码,自己就开发一套数据库辅助类库,无需重复编写增、删、改、查的代码,其它就不啰嗦,直接进入主题,个人和思维水平有限,如有误导或者错误之处,还请各位大侠指正。
功能特色:
- 自动生成辅助代码
- 无需重复编写查询、插入、更新、删除功能代码(只需实例化DbTable类即可实现)
- 支持Sql拼接模式或者SqlParameter模式。
- 强大的事务支持!事务支持暂停、继续
- 内置支持分页函数
- 万能实体DataModel,支持任何数据的存取操作
- 数据库操作类DbHelper,服务完成编写复杂Sql语句
- 更多特性等待您的体验。
具体实例(数据库增、删、改、查):
假如有如下数据库表(如下图),此次主要对其进行增、删、改、查功能
首先,引用类库:Ling.Dber.dll(类库和代码在文章末尾下载)。
其次,对类库进行初始化配置(此步非必须项,可以省略,具体情况视项目而定)。
新建Global.asax文件,在其Application_Start(object sender, EventArgs e) 事件初始化配置,代码如下:
void Application_Start(object sender, EventArgs e) { //在应用程序启动时运行的代码 /// 第一种方法,直接创建配置文件实例并赋值 Ling.Dber.Initialize.Configure(new Ling.Dber.Config() { //连接字符串 ConnectionString = "user id=sa;password=foolin;initial catalog=LingDber;data source=(local);Connect Timeout=30;", //是否使用参数模式 SqlParameterMode = true, //表结构信息缓存时间,只对SqlParameterMode=true有效,单位为分钟 TableSchemeCacheTime = 60 * 24 }); /* /// 第二种方法,传入配置文件的路径 Ling.Dber.Initialize.Configure(AppDomain.CurrentDomain.BaseDirectory + "Ling.Dber.config"); /// 第三种方法,初始化配置文件: /// 配置文件路径1:把Ling.Dber.config文件放到站点的根目录。 /// 配置文件路径2:在web.config的appSettings下面新增一个配置节点“LingDberConfigFile”,value是指向配置文件的路径. /// 配置文件路径2:直接复制所有配置节点到web.config的appSettings节点下面。 Ling.Dber.Initialize.Configure(); */ }
再次,只需简单实例化数据库实例即可,代码如下:
/// <summary> /// 数据库操作实例 /// </summary> public Ling.Dber.DbTable Db = Ling.Dber.DbTable.Table("T_User");
完整类代码如下(备注:此代码可用Ling.Dber.BuilderCreateCode()方法自动生成):
/// <summary> ///UserLogic 的摘要说明 /// </summary> public class UserLogic { /// <summary> /// 数据库操作实例 /// </summary> public Ling.Dber.DbTable Db = Ling.Dber.DbTable.Table("T_User"); ////数据库实例二:如果不使用默认数据库连接或者没有对类库进行初始化,可使用如下操作进行实例化 //const string connectionString = "user id=sa;password=foolin;initial catalog=LingDber;data source=(local);Connect Timeout=30;"; //public Ling.Dber.DbTable Db = Ling.Dber.DbTable.Table(connectionString, "T_User"); public UserLogic() { // //TODO: 在此处添加构造函数逻辑 // } // //TODO: 在此处添加其它复杂的语句和代码逻辑 // 数据库操作可使用Ling.Dber.DbHelper类 // }
1.添加记录(INSERT):
UserLogic userLogic = new UserLogic(); //初始化数据 DataModel data = new DataModel(); data["Name"] = "Foolin"; data["Sex"] = 1; //1=男,0=女 data["Age"] = 25; data["Money"] = 100; data["CreateTime"] = DateTime.Now; //插入数据库 int id = userLogic.Db.Add(data); this.Alert("创建成功!");
无需编写任何sql语句即可插入数据库,方便吧?
2.更新记录(UPDATE):
UserLogic userLogic = new UserLogic(); DataModel data = new DataModel(); data["Name"] = "刘付灵"; data["Sex"] = 1; data["Age"] = 26; data["Money"] = 200; //data["CreateTime"] = DateTime.Now; //更新字段,此处注意,防止误操作,如果没有Where条件,则不会进行任何操作 int count = userLogic.Db.Where("UserID=1").Update(data); //如果要更新全部记录,则如下: //int count = userLogic.Db.Update(data, true); if (count > 0) { this.Alert("更新成功!共更新" + count + "条记录!"); }
无需编写任何数据库代码即可实现更新,爽么?
3.查询(SELECT):
/************* 示例二:************************/ /* * 简单实例 * UserLogic demo = new UserLogic(); * DataTable = demo.Db.Select(xxxa,xxxb,xxxc).Where(xxx=xxx).OrderBy(xxx ASC,xxx DESC).DataTable(); * */ UserLogic userLogic = new UserLogic(); //Select():选择字段 //Top(50):选择50条 即SELECT TOP 50 //Where():条件 //OrderBy():排序 //DataTable:返回DataTable DataTable dtList = userLogic.Db.Top(50).DataTable(); if (dtList != null) { repModelList.DataSource = dtList ; repModelList.DataBind(); }
看了查询是不是有点像Sql语句查询?没错,为了大家无需努力学习新的语法什么的,做成类似查询的方法可以让大家更加容易上手。
如果查询单条记录呢?咱们来查查单条记录示例:
UserLogic userLogic = new UserLogic(); //创建SqlParameter参数@ID:这样比Sql拼接的更安全,其中id变量可以是Request["ID"]的赋值, DataModel sqlParam = new DataModel(); sqlParam["ID"] = id; //查找记录 DataModel model = userLogic.Db.Where("UserID=@ID", sqlParam).Find(); if (model == null) { this.Alert("该项找不到!"); return; } tbName.Text = model.GetString("Name"); tbAge.Text = model["Age"] + ""; ddlSex.SelectedValue = model.GetString("Sex", "0"); tbMoney.Text = model.GetString("Money");
上面代码可以看到创建了一个sqlParam实体变量,这样变量会自动转成SqlParameter的变量,这样进行参数化处理,无需为拼接数据库安全而担忧。此外,大家有没发现DataModel模型会经常出现?没错,这个就是我们重要的万能实体类,晚点会详细讲解这个类。
4.分页查询(SELECT):
大部分列表都需要分页查询,那么如何分页呢?别怕,分页查询和直接查询无义,只是DataTable()方法改为PageList()即可,代码如下(本次代码结合Ling.Pager.dll分页控件,有兴趣可以查看我的上一篇博文):
UserLogic userLogic = new UserLogic(); //总记录数变量 int records = 0; //分页查询 DataTable dtList = userLogic.Db.PageList(Pager1.PageIndex, Pager1.PageSize, out records); //设置分页记录 Pager1.Records = records; if (dtList != null) { repTableList.DataSource = dtList; repTableList.DataBind(); }
5.删除(DELETE):
int id = 0; int.TryParse(Request["ID"], out id); //查找是否存在记录:注意,防止误删除,如果没有Where直接执行new UserLogic().Db.Delete()是不进行任何操作 int count = new UserLogic().Db.Where("UserID=" + id).Delete(); //删除全部记录的方法:使用强制删除参数force=true //int count = new UserLogic().Db.Delete(true); if (count > 0) { this.AlertAndRedirect("一共删除" + count + "条记录!", string.Empty); }
6.事务支持(Trans):
UserLogic userLogic = new UserLogic(); //开始事务 try { int label = DateTime.Now.Millisecond; //标识 //事务开始 userLogic.Db.TranBegin(); //插入一条记录:李雷 DataModel lilei = new DataModel(); lilei["Name"] = "李雷" + label; lilei["Sex"] = 1; lilei["Age"] = 30; lilei["Money"] = new Random().Next(1, 100); //1~100万之间 lilei["CreateTime"] = DateTime.Now; int lileiID = userLogic.Db.Add(lilei); //暂停事务 userLogic.Db.TranPause(); //插入一条记录:张三 DataModel zhansan = new DataModel(); zhansan["Name"] = "张三" + label; zhansan["Sex"] = 1; zhansan["Age"] = 30; zhansan["Money"] = 100; zhansan["CreateTime"] = DateTime.Now; userLogic.Db.Add(zhansan); //暂停事务,张三会插入记录 //继续事务 userLogic.Db.TranContinue(); //插入韩梅梅 DataModel hanmeimei = new DataModel(); hanmeimei["Name"] = "韩梅梅" + label; hanmeimei["Sex"] = 0; hanmeimei["Age"] = 30; hanmeimei["Money"] = 0; hanmeimei["CreateTime"] = DateTime.Now; userLogic.Db.Add(hanmeimei); //如果李雷存款大于50万,则两个人在一起,否则两人不存在这世上 if (lilei.GetDecimal("Money") >= 50) { userLogic.Db.TranCommit(); //提交 this.Alert("李雷存款有" + lilei.GetDecimal("Money") + "万,求婚成功,韩梅梅答应了(插入数据库)"); } else { userLogic.Db.TranRollback(); //回滚 this.Alert("李雷存款不够50万,只有" + lilei.GetDecimal("Money") + "万,韩梅梅不答应(插入数据库)"); } } catch (Exception ex) { //事务回滚 userLogic.Db.TranRollback(); throw ex; }
上面只有李雷存款不少于50万(Money>=50),李雷和韩梅梅的记录才插入到数据库,而张三的记录则使用了事务暂停和继续,完全不受李雷的影响,每次都能插入数据库!如何?这个爽吧?
嘿嘿,事务完美支持!
6.万能实体类(DataModel):
由于C#4.0之前不支持动态属性,所以只能自创个万能属性咯,其基本使用如下:
//Model赋值 DataModel model = new DataModel(); model["Int"] = 50; model["Double"] = Convert.ToDouble(50.1); model["Decimal"] = Convert.ToDecimal(12.34); model["String"] = "字符串"; model["DateTime"] = DateTime.Now.AddYears(-1); //取值 int vInt = (int)model["Int"]; //50 double vDouble = model.GetDouble("Double"); //50.1 decimal vDecimal = model.GetDecimal("Decimal", (decimal)1.2); //12.34 decimal vDecimalString = model.GetDecimal("String", (decimal)1.2); //1.2 string vString = model.GetString("String"); //字符串 DateTime vDateTime = model.GetDateTime("DateTime", DateTime.Now); //上一年的当前时间
当然在第3个实例查询列表的时候,其实也可以返回LIst<DataModel>进行赋值,如下:
UserLogic userLogic = new UserLogic(); //Select():选择字段 //Top(50):选择50条 即SELECT TOP 50 //Where():条件 //OrderBy():排序 //DataTable:返回DataTable List<DataModel> modelList = userLogic.Db.Top(50).List(); if (modelList != null) { repModelList.DataSource = modelList ; repModelList.DataBind(); }
Repeater绑定代码如下:
<asp:Repeater ID="repModelList" runat="server"> <HeaderTemplate> <table> <tr> <th>用户ID</th> <th>姓名</th> <th>性别</th> <th>年龄</th> <th>金额</th> <th>操作</th> </tr> </HeaderTemplate> <ItemTemplate> <tr> <td><%#Container.DataModelValue("UserID")%></td> <td><%#Container.DataModelValue("Name")%></td> <td><%#Container.DataModel().GetInt("Sex") == 1 ? "男" : "女"%></td> <td><%#Container.DataModelValue("Age")%></td> <td><%#Container.DataModelValue("Money")%></td> <td><a href="DemoUpdate.aspx?ID=<%#Container.DataModelValue("UserID") %>">更新</a> <a href="DemoDelete.aspx?ID=<%#Container.DataModelValue("UserID") %>">删除</a> </td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater>
上面可以看到Container.DataModelValue("Name")可以直接把Name的值读取出来,Container.DataModel()方法可以直接把实体读取出来噢,亲!
6.自动生成类辅助函数(Ling.Dber.Builder.CreateCode()):
自动生成代码的函数调用如下:
//生成在站点根目录的Builder_App_Code\\Logic下 //路径也可以写绝对路径 //int files = Ling.Dber.Builder.CreateCode(@"D:\自动生成代码目录\Logic", new Ling.Dber.BuildConfig() //{ // Namespace = "MyApp.Logic", // RemoveTablePrefix = "T_", // ClassSuffix = "Logic" //}); int files = Ling.Dber.Builder.CreateCode("Builder_App_Code\\Logic", new Ling.Dber.BuildConfig() { //命名空间 Namespace = "MyApp.Logic", //移除表名前缀 RemoveTablePrefix = "T_", //类名添加前缀 ClassPrefix = "", //类名添加后缀 ClassSuffix = "Logic", //导入命名空间 ImportNamespaceList = new List<string>() { "System.Data", //多用逗号分割 }, //替换字符串 ReplaceTableStrings = new List<KeyValuePair<string,string>>() { new KeyValuePair<string,string>("_",""), //例如表名User_Detail会变成UserDetail } }); tipText.Text = DateTime.Now.ToString() + "共创建" + files + "个文件!";
生成在站点根目录的Builder_App_Code\\Logic下代码如下:
using System; using System.Collections.Generic; using System.Data; /* * 简单实例 * UserLogic demo = new UserLogic(); * DataTable = demo.Db.Select(xxxa,xxxb,xxxc).Where(xxx=xxx).OrderBy(xxx ASC,xxx DESC).DataTable(); * */ namespace MyApp.Logic { /// <summary> ///UserLogic 的摘要说明 /// </summary> public class UserLogic { /// <summary> /// 数据库操作实例 /// </summary> public Ling.Dber.DbTable Db = Ling.Dber.DbTable.Table("T_User"); ////数据库实例二:如果不使用默认数据库连接或者没有对类库进行初始化,可使用如下操作进行实例化 //const string connectionString = "user id=sa;password=foolin;initial catalog=LingDber;data source=(local);Connect Timeout=30;"; //public Ling.Dber.DbTable Db = Ling.Dber.DbTable.Table(connectionString, "T_User"); public UserLogic() { // //TODO: 在此处添加构造函数逻辑 // } // //TODO: 在此处添加其它复杂的语句和代码逻辑 // 数据库操作可使用Ling.Dber.DbHelper类 // } } //此文件由Ling.Dber.dll类库自动生成,文件创建日期:2012-09-23 09:16:17 //如果有疑问,请访问www.liufuling.cn寻求解决方法
总结:各位亲们,大概的示例代码就演示到这里咯,夜已深,最后贡献代码给大家,大家有任何问题或者疑问恳请拍砖,谢谢!