.NET集成DeveloperSharp操作SqlServer、MySql等数据库

🏆作者:科技、互联网行业优质创作者
🏆专注领域:.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造
🏆欢迎关注我(Net数字智慧化基地),里面有很多高价值技术文章,是你刻苦努力也积累不到的经验,能助你快速成长。升职+涨薪!!

DeveloperSharp系列近期又被制造业ERP、民航飞行App、建筑BIM、电力掌上营业厅、等多家大型采用,站在巨人的肩膀上你能走的更远。

支持.Net Core2.0及以上,支持.Net Framework4.0及以上

本文要介绍的主角-DeveloperSharp框架中的DataAccess数据库访问技术(续),提供了一种结合“原生Sql+轻量级ORM”操作各类数据库的工具。

该工具几乎只使用了一个方法/函数,却实现了几乎所有的数据操作功能。它已成功应用到了人工智能、产业互联网、智慧医疗、等多个大型项目上。

此工具在IDataAccess接口中提供。 

IDataAccess所在的命名空间是:DeveloperSharp.Framework.QueryEngine(需从NuGet引用DeveloperSharp包)(提示:最新版已解决部署为“服务”时报错的问题) 

它主要提供了如下四大功能:

(1)     执行Sql语句

(2)     执行Sp存储过程

(3)     创建参数(输入/输出/返回)

(4)     事务

它初始化的代码如下:

若是在.Net Core环境下,代码如下:

using DeveloperSharp.Framework.QueryEngine;
--------------------------//在Startup.cs或Program.cs文件中进行Services.AddTransient<IDataAccess>((t) => {DatabaseInfo DIF;DIF.DatabaseType = DatabaseType.SQLServer; //设置数据库类型DIF.ConnectionString = "Server=localhost;Database=YZZ;Uid=sa;Pwd=123";return DataAccessFactory.Create(DIF);});

若是在.Net Framework环境下,代码如下:

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 Students2 = IDA.SqlExecute<stu>("select * from t_Student where Id>@IdMin and Name like @LikeName", new { IdMin = 2, LikeName = "%周%" });//另一种写法1var 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);//另一种写法2var Students4 = IDA.SqlExecute<stu>("select * from t_Student").Where(t => t.Id > 2 && t.Name.Contains("周"));//选出单数据var OneStudent = Students2.FirstOrDefault();

其中stu实体类代码如下形式:

    //此实体类中的Id、Name、Age、Birth、MyLevel属性名,要与数据表中的字段名一一对应public class stu{public int? Id { get; set; }//数据库中该字段若存在Null值,类型后需要加问号?public string Name { get; set; }public int? Age { get; set; }public DateTime? Birth { get; set; }public Level? MyLevel { get; set; }//也可以使用枚举,会自动转换}public enum Level{Student=100,//学生Teacher=200,//老师Manager=300,//管理员Principle=400//校长}

注意:(1)DbType类型的命名空间是System.Data
           (2)若没有定义stu实体类,也可以用dynamic替代

【示例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);

分页后获得的PagePiece对象中所包含的各类属性/参数,可参看这篇文章:高效分页

【示例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");//修改数据(带参数)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);//完成事务IDA.TransactionCommit();}catch{//回滚事务IDA.TransactionRollBack();}

【示例4:输出参数】

前面几个示例都只用到了“输入参数”,下面我们看看“输出参数”怎么使用,示例代码如下:

   var op1 = IDA.CreateParameterOutput("TotalCount", DbType.Int32);//此项为输出参数var op2 = IDA.CreateParameterOutput("MyName", DbType.String, 50);//此项为输出参数//以下sql语句混杂了多个“输入”与“输出”参数,注意看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:存储过程】

最后,我们来谈谈如何调用存储过程。我们创建一个存储过程(以下是Sql Server为例),它带有输入、输出、返回三种类型的参数,代码如下:

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
BEGINinsert 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

调用该存储过程的示例代码如下:

   var op1 = IDA.CreateParameterOutput("TotalCount", DbType.Int32);//输出参数var op2 = IDA.CreateParameterOutput("MyName", DbType.String, 50);//输出参数var op3 = IDA.CreateParameterReturn();//返回参数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);

