常見的ORM技術(比如:Entity Framework,Dapper,SqlSugar,NHibernate,等…),它們不是在做Sql語句的程式化變種,就是在做Sql語句的面向對象化。雖然有“邏輯較清晰”、“統一異質資料庫Sql語法差異”的優勢,但它們的缺點也顯而易見: (1) 把簡單... ...
前言:本系列文章適合有初/中級.NET知識的同學閱讀(請在電腦上打開頁面,獲取更好的閱讀效果)。
(1)本系列文章,旨在講述研發一個中大型項目所需要瞭解的一系列“基本構件”,並提供這些“基本構件”在全網的【最簡單】、【最快速】使用方法!!(並不深究技術原理)
(2)通過閱讀本系列文章,能讓你在正規“項目研發”方面快速入門+進階,並能達成“小團隊構建大網站”的目的。
(3)本系列文章採用的技術,已成功應用到人工智慧、產業互聯網、社區電商、游戲、金融風控、智慧醫療、等項目上。
限時下載:
nuget搜索關鍵字:DeveloperSharp
常見的ORM技術(比如:Entity Framework,Dapper,SqlSugar,NHibernate,等…),它們不是在做Sql語句的程式化變種,就是在做Sql語句的面向對象化。雖然有“邏輯較清晰”、“統一異質資料庫Sql語法差異”的優勢,但它們的缺點也顯而易見:
(1) 把簡單的Sql語句複雜化、不倫不類
(2) 速度慢、性能下降嚴重
(3) 有時功能不全,有時又有未知錯誤+不停發補丁
(4) 非標的各家自定義語法、且一些自定義破壞了原生.Net/C#以及Sql語言的協調性
(5) 難以大規模統一應用…
本文要介紹的主角-DeveloperSharp框架中的DataAccess資料庫訪問技術(續),則提供了一種基於原生Sql操作為核心的解決方案,也巧妙的規避了上述各種缺點。(註:未來視必要也能發展成面向對象程式化)
該方案幾乎只使用了一個方法/函數,卻實現了幾乎所有的數據操作功能。它已成功應用到了人工智慧、產業互聯網、智慧醫療、等多個大型項目上。
此套ORM技術在IDataAccess介面中提供。
IDataAccess所在的命名空間是:DeveloperSharp.Framework.QueryEngine。
它主要提供瞭如下四大功能:
(1) 執行Sql語句
(2) 執行Sp存儲過程
(3) 創建參數(輸入/輸出/返回)
(4) 事務
它初始化的代碼如下:
using DeveloperSharp.Framework.QueryEngine; -------------------------- DatabaseInfo DIF; DIF.DatabaseType = DatabaseType.SQLServer; //設置資料庫類型 DIF.ConnectionString = "Server=localhost;Database=YZZ;Uid=sa;Pwd=123"; IDataAccess IDA = DataAccessFactory.Create(DIF);
註意:通過對DatabaseType屬性的設定,提供了對各不同種類資料庫的支持(包括:MySql、Oracle、PostgreSQL、SqlServer、Sqlite、Firebird、達夢、以及人大金倉KingbaseES、神舟通用, 南大通用, 翰高, Access、等)
【示例1:查詢】
下麵,首先直接給出一個“查詢多數據+選出單數據+參數”的使用示例,代碼如下:
//查詢多數據 var Students1 = IDA.SqlExecute<stu>("select * from t_Student"); //查詢多數據(帶參數) var IdMin = IDA.CreateParameterInput("IdMin", DbType.Int32, 2); var LikeName = IDA.CreateParameterInput("LikeName", DbType.String, 50, "%周%"); var Students2 = IDA.SqlExecute<stu>("select * from t_Student where Id>@IdMin and Name like @LikeName", IdMin, LikeName); //另一種寫法 var Students3 = IDA.SqlExecute<stu>("select * from t_Student").Where(t => t.Id > 2 && t.Name.Contains("周")); //選出單數據 var OneStudent = Students2.FirstOrDefault();
其中stu實體類代碼如下形式:
public class stu { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } //此實體類中的Id、Name、Age屬性名,要與數據表中的Id、Name、Age欄位名對應
註意:創建參數時使用DbType類型,就是為了能在不同類型資料庫(SqlServer、MySql、Oracle、等)之間透明切換!
【示例2:分頁】
承接上面“示例1”的代碼,若我們要對Students1、Students2進行分頁操作(比如:每頁20條,取出第5頁),相關代碼如下:
using DeveloperSharp.Extension;//調用“分頁功能”需要引用此命名空間 -------------------------- var Page1 = Students1.PagePartition(20, 5); var Page2 = Students2.PagePartition(20, 5); //一氣呵成的寫法 var Page3 = IDA.SqlExecute<stu>("select * from t_Student").PagePartition(20, 5);
【示例3:增/刪/改】
前面談完“查詢”,我們接下來談談“增/刪/改”的使用方式,下麵是一個“修改數據+參數+事務”的使用示例:
try { //開啟事務 IDA.TransactionBegin(); //修改數據(多語句) int affectedRows1 = IDA.SqlExecute("insert into t_Student(Name,Age)values('ww','96');update t_Student set Age=100 where Id=1006"); //修改數據(帶參數) var NewAge = IDA.CreateParameterInput("NewAge", DbType.Int32, 200); var NewName = IDA.CreateParameterInput("NewName", DbType.String, 50, "孫悟空"); int affectedRows2 = IDA.SqlExecute("insert into t_Student(Name,Age)values(@NewName,@NewAge)", NewName, NewAge); //完成事務 IDA.TransactionCommit(); } catch { //回滾事務 IDA.TransactionRollBack(); }
【示例4:其它】
最後,我們給出一個“聚合函數+輸出參數”的使用示例,代碼如下:
var IdMax = IDA.CreateParameterInput("IdMax", DbType.Int32, 20); var TotalCount = IDA.CreateParameterOutput("TotalCount", DbType.Int32);//此項為輸出參數 var Students3 = IDA.SqlExecute<stu>("select @TotalCount=count(*) from t_Student where Id<@IdMax", TotalCount, IdMax); int tc = (int)TotalCount.Value;
靈活學習+使用以上4個示例,就能滿足幾乎所有的數據操作需求。
另外,你有沒有發現,上述所有的數據操作幾乎只用了一個方法來實現:SqlExecute/ SqlExecute<T>
推薦指數★★★★★
優勢1:速度快、性能高
優勢2:永久免費、商用免費
優勢3:無任何時間/次數限制,放心使用
優勢4:免費咨詢服務
IDataAccess內功能方法詳細說明(輔助參考):
SqlExecute<T> 聲明:IEnumerable<T> SqlExecute<T>(string cmdText, params IDataParameter[] Params) where T : class, new() 用途:執行Sql語句(Select類) 參數:(1)string cmdText -- Sql語句 (2)params IDataParameter[] Params -- 參數組 返回:IEnumerable<T> -- 多數據結果集 SqlExecute 聲明:int SqlExecute(string cmdText, params IDataParameter[] Params) 用途:執行Sql語句(Insert/Update/Delete類) 參數:(1)string cmdText -- Sql語句 (2)params IDataParameter[] Params -- 參數組 返回:int -- 受影響的行數 SpExecute<T> 聲明:IEnumerable<T> SpExecute<T>(string cmdText, params IDataParameter[] Params) where T : class, new() 用途:執行Sp存儲過程(Select類) 參數:(1)string cmdText -- Sp存儲過程名 (2)params IDataParameter[] Params -- 參數組 返回:IEnumerable<T> -- 多數據結果集 SpExecute 聲明:int SpExecute(string cmdText, params IDataParameter[] Params) 用途:執行Sp存儲過程(Insert/Update/Delete類) 參數:(1)string cmdText -- Sp存儲過程名 (2)params IDataParameter[] Params -- 參數組 返回:int -- 受影響的行數
【附註】:文章開頭給出的下載示例,均已成功運行通過。但下載示例往往只包含“核心模板”內容,有些輔助內容需要自己建立/設置(比如:資料庫創建、鏈接字元串設置、文件配置、路徑設置、參數設定、等等...)。調式時若遇異常報錯,請仔細閱讀+理解本文。
技術交流群:微信掃描文末二維碼(或添加微信:296894203),備註“進群”!
推薦閱讀
- .NET中大型項目開發必備(1)–UUID全球通用唯一識別碼
- .NET中大型項目開發必備(2)–CORS跨域訪問
- .NET中大型項目開發必備(3)–資料庫的負載均衡
- .NET中大型項目開發必備(4)–資料庫的讀寫分離
- .NET中大型項目開發必備(5)–Web服務/WebApi的負載均衡
- .NET中大型項目開發必備(6)–IUtility工具介紹
- .NET中大型項目開發必備(7)–ORM資料庫訪問技術
- .NET中大型項目開發必備(8)–高效分頁
- .NET中大型項目開發必備(9)--http請求調用(Post與Get)
- .NET中大型項目開發必備(10)--圖片的裁剪、縮放、與加水印
- .NET中大型項目開發必備(11)--使用Redis緩存
- .NET中大型項目開發必備(12)--使用MQ消息隊列
- .NET中大型項目開發必備(13)--ORM資料庫訪問技術(續)
如果文章對你有幫助,請點贊、收藏、關註(原創內容,歡迎轉載,轉載請註明出處) 技術交流群:微信掃描左側二維碼(或添加微信:296894203),備註“進群” 出處:https://www.cnblogs.com/DeveloperSharp/ 本文采用「CC BY 4.0」知識共用協議進行許可,轉載請註明作者及出處。 |