【原创】数据库辅助类库(Ling.Dber),大幅减少重复编写操作数据库代码

做.NET开发的同学都知道,有时候总会重复地写着重复对数据库操作的增、删、改、查代码,不同的只是针对不同的表、不同的字段编码而已,尽管有自动代码生成软件,但有时仍需批量修改代码,为了减少重复的编码,自己就开发一套数据库辅助类库,无需重复编写增、删、改、查的代码,其它就不啰嗦,直接进入主题,个人和思维水平有限,如有误导或者错误之处,还请各位大侠指正。

功能特色:

  1. 自动生成辅助代码
  2. 无需重复编写查询、插入、更新、删除功能代码(只需实例化DbTable类即可实现)
  3. 支持Sql拼接模式或者SqlParameter模式。
  4. 强大的事务支持!事务支持暂停、继续
  5. 内置支持分页函数
  6. 万能实体DataModel,支持任何数据的存取操作
  7. 数据库操作类DbHelper,服务完成编写复杂Sql语句
  8. 更多特性等待您的体验。

 

具体实例(数据库增、删、改、查):

假如有如下数据库表(如下图),此次主要对其进行增、删、改、查功能

 

 

 

 首先,引用类库: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寻求解决方法

 

 

 

 

总结:各位亲们,大概的示例代码就演示到这里咯,夜已深,最后贡献代码给大家,大家有任何问题或者疑问恳请拍砖,谢谢!

 

下载演示代码和Ling.Dber.dll类库

posted @ 2012-09-24 00:40  刘付灵(Foolin)  阅读(9804)  评论(21编辑  收藏  举报

邮箱:Foolin@126.Com QQ:970026999