(注意:上述使用的是SpExecute,而不是SqlExecute)

上述存储过程中并没有返回“结果集”的语句,现在我们给它添加“结果集”的返回,代码如下:

CREATE PROCEDURE Test6@B as datetime,@N as nvarchar(50),@h as float,@TotalCount as int output,@MyName as nvarchar(50) output,@Id as int
AS
BEGINselect * from Friend --返回“结果集”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

此时调用该存储过程的示例代码稍作修改为如下:

   var op1 = IDA.CreateParameterOutput("TotalCount", DbType.Int32);//输出参数var op2 = IDA.CreateParameterOutput("MyName", DbType.String, 50);//输出参数var op3 = IDA.CreateParameterReturn();//返回参数//获得“结果集”,可做其它用途var lstResult = IDA.SpExecute<dynamic>("Test6", 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);

学习+灵活使用以上5个示例,就能满足几乎所有的数据操作需求。

另外,你有没有发现,上述所有的数据操作几乎只用了一个方法来实现:SqlExecute/ SqlExecute<T>

IDataAccess内功能方法详细说明(辅助参考):

SqlExecute<T>  (异步为:SqlExecuteAsync<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<T>  (异步为:SqlExecuteAsync<T>)
声明:IEnumerable<T> SqlExecute<T>(string cmdText, object InputParams, params IDataParameter[] Params) where T : class, new()
用途:执行Sql语句(Select类)
参数:(1)string  cmdText              --  Sql语句(2)object InputParams            --  输入参数对象(3)params IDataParameter[] Params --  参数组
返回:IEnumerable<T> --  多数据结果集SqlExecute  (异步为:SqlExecuteAsync)
声明:int SqlExecute(string cmdText, params IDataParameter[] Params)
用途:执行Sql语句(Insert/Update/Delete类)
参数:(1)string  cmdText              --  Sql语句(2)params IDataParameter[] Params --  参数组
返回:int --  受影响的行数SqlExecute  (异步为:SqlExecuteAsync)
声明:int SqlExecute(string cmdText, object InputParams, params IDataParameter[] Params)
用途:执行Sql语句(Insert/Update/Delete类)
参数:(1)string  cmdText              --  Sql语句(2)object InputParams            --  输入参数对象(3)params IDataParameter[] Params --  参数组
返回:int --  受影响的行数SpExecute<T>  (异步为:SpExecuteAsync<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<T>  (异步为:SpExecuteAsync<T>)
声明:IEnumerable<T> SpExecute<T>(string cmdText, object InputParams, params IDataParameter[] Params) where T : class, new()
用途:执行Sp存储过程(Select类)
参数:(1)string  cmdText              --  Sp存储过程名(2)object InputParams            --  输入参数对象(3)params IDataParameter[] Params --  参数组
返回:IEnumerable<T> --  多数据结果集SpExecute  (异步为:SpExecuteAsync)
声明:int SpExecute(string cmdText, params IDataParameter[] Params)
用途:执行Sp存储过程(Insert/Update/Delete类)
参数:(1)string  cmdText              --  Sp存储过程名(2)params IDataParameter[] Params --  参数组
返回:int --  受影响的行数SpExecute  (异步为:SpExecuteAsync)
声明:int SpExecute(string cmdText, object InputParams, params IDataParameter[] Params)
用途:执行Sp存储过程(Insert/Update/Delete类)
参数:(1)string  cmdText              --  Sp存储过程名(2)object InputParams            --  输入参数对象(3)params IDataParameter[] Params --  参数组
返回:int --  受影响的行数

🏆欢迎订阅我的专栏(.NET/C#中大型项目开发),里面有很多高价值技术文章,能助你涨薪+升职!让你快速成长为相关领域的架构师、领航员。也能让普通中小企业轻松享有大型互联网分布式系统解决方案。
🏆同时,专栏(.NET/C#中大型项目开发)的内容也能教你采用最简单的方式开发.NET/C#中大型应用——理清技术脉络、形成思维体系、获取最佳实践、框架开发能力。让你具备挑战百万年薪的基础,逐渐成为国内一流.NET/C#从业者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/22572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Linux系统中程序是如何执行的?

在Linux系统中&#xff0c;程序的执行是一个复杂而精细的过程&#xff0c;涉及多个步骤。 1.进程创建 在Linux中&#xff0c;进程的创建&#xff0c;除了第一个进程&#xff08;0号进程&#xff09;是通过硬编码创建&#xff0c;其他所有进程通常都是通过fork()系统调用来实现…

力扣2134.最少交换次数得到连续的1(断环成链)

力扣2134.最少交换次数得到连续的1(断环成链) 最终一定是所有1的个数(长度) 的区间 所以求所有1的和 用和作为k作滑动窗口将环断成长度为nsum-1的链 class Solution {public:int minSwaps(vector<int>& nums) {int sum accumulate(nums.begin(),nums.end(),0);in…

如何保持气膜场馆内部空气新鲜—轻空间

气膜建筑作为现代建筑的一种新兴形式&#xff0c;以其独特的优势和设计受到了广泛欢迎。然而&#xff0c;保持气膜内部空气新鲜是一个必须解决的问题。我们通过配备先进的新风系统&#xff0c;提供了高效的解决方案。 新风系统的工作原理 气膜建筑内部空气的新鲜度主要依靠其配…

在C++中,NULL和nullptr有什么区别?

在C11之前&#xff0c;一般使用NULL代表空指针。 NULL的定义在C和C中不同&#xff0c;而且C和C针对0和指针之间的运算规则也存在差异&#xff1a; C03标准&#xff1a;空指针常量是整数类型的整型常量表达式右值&#xff0c;其值为零。空指针常量可以转换为指针类型&#xff…

【vscode-快捷键 一键JSON格式化】

网上有很多JSON格式化工具&#xff0c;也有很多好用的在线json格式化工具。但是其实Vscode里面的可以直接格式化JSON&#xff0c;这里分享一个我常用的小插件 Prettify JSON 未格式化的JSON数据 召唤出命令行&#xff0c;输入prettify JSON 即可! ✿✿ヽ(▽)ノ✿

算法题:Java求数组中最大的值

采用分而治之&#xff08;二分法&#xff09;的思想去求解 分而治之&#xff1a;分而治之的思想可以用于解决很多问题&#xff0c;大概的思路就是把一个比较大的复杂的问题切分成小的块&#xff0c;然后分头去解决他们&#xff0c;最后再把结果合并起来&#xff0c;就是“分而治…

C++中的string类详解

在C中&#xff0c;字符串是一个非常重要的数据类型&#xff0c;用于存储和处理文本数据。C标准库提供了std::string类&#xff0c;它是一个模板类&#xff0c;专门用于处理字符串。std::string类提供了丰富的成员函数和操作符重载&#xff0c;使得字符串操作变得简单而高效。本…

【JAVA】把结果保留两位小数的方法

在Java中&#xff0c;保留两位小数可以使用几种不同的方法&#xff0c;下面将详细解释并给出每种方法的例子&#xff1a; 1.使用DecimalFormat类 DecimalFormat是java.text包中的一个类&#xff0c;专门用于格式化数字&#xff0c;包括保留小数点后指定的位数。下面是使用Dec…

git介绍、安装、配置

文章目录 1. GIT介绍2. 使用GIT的好处3. GIT 安装4. GIT 配置4.1 GIT 初始化设置、命令别名设置4.2 如果终端安装了oh-my-zsh&#xff0c;会带一堆git命令别名4.3 GIT配置文件介绍4.3.1 Linux、Mac OS系统4.3.2 windows系统 5. git设置远程仓库账号密码(拉取、上传代码不用输入…

快速理解 Node.js 版本差异:3 分钟指南

Node.js 是一个广泛使用的 JavaScript 运行时环境&#xff0c;允许开发者在服务器端运行 JavaScript 代码。随着技术的发展&#xff0c;Node.js 不断推出新版本&#xff0c;引入新特性和改进。了解不同版本之间的差异对于开发者来说至关重要。以下是一个快速指南&#xff0c;帮…

Unity3D DOTS 10W GPU Intancing 动画与合批优化详解

前言 Unity3D DOTS&#xff08;Data-Oriented Technology Stack&#xff09;是Unity引擎的一个新的技本堆栈&#xff0c;旨在提高游戏的性能和效率。其中的GPU Instancing和合批技术是其重要的优化手段之一。本文将详细介绍Unity3D DOTS中的10W GPU Instancing技术以及动画与合…

高清多媒体接口(High Definition Multimedia Interface, HDMI)

目录 1. Overview1.1. TMDS(Time Minimized Differential Signal)1.2. Display Data Channel(DDC)1.3. CEC1.4. HEAC1.5. HPD2. Signaling and Encoding3. Video4. Control and Configuration5. Compatibility with DVI6. EDID and E-EDID7. HDCP<

C++高级 - 接口模板

目录 一. 接口 二. 模板 一. 接口 接口通常是通过抽象类或纯虚函数来实现的。 以下是一个使用抽象类来定义接口的示例代码&#xff1a; #include <iostream>class Interface { public:virtual void operation() 0; // 纯虚函数定义接口 };class ConcreteClass : pu…

linux flask | 接口保持在后台一直运行、python后端接口长期调用、python后台持续运行方法、python提供后端接口

文章目录 一、flask接口二、长期运行接口2.1、nohup与&后台运行 实际项目中我们需要用python提供一个后端接口&#xff0c;并在linux上持续运行这个程序&#xff0c;以供其他项目调用。下面就用个简单示例讲解下怎么写python后端接口&#xff0c;以及如何将程序长期运行在l…

URL统一资源定位符 、协议类型、url的组成

1、URL统一资源定位器 URL&#xff08;Uniform Resource Locator&#xff09;即统一资源定位器&#xff08;或统一资源定位符&#xff09;&#xff0c;可以理解网页地址。如同在网络上的门牌&#xff0c;是因特网上标准的资源的地址&#xff08;Address&#xff09;。由Tim Be…

某航天技术公司职级体系搭建项目成功案例纪实

某航天技术公司职级体系搭建项目成功案例纪实 ——的搭建科学合理的职级晋升体系&#xff0c;解决员工流失问题 【客户行业】航空航天 【问题类型】职级体系搭建 【客户背景】 某航天技术公司致力于自主创新&#xff0c;研发和生产航空航天设备。目前公司研发的多套系统和…

Linux云计算实践:OpenStack与云服务

Linux云计算实践&#xff1a;OpenStack与云服务 云计算作为一种革命性的技术&#xff0c;正在改变我们对计算资源的使用和管理方式。Linux操作系统因其开源、稳定和灵活的特性&#xff0c;成为构建云平台的理想选择。OpenStack&#xff0c;作为开源云平台的代表&#xff0c;与…

Java 性能调优与监控工具详解

在Java开发中&#xff0c;性能调优和监控是确保应用程序高效、稳定运行的关键环节。本文将详细介绍Java性能调优的基本原则和常用的监控工具&#xff0c;并通过代码示例帮助读者理解如何进行实际操作。 一、性能调优的基本原则 在开始调优之前&#xff0c;了解以下基本原则是…

【图书推荐】《Ubuntu Linux系统管理与运维实战》

本书重点 全面学习Ubuntu系统操作&#xff0c;快速掌握Linux日常管理和运维 安装和配置、桌面环境、文件系统、文件和目录管理、用户和权限管理系统的启动和关闭、服务和进程管理、软件包管理、磁盘和文件系统管理网络管理、网络服务管理、系统和网络安全 内容简介 Linux是…

【TypeScript】ts中的keyof语法和作用

文章目录 简言keyof和泛型搭配使用约束范型参数的范围其他 结语 简言 keyof 运算符接收一个对象类型&#xff0c;并产生其键的字符串或数字字面联合。 有的时候使用keyof 可以简化类型定义代码或者约束类型范围。 keyof keyof 运算符接收一个对象类型&#xff0c;并产生其键…