.NET中大型項目開發必備(13)--DataAccess資料庫訪問技術(續)

来源:https://www.cnblogs.com/DeveloperSharp/archive/2022/05/21/16294317.html
-Advertisement-
Play Games

常見的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),備註“進群”!

推薦閱讀

作者二維碼

如果文章對你有幫助,請點贊、收藏、關註(原創內容,歡迎轉載,轉載請註明出處)


技術交流群:微信掃描左側二維碼(或添加微信:296894203),備註“進群”

出處:https://www.cnblogs.com/DeveloperSharp/

本文采用「CC BY 4.0」知識共用協議進行許可,轉載請註明作者及出處。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 現在驗證碼登錄已經成為很多應用的主流登錄方式,但是對於OAuth2授權來說,手機號驗證碼處理用戶認證就非常繁瑣,很多同學卻不知道怎麼接入。 認真研究胖哥Spring Security OAuth2專欄的都會知道一個事,OAuth2其實不管資源擁有者是如何認證的,只要資源擁有者在授權的環節中認證了就可 ...
  • 來源:csdn.net/xiaojin21cen/article/details/78587425 ZeroC ICE的Java版,Netty2作者的後續之作Apache MINA,Crmky的Cindy之外,還有個超簡單的QuickServer,讓你專心編寫自己的業務代碼,不用編寫一行TCP代碼。 ...
  • 1.創建線程池相關參數 線程池的創建要用ThreadPoolExecutor類的構造方法自定義創建,禁止用Executors的靜態方法創建線程池,防止記憶體溢出和創建過多線程消耗資源。 corePoolSize: 線程池核心線程數量,不會自動銷毀,除非設置了參數allowCoreThreadTimeO ...
  • 我們在上一篇博客中介紹了Linux系統Shell命令行下可執行程式應該遵守的傳參規範(包括了各種選項及其參數)。Python命令行程式做為其中一種,其傳參中也包括了位置參數(positional和可選參數(optional)。Python程式中我們解析在命令行中提供的各種選項(選項保存在sys.ar... ...
  • 1. Netty源碼研究筆記(1)——開篇 1.1. Netty介紹 Netty是一個老牌的高性能網路框架。在眾多開源框架中都有它的身影,比如:grpc、dubbo、seata等。 裡面有著非常多值得學的東西: I/O模型 記憶體管理 各種網路協議的實現:http、redis、websocket等等 ...
  • Kafka 簡介 Kafka 是一種高吞吐、分散式、基於發佈和訂閱模型的消息系統,最初是由 LinkedIn 公司採用 Scala 和 java 開發的開源流處理軟體平臺,目前是 Apache 的開源項目。 Kafka 用於離線和線上消息的消費,將消息數據按順序保存在磁碟上,併在集群內以副本的形式存 ...
  • 前言 微服務治理方案中,鏈路追蹤是必修課,SpringCloud的組件其實使用很簡單,生產環境中真正令人頭疼的往往是軟體維護,介面在微服務間的調用究竟哪個環節出現了問題,哪個環節耗時較長,這都是項目上線後一定會遇到的問題,為瞭解決這些問題鏈路追蹤便應運而生了。 主流方案 1)、SkyWalking: ...
  • 520沒啥好送的,送一份面經總結吧(內含位元組、蝦皮、歡聚等) 前言 今天不想寫文章,水一篇面經。 本來也沒打算搞這些,但是看到大家都在面,就跟著出去試試水。我工作已經一年多接近兩年,這個工作時長其實比較尷尬,中級崗位自己不滿意,高級崗位大廠評級比較難上去。 首先說一下我的工作內容,主要做金融相關的業 ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...