• 【原创】数据库辅助类库(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类库

  • 相关阅读:
    Swagger注解及参数细节的正确书写。
    TCP连接为什么三次握手四次挥手
    OpenMeetings安装
    [LeetCode]Best Time to Buy and Sell Stock III
    [LeetCode]Best Time to Buy and Sell Stock
    [LeetCode]Best Time to Buy and Sell Stock II
    [LeetCode]Delete Node in a Linked List
    [LeetCode]Lowest Common Ancestor of a Binary Search Tree
    [LeetCode]Invert Binary Tree
    [LeetCode]Same Tree
  • 原文地址:https://www.cnblogs.com/foolin/p/ling_dber_dll.html
Copyright © 2020-2023  润新知