支持.Net/.Net Core/.Net Framework,可以部署在Docker, Windows, Linux, Mac。

本文提供了一种结合“原生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 = "%周%" });
//另一种写法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("周")); //选出单数据
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:存储过程】

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

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

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

   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);

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

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

-----------------------

【后记】

有读者问到:本“工具说明”文章过于简单,缺乏全面、细节功能的详细介绍,所以很难依据本文内容做全面学习及后续开发。

回答如下:其实不然,原因有三。

(1)有一定数据库开发经验的人应该能看出,本文介绍的内容,已经能满足绝大多数情况下数据库操作的功能需求。

(2)不像其它第三方工具有很多非标的自定义语法(这些“自定义语法”需要单独学习,而且往往并不符合微软规范),本工具顺应了原生.Net/C#、Linq、Sql语言的协调性(从几个示例就能看出),所以无需付出更多学习时间,自己动手简单用一用,各种功能就能马上实现。

举例:本文示例中并没有给出对结果集进行“排序操作”的代码。但你若会用Linq,顺应的应该马上能猜出如何进行排序?

(3)已有读者依据本文内容把技术采用到了具体项目上。

-----------------------

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集成DeveloperSharp操作Sql Server数据库的更多相关文章

  1. SQL Server学习之路(七):Python3操作SQL Server数据库

    0.目录 1.前言 2.准备工作 3.简单测试语句 4.提交与回滚 5.封装成类的写法 1.前言 前面学完了SQL Server的基本语法,接下来学习如何在程序中使用sql,毕竟不能在程序中使用的话, ...

  2. [转]C#操作SQL Server数据库

    转自:C#操作SQL Server数据库 1.概述 ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据库: 第二,建立SqlComman ...

  3. Python 学习笔记:Python 操作 SQL Server 数据库

    最近要将数据写到数据库里,学习了一下如何用 Python 来操作 SQL Server 数据库. 一.连接数据库: 首先,我们要连接 SQL Server 数据库,需要安装 pymssql 这个第三方 ...

  4. 基于Spring Boot,使用JPA操作Sql Server数据库完成CRUD

    完成一个RESTful服务,提供几个访问接口,用来操作较简单的联系人信息,数据保存在Sql Server数据库中. 1.使用STS创建工程. 使用STS创建RESTful工程,可以参考: <用S ...

  5. SQL语句操作SQL SERVER数据库登录名、用户及权限

    要想成功访问 SQL Server 数据库中的数据, 我们需要两个方面的授权: 获得准许连接 SQL Server 服务器的权利: 获得访问特定数据库中数据的权利(select, update, de ...

  6. python:利用pymssql模块操作SQL server数据库

    python默认的数据库是 SQLlite,不过它对MySql以及SQL server的支持也可以.这篇博客,介绍下如何在Windows下安装pymssql库并进行连接使用... 环境:Windows ...

  7. 转发:C#操作SQL Server数据库

    转发自:http://www.cnblogs.com/rainman/archive/2012/03/13/2393975.html 1.概述 2.连接字符串的写法 3.SqlConnection对象 ...

  8. [资料]C#操作SQL Server数据库

    1.概述 ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据库: 第二,建立SqlCommand对象,负责SQL语句的执行和存储过程的调 ...

  9. C# 连接和操作SQL SERVER数据库

    用C#sqlserver实现增删改查http://www.worlduc.com/blog2012.aspx?bid=730767 using System.Data;using System.Dat ...

  10. Qt 操作sql server数据库

    添加qtsql的库 连接数据库 QSqlDatabase_db = QSqlDatabase::addDatabase("QODBC"); _db.setHostName(); _ ...

随机推荐

  1. 优化利器In-Memory开启和效果

    本文主要介绍Oracle In-Memory 选件,Oracle在12.1.0.2就已经推出了In-Memory这个选件,现在通常会建议所有使用19.8及之后版本的用户,有条件都要留给In-memor ...

  2. .NET应用程序7种最常见的性能问题及其解决方案

    译者注:这篇文章依然是介绍.NET Framework框架下的性能问题排查,可能并不直接适用于.NET Core,但有时也能提供一些参考.   .NET应用程序7种最常见的性能问题及其解决方案 原文地 ...

  3. NC24438 [USACO 2016 Ope P]262144

    题目链接 题目 题目描述 Bessie likes downloading games to play on her cell phone, even though she does find the ...

  4. Office Online Server Windows Server 2016 部署

    一.准备"武器" 本文是通过虚拟机搭建 OOS 测试环境的,4567是3的前提,武器提取 le73 1.VMWare Workstation 17 Player 2.Windows ...

  5. C语言,结构体成员的地址

    先回顾一个基础的知识,不同类型的数据在16位,32位,64位的机器分别占用多少字节. 类型 16位机器(字节) 32位机器(字节) 64位机器(字节) char 1 1 1 short 2 2 2 i ...

  6. colrm命令

    colrm命令 colrm命令用于编辑源代码文件,脚本文件或常规文本文件中的文本,此命令从文件中删除选定的列,列定义为一行中的单个字符.索引总是从1开始,而不是0.如果同时指定了开始和结束,则它们之间 ...

  7. Js中Array对象

    Js中Array对象 JavaScript的Array对象是用于构造数组的全局对象,数组是类似于列表的高阶对象. 描述 在JavaScript中通常可以使用Array构造器与字面量的方式创建数组. c ...

  8. 解密C语言选择结构:掌握条件语句与分支逻辑的利器

    欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 引言 C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构.选择结构.循环结构.为什么有 ...

  9. STL-list模拟实现

    #pragma once #include"16my_Itetator.h" //测试用 #include<iostream> //测试用 using std::cou ...

  10. C++ STL 容器 forward_list类型

    C++ STL 容器 forward_list类型 介绍 std::forward_list 是 C++ 标准模板库 (STL) 中的一个单向链表容器.与 std::list 不同,std::forw ...