做.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尋求解決方法
總結:各位親們,大概的示例代碼就演示到這里咯,夜已深,最后貢獻代碼給大家,大家有任何問題或者疑問懇請拍磚,謝謝!