支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac。
本文提供了一種結(jié)合“原生Sql+輕量級(jí)ORM”操作各類數(shù)據(jù)庫(kù)的工具。該工具幾乎只使用了一個(gè)方法/函數(shù),卻實(shí)現(xiàn)了幾乎所有的數(shù)據(jù)操作功能。它已成功應(yīng)用到了人工智能、產(chǎn)業(yè)互聯(lián)網(wǎng)、智慧醫(yī)療、等多個(gè)大型項(xiàng)目上。
?
此工具在IDataAccess接口中提供。?
IDataAccess所在的命名空間是:DeveloperSharp.Framework.QueryEngine(需從NuGet引用DeveloperSharp包)
它主要提供了如下四大功能:
(1)?????執(zhí)行Sql語(yǔ)句
(2)?????執(zhí)行Sp存儲(chǔ)過(guò)程
(3)?????創(chuàng)建參數(shù)(輸入/輸出/返回)
(4)?????事務(wù)
它初始化的代碼如下:
若是在.Net Core環(huán)境下,代碼如下:
using DeveloperSharp.Framework.QueryEngine; -------------------------- //在Startup.cs或Program.cs文件中進(jìn)行 Services.AddTransient<IDataAccess>((t) => { DatabaseInfo DIF; DIF.DatabaseType = DatabaseType.SQLServer; //設(shè)置數(shù)據(jù)庫(kù)類型 DIF.ConnectionString = "Server=localhost;Database=YZZ;Uid=sa;Pwd=123"; return DataAccessFactory.Create(DIF); });
若是在.Net Framework環(huán)境下,代碼如下:
using DeveloperSharp.Framework.QueryEngine; -------------------------- DatabaseInfo DIF; DIF.DatabaseType = DatabaseType.SQLServer; //設(shè)置數(shù)據(jù)庫(kù)類型 DIF.ConnectionString = "Server=localhost;Database=YZZ;Uid=sa;Pwd=123"; IDataAccess IDA = DataAccessFactory.Create(DIF);
注意:通過(guò)對(duì)DatabaseType屬性的設(shè)定,提供了對(duì)所有種類數(shù)據(jù)庫(kù)的支持(包括:MySql、Oracle、PostgreSQL、SqlServer、Sqlite、Firebird、達(dá)夢(mèng)、以及人大金倉(cāng)KingbaseES、神舟通用, 南大通用, 翰高, Access、等)
?
【示例1:查詢】
下面,首先直接給出一個(gè)“查詢多數(shù)據(jù)+選出單數(shù)據(jù)+參數(shù)”的使用示例,代碼如下:
//查詢多數(shù)據(jù) var Students1 = IDA.SqlExecute<stu>("select * from t_Student"); //查詢多數(shù)據(jù)(帶參數(shù)) var Students2 = IDA.SqlExecute<stu>("select * from t_Student where Id>@IdMin and Name like @LikeName", new { IdMin = 2, LikeName = "%周%" }); //另一種寫法1 var IdMin = IDA.CreateParameterInput("IdMin", DbType.Int32, 2); var LikeName = IDA.CreateParameterInput("LikeName", DbType.String, 50, "%周%"); var Students3 = IDA.SqlExecute<stu>("select * from t_Student where Id>@IdMin and Name like @LikeName", LikeName, IdMin); //另一種寫法2 var Students4 = IDA.SqlExecute<stu>("select * from t_Student").Where(t => t.Id > 2 && t.Name.Contains("周")); //選出單數(shù)據(jù) var OneStudent = Students2.FirstOrDefault();
其中stu實(shí)體類代碼如下形式:
//此實(shí)體類中的Id、Name、Age、Birth、MyLevel屬性名,要與數(shù)據(jù)表中的字段名一一對(duì)應(yīng) public class stu { public int? Id { get; set; }//數(shù)據(jù)庫(kù)中該字段若存在Null值,類型后需要加問(wèn)號(hào)? public string Name { get; set; } public int? Age { get; set; } public DateTime? Birth { get; set; } public Level? MyLevel { get; set; }//也可以使用枚舉,會(huì)自動(dòng)轉(zhuǎn)換 } public enum Level { Student=100,//學(xué)生 Teacher=200,//老師 Manager=300,//管理員 Principle=400//校長(zhǎng) }
注意:(1)DbType類型的命名空間是System.Data
? ? ? ? ? ?(2)若沒(méi)有定義stu實(shí)體類,也可以用dynamic替代
?
【示例2:分頁(yè)】
承接上面“示例1”的代碼,若我們要對(duì)Students1、Students2進(jìn)行分頁(yè)操作(比如:每頁(yè)20條,取出第5頁(yè)),相關(guān)代碼如下:
using DeveloperSharp.Extension;//調(diào)用“分頁(yè)功能”需要引用此命名空間 -------------------------- var Page1 = Students1.PagePartition(20, 5); var Page2 = Students2.PagePartition(20, 5); //一氣呵成的寫法 var Page3 = IDA.SqlExecute<stu>("select * from t_Student").PagePartition(20, 5);
分頁(yè)后獲得的PagePiece對(duì)象中所包含的各類屬性/參數(shù),可參看這篇文章:高效分頁(yè)
?
【示例3:增/刪/改】
前面談完“查詢”,我們接下來(lái)談?wù)劇霸?刪/改”的使用方式,下面是一個(gè)“修改數(shù)據(jù)+參數(shù)+事務(wù)”的使用示例:
try { //開(kāi)啟事務(wù) IDA.TransactionBegin(); //修改數(shù)據(jù)(多語(yǔ)句) int affectedRows1 = IDA.SqlExecute("insert into t_Student(Name,Age)values('ww','96');update t_Student set Age=100 where Id=1006"); //修改數(shù)據(jù)(帶參數(shù)) int affectedRows2 = IDA.SqlExecute("insert into t_Student(Name,Age)values(@N,@A)", new { N = "孫悟空", A = 200 }); //另一種寫法 var NewAge = IDA.CreateParameterInput("NewAge", DbType.Int32, 200); var NewName = IDA.CreateParameterInput("NewName", DbType.String, 50, "孫悟空"); int affectedRows3 = IDA.SqlExecute("insert into t_Student(Name,Age)values(@NewName,@NewAge)", NewName, NewAge); //完成事務(wù) IDA.TransactionCommit(); } catch { //回滾事務(wù) IDA.TransactionRollBack(); }
?
【示例4:輸出參數(shù)】
前面幾個(gè)示例都只用到了“輸入?yún)?shù)”,下面我們看看“輸出參數(shù)”怎么使用,示例代碼如下:
var op1 = IDA.CreateParameterOutput("TotalCount", DbType.Int32);//此項(xiàng)為輸出參數(shù) var op2 = IDA.CreateParameterOutput("MyName", DbType.String, 50);//此項(xiàng)為輸出參數(shù) //以下sql語(yǔ)句混雜了多個(gè)“輸入”與“輸出”參數(shù),注意看 IDA.SqlExecute("insert into Friend(Birth,Name,height)values(@B,@N,@h);" + "select @TotalCount=count(*) from Friend;" + "select @MyName=Name from Friend where Id=@Id", new { N = "楊小偉", B = "1999-02-28 12:03:45", h = 11.023, Id = 2 }, op1, op2); int tc = Convert.ToInt32(op1.Value); string mn = op2.Value.ToString();
?
【示例5:存儲(chǔ)過(guò)程】
最后,我們來(lái)談?wù)勅绾握{(diào)用存儲(chǔ)過(guò)程。我們創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,它帶有輸入、輸出、返回三種類型的參數(shù),代碼如下:
CREATE PROCEDURE Test5 @B as datetime, @N as nvarchar(50), @h as float, @TotalCount as int output, @MyName as nvarchar(50) output, @Id as int AS BEGIN insert into Friend(Birth,Name,height)values(@B,@N,@h); select @TotalCount=count(*) from Friend; select @MyName=Name from Friend where Id=@Id; return @TotalCount+100; END
調(diào)用該存儲(chǔ)過(guò)程的示例代碼如下:
var op1 = IDA.CreateParameterOutput("TotalCount", DbType.Int32);//輸出參數(shù) var op2 = IDA.CreateParameterOutput("MyName", DbType.String, 50);//輸出參數(shù) var op3 = IDA.CreateParameterReturn();//返回參數(shù) IDA.SpExecute("Test5", new { N = "楊小偉", B = "1999-02-28 12:03:45", h = 11.023, Id = 2 }, op1, op2, op3); int tc = Convert.ToInt32(op1.Value); string mn = op2.Value.ToString(); int ret = Convert.ToInt32(op3.Value);
?
學(xué)習(xí)+靈活使用以上5個(gè)示例,就能滿足幾乎所有的數(shù)據(jù)操作需求。
另外,你有沒(méi)有發(fā)現(xiàn),上述所有的數(shù)據(jù)操作幾乎只用了一個(gè)方法來(lái)實(shí)現(xiàn):SqlExecute/ SqlExecute<T>
-----------------------
【后記】
? ? ? ? 有讀者問(wèn)到:本“工具說(shuō)明”文章過(guò)于簡(jiǎn)單,缺乏全面、細(xì)節(jié)功能的詳細(xì)介紹,所以很難依據(jù)本文內(nèi)容做全面學(xué)習(xí)及后續(xù)開(kāi)發(fā)。
? ? ? ? 回答如下:其實(shí)不然,原因有三。
? ? ? ? ? ? ? ?(1)有一定數(shù)據(jù)庫(kù)開(kāi)發(fā)經(jīng)驗(yàn)的人應(yīng)該能看出,本文介紹的內(nèi)容,已經(jīng)能滿足絕大多數(shù)情況下數(shù)據(jù)庫(kù)操作的功能需求。
? ? ? ? ? ? ? ?(2)不像其它第三方工具有很多非標(biāo)的自定義語(yǔ)法(這些“自定義語(yǔ)法”需要單獨(dú)學(xué)習(xí),而且往往并不符合微軟規(guī)范),本工具順應(yīng)了原生.Net/C#、Linq、Sql語(yǔ)言的協(xié)調(diào)性(從幾個(gè)示例就能看出),所以無(wú)需付出更多學(xué)習(xí)時(shí)間,自己動(dòng)手簡(jiǎn)單用一用,各種功能就能馬上實(shí)現(xiàn)。
? ? ? ? ? ? ? ? ?舉例:本文示例中并沒(méi)有給出對(duì)結(jié)果集進(jìn)行“排序操作”的代碼。但你若會(huì)用Linq,順應(yīng)的應(yīng)該馬上能猜出如何進(jìn)行排序?
? ? ? ? ? ? ? ?(3)已有讀者依據(jù)本文內(nèi)容把技術(shù)采用到了具體項(xiàng)目上。
-----------------------?
IDataAccess內(nèi)功能方法詳細(xì)說(shuō)明(輔助參考):文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-841066.html
SqlExecute<T> (異步為:SqlExecuteAsync<T>) 聲明:IEnumerable<T> SqlExecute<T>(string cmdText, params IDataParameter[] Params) where T : class, new() 用途:執(zhí)行Sql語(yǔ)句(Select類) 參數(shù):(1)string cmdText -- Sql語(yǔ)句 (2)params IDataParameter[] Params -- 參數(shù)組 返回:IEnumerable<T> -- 多數(shù)據(jù)結(jié)果集 SqlExecute<T> (異步為:SqlExecuteAsync<T>) 聲明:IEnumerable<T> SqlExecute<T>(string cmdText, object InputParams, params IDataParameter[] Params) where T : class, new() 用途:執(zhí)行Sql語(yǔ)句(Select類) 參數(shù):(1)string cmdText -- Sql語(yǔ)句 (2)object InputParams -- 輸入?yún)?shù)對(duì)象 (3)params IDataParameter[] Params -- 參數(shù)組 返回:IEnumerable<T> -- 多數(shù)據(jù)結(jié)果集 SqlExecute (異步為:SqlExecuteAsync) 聲明:int SqlExecute(string cmdText, params IDataParameter[] Params) 用途:執(zhí)行Sql語(yǔ)句(Insert/Update/Delete類) 參數(shù):(1)string cmdText -- Sql語(yǔ)句 (2)params IDataParameter[] Params -- 參數(shù)組 返回:int -- 受影響的行數(shù) SqlExecute (異步為:SqlExecuteAsync) 聲明:int SqlExecute(string cmdText, object InputParams, params IDataParameter[] Params) 用途:執(zhí)行Sql語(yǔ)句(Insert/Update/Delete類) 參數(shù):(1)string cmdText -- Sql語(yǔ)句 (2)object InputParams -- 輸入?yún)?shù)對(duì)象 (3)params IDataParameter[] Params -- 參數(shù)組 返回:int -- 受影響的行數(shù) SpExecute<T> (異步為:SpExecuteAsync<T>) 聲明:IEnumerable<T> SpExecute<T>(string cmdText, params IDataParameter[] Params) where T : class, new() 用途:執(zhí)行Sp存儲(chǔ)過(guò)程(Select類) 參數(shù):(1)string cmdText -- Sp存儲(chǔ)過(guò)程名 (2)params IDataParameter[] Params -- 參數(shù)組 返回:IEnumerable<T> -- 多數(shù)據(jù)結(jié)果集 SpExecute<T> (異步為:SpExecuteAsync<T>) 聲明:IEnumerable<T> SpExecute<T>(string cmdText, object InputParams, params IDataParameter[] Params) where T : class, new() 用途:執(zhí)行Sp存儲(chǔ)過(guò)程(Select類) 參數(shù):(1)string cmdText -- Sp存儲(chǔ)過(guò)程名 (2)object InputParams -- 輸入?yún)?shù)對(duì)象 (3)params IDataParameter[] Params -- 參數(shù)組 返回:IEnumerable<T> -- 多數(shù)據(jù)結(jié)果集 SpExecute (異步為:SpExecuteAsync) 聲明:int SpExecute(string cmdText, params IDataParameter[] Params) 用途:執(zhí)行Sp存儲(chǔ)過(guò)程(Insert/Update/Delete類) 參數(shù):(1)string cmdText -- Sp存儲(chǔ)過(guò)程名 (2)params IDataParameter[] Params -- 參數(shù)組 返回:int -- 受影響的行數(shù) SpExecute (異步為:SpExecuteAsync) 聲明:int SpExecute(string cmdText, object InputParams, params IDataParameter[] Params) 用途:執(zhí)行Sp存儲(chǔ)過(guò)程(Insert/Update/Delete類) 參數(shù):(1)string cmdText -- Sp存儲(chǔ)過(guò)程名 (2)object InputParams -- 輸入?yún)?shù)對(duì)象 (3)params IDataParameter[] Params -- 參數(shù)組 返回:int -- 受影響的行數(shù)
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-841066.html
到了這里,關(guān)于.NET集成DeveloperSharp操作Sql Server數(shù)據(jù)庫(kù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!