【原創】數據庫輔助類庫(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類庫


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM