[译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

园子里关于ASP.NET Core Web API的教程很多,但大多都是使用EF+Mysql或者EF+MSSQL的文章。甚至关于ASP.NET Core Web API中使用Dapper+Mysql组合的文章都很少,更别提Oracel+Dapper组合的文章了,那么今天就带着大家一起翻译一篇国外大牛写的关于ASP.NET Core Web API 开发中使用Oracle+Dapper的组合的文章吧。

注:虽然本文内容是翻译,但是楼主刚在2.1环境是使用成功,中间也没有任何阻碍,只是鉴于本人电脑配置太差无法安装Oracle数据库,所以无法进行演示,再者是表示对原作者的尊重,所以在这里只是对原作内容进行翻译然后加上自己的理解稍作改动。应该能对大家使用Oracle+Dapper组合开发ASP.NET Core Web API 有所帮助。

本文的重点是介绍如何使用Dapper ORM+Oracle数据库的组合来创建ASP.NET Core Web API。首先,在这里,我们不使用SQL ,因为互联网上已有很多文章都是使用SQL Server进行演示的。所以,我想写一篇使用Oracle作为数据库的文章。为了降低数据库访问逻辑的复杂性,我们使用Dapper ORM。那么,让我们赶紧开始实战演练吧。

创建一个ASP.NET Core Web API 项目

如果要创建一个新的ASP.NET Core Web API项目的话,只需要打开Visual Studio 2017版本15.3及以上,然后按照以下步骤操作。

  1. 打开文件菜单,点击新建>>项目

  2. 在新打开的新建项目窗口,首先你需要选择 .NET Framework 4.6及以上版本,然后在左侧面板选择C# ,然后选择 .NET Core

  3. 在右侧面板中选择“.NET Core Web 应用程序” 并且选择项目位置,最后点击“确定”

  4. 在下一个窗口,在众多模板中选择Web API模板

    写如何新建ASP.NET Core Web API 的这些步骤的时候我都嫌累,我想大家应该都知道怎么创建吧!就不上图片了。

    设置Oracle表和存储过程

    首先要为演示创建数据库以及表,我们这里使用Oracle Developer Tools。因为它非常小巧灵活,可以帮助我们顺利的处理Oracle数据库。
    Oracle SQL Developer是一个免费的集成开发环境,可简化传统和云部署中Oracle数据库的开发和管理。SQL Developer提供完整的PL / SQL应用程序端到端开发,运行查询和脚本的工作表,用于管理数据库的DBA控制台,报告界面,完整的数据建模解决方案以及用于迁移第三方数据到Oracle的平台。
    创建一个名为“TEST_DB”的数据库名称,并在其中创建一个表名为“EMPLOYEE”。您可以使用以下语法在“TEST_DB”数据库中创建表。

 CREATE TABLE "TEST_DB"."EMPLOYEE"   (   "ID" NUMBER(10,0) GENERATED BY DEFAULT ON NULL AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 100 CACHE 20 NOORDER  NOCYCLE ,   
"NAME" VARCHAR2(255 BYTE),   
"SALARY" NUMBER(10,0),   
"ADDRESS" VARCHAR2(500 BYTE)  ) SEGMENT CREATION IMMEDIATE   PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255   NOCOMPRESS LOGGING   STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645   PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1   BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)   TABLESPACE "TEST_DATA" ;  

我们需要在表中添加一些虚拟数据,以便我们可以直接从PostMan获取数据。所以,我们在这里添加四条记录如下。

Insert into TEST_DB.EMPLOYEE (ID,NAME,SALARY,ADDRESS) values (100,'Mukesh',20000,'India');  Insert into TEST_DB.EMPLOYEE (ID,NAME,SALARY,ADDRESS) values (101,'Rion',28000,'US');  Insert into TEST_DB.EMPLOYEE (ID,NAME,SALARY,ADDRESS) values (102,'Mahesh',10000,'India');  Insert into TEST_DB.EMPLOYEE (ID,NAME,SALARY,ADDRESS) values (103,'Banky',20000,'India'); 

现在我们来创建一个存储过程,用来获取员工记录列表。这里我们使用Cursor返回数据列表作为输出参数。

CREATE OR REPLACE PROCEDURE "TEST_DB"."USP_GETEMPLOYEES" (  EMPCURSOR OUT SYS_REFCURSOR  
)  AS  Begin  Open EMPCURSOR For  SELECT ID, NAME, SALARY,ADDRESS FROM Employee;  End; 

下面我们再创建一个存储过程,它根据员工ID获取员工的个人记录

CREATE OR REPLACE PROCEDURE "TEST_DB"."USP_GETEMPLOYEEDETAILS"   (  EMP_ID IN INT,  EMP_DETAIL_CURSOR OUT SYS_REFCURSOR    
) AS   BEGIN  OPEN EMP_DETAIL_CURSOR FOR  SELECT ID, NAME, SALARY,ADDRESS FROM Employee WHERE ID = EMP_ID;  END;  

安装Dapper ORM

从“工具”菜单的“Nuget包管理器”中打开“包管理器控制台”,然后输入以下命令并按Enter键以安装dapper及其依赖项(如果有)

Install-Package Dapper -Version 1.50.5
当然还有另一个安装方式,具体可以看 [ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了][http://www.cnblogs.com/yilezhu/p/9241261.html] 中关于安装Swashbuckle.AspNetCore的步骤
安装完成后,你可以查看下项目大的引用中,是否有“Dapper”的引用,如果有的话表示安装正确

为项目安装Oracle Manage Data Access

我们在Asp.Net Core Web API应用程序中使用Oracle,需要从Core应用程序访问Oracle数据库。要将Oracle数据库与.Net Core应用程序一起使用,我们有Oracle库,它将帮助我们管理数据库访问的逻辑。因此,我们必须安装以下bata的软件包。

Install-Package Oracle.ManagedDataAccess.Core -Version 2.12.0-beta2

添加 Oracle 数据库连接

现在我们已准备好与数据库相关的所有内容,如数据库,表和SP等。要从Web API访问数据库,我们必须像往常一样在“appsettings.json”文件中创建连接字符串。

{  "Logging": {  "IncludeScopes": false,  "Debug": {  "LogLevel": {  "Default": "Warning"  }  },  "Console": {  "LogLevel": {  "Default": "Warning"  }  }  },  "ConnectionStrings": {  "EmployeeConnection": "data source=mukesh:1531;password=**********;user id=mukesh;Incr Pool Size=5;Decr Pool Size=2;"  }  
}  

创建一个仓储

为了保持关注点的分离,我们在这里使用Repository。在Web API项目中创建一个新文件夹作为“仓储库”,并创建一个“IEmployeeRepository”接口和一个它的实现类“EmployeeRepository”,它将实现到IEmployeeRepository。

namespace Core2API.Repositories  {  public interface IEmployeeRepository  {  object GetEmployeeList();  object GetEmployeeDetails(int empId);  }  
}  

以下是实现了IEmployeeRepository的EmployeeRepository类。它需要访问配置中的数据库连接串,因此我们在构造函数中注入IConfiguration。所以,我们已经准备好使用配置对象了。除此之外,我们还有GetConnection()方法,该方法将从appsettings.json获取连接字符串,并将其提供给OracleConnection以创建连接并最终返回连接。我们已经实现了“IEmployeeRepository”,它有两个方法,如GetEmployeeDetails和GetEmployeeList。

using Core2API.Oracle;  using Dapper;  using Microsoft.Extensions.Configuration;  using Oracle.ManagedDataAccess.Client;  using System;  using System.Data;  namespace Core2API.Repositories  {  public class EmployeeRepository : IEmployeeRepository  {  IConfiguration configuration;  public EmployeeRepository(IConfiguration _configuration)  {  configuration = _configuration;  }  public object GetEmployeeDetails(int empId)  {  object result = null;  try  {  var dyParam = new OracleDynamicParameters();  dyParam.Add("EMP_ID", OracleDbType.Int32, ParameterDirection.Input, empId);  dyParam.Add("EMP_DETAIL_CURSOR", OracleDbType.RefCursor, ParameterDirection.Output);  var conn = this.GetConnection();  if (conn.State == ConnectionState.Closed)  {  conn.Open();  }  if (conn.State == ConnectionState.Open)  {  var query = "USP_GETEMPLOYEEDETAILS";  result = SqlMapper.Query(conn, query, param: dyParam, commandType: CommandType.StoredProcedure);  }  }  catch (Exception ex)  {  throw ex;  }  return result;  }  public object GetEmployeeList()  {  object result = null;  try  {  var dyParam = new OracleDynamicParameters();  dyParam.Add("EMPCURSOR", OracleDbType.RefCursor, ParameterDirection.Output);  var conn = this.GetConnection();  if(conn.State == ConnectionState.Closed)  {  conn.Open();  }  if (conn.State == ConnectionState.Open)  {  var query = "USP_GETEMPLOYEES";  result = SqlMapper.Query(conn, query, param: dyParam, commandType: CommandType.StoredProcedure);  }  }  catch (Exception ex)  {  throw ex;  }  return result;  }  public IDbConnection GetConnection()  {  var connectionString = configuration.GetSection("ConnectionStrings").GetSection("EmployeeConnection").Value;  var conn = new OracleConnection(connectionString);             return conn;  }  }  
}  public IDbConnection GetConnection()  {  var connectionString = configuration.GetSection("ConnectionStrings").GetSection("EmployeeConnection").Value;  var conn = new OracleConnection(connectionString);             return conn;  
}  

为了在.Net Core中使用Oracle的数据类型,我们使用的是OracleDyamicParameters类,它将提供管理Oracle参数行为的一系列方法。

using Dapper;  using Oracle.ManagedDataAccess.Client;  using System.Collections.Generic;  using System.Data;  namespace Core2API.Oracle  
{  public class OracleDynamicParameters : SqlMapper.IDynamicParameters  {  private readonly DynamicParameters dynamicParameters = new DynamicParameters();  private readonly List<OracleParameter> oracleParameters = new List<OracleParameter>();  public void Add(string name, OracleDbType oracleDbType, ParameterDirection direction, object value = null, int? size = null)  {  OracleParameter oracleParameter;  if (size.HasValue)  {  oracleParameter = new OracleParameter(name, oracleDbType, size.Value, value, direction);  }  else  {  oracleParameter = new OracleParameter(name, oracleDbType, value, direction);  }  oracleParameters.Add(oracleParameter);  }  public void Add(string name, OracleDbType oracleDbType, ParameterDirection direction)  {  var oracleParameter = new OracleParameter(name, oracleDbType, direction);  oracleParameters.Add(oracleParameter);  }  public void AddParameters(IDbCommand command, SqlMapper.Identity identity)  {  ((SqlMapper.IDynamicParameters)dynamicParameters).AddParameters(command, identity);  var oracleCommand = command as OracleCommand;  if (oracleCommand != null)  {  oracleCommand.Parameters.AddRange(oracleParameters.ToArray());  }  }  }  
}  

在Startup.cs中配置依赖

如果要在控制器或仓储类中使用依赖项的话,我们必须配置或者说在Startup类的ConfigureServices方法中为我们的接口注册我们的依赖项类。 (翻译的好拗口,楼主四级没过,希望不被喷)

using Core2API.Repositories;  using Microsoft.AspNetCore.Builder;  using Microsoft.AspNetCore.Hosting;  using Microsoft.Extensions.Configuration;  using Microsoft.Extensions.DependencyInjection;  namespace Core2API  {  public class Startup  {  public Startup(IConfiguration configuration)  {  Configuration = configuration;  }  public IConfiguration Configuration { get; }  // This method gets called by the runtime. Use this method to add services to the container.  public void ConfigureServices(IServiceCollection services)  {  services.AddTransient<IEmployeeRepository, EmployeeRepository>();  services.AddSingleton<IConfiguration>(Configuration);  services.AddMvc();  }  // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.  public void Configure(IApplicationBuilder app, IHostingEnvironment env)  {  if (env.IsDevelopment())  {  app.UseDeveloperExceptionPage();  }  app.UseMvc();  }  }  
}  

添加 EmployeeController 控制器

现在是时候在EmployeeControler中创建API调用了。首先,我们在构造函数中添加了IEmployeeRepository以使用依赖项。其次,我们必须为两个方法创建带有Route属性的API调用。

using Core2API.Repositories;  using Microsoft.AspNetCore.Mvc;  namespace CoreAPI.Controllers  {  [Produces("application/json")]      public class EmployeeController : Controller  {  IEmployeeRepository employeeRepository;  public EmployeeController(IEmployeeRepository _employeeRepository)  {  employeeRepository = _employeeRepository;  }  [Route("api/GetEmployeeList")]  public ActionResult GetEmployeeList()  {  var result = employeeRepository.GetEmployeeList();  if (result == null)  {  return NotFound();  }  return Ok(result);              }  [Route("api/GetEmployeeDetails/{empId}")]  public ActionResult GetEmployeeDetails(int empId)  {  var result = employeeRepository.GetEmployeeDetails(empId);  if (result == null)  {  return NotFound();  }  return Ok(result);  }  }  
}  

现在我们已准备就绪,就像存储库已准备好,与Oracle数据库的连接已准备就绪,最后,API调用也在控制器内部就绪。因此,是时候在PostMan中运行API来查看结果了。只需按F5即可运行Web API然后打开PostMan进行测试。

要在PostMan中进行测试,首先选择“Get”作为方法,并提供URL以获取员工记录列表,然后单击“发送”按钮,该按钮将向我们的API发出请求并使用我们文章开始时创建的数据库脚本来获取我们在此处添加的员工列表数据。

640?wx_fmt=gif

要获取单个员工记录,只需传递以下URL,如图中所示。您可以在此处看到,我们希望查看员工ID 103的记录。发送请求后,您可以看到如下所示的输出。

640?wx_fmt=gif

最后

所以,今天,我们已经学会了如何创建ASP.NET Core Web API项目并使用Dapper与Oracle数据库一起使用。

我希望这篇文章能对你有所帮助。请使用评论来进行反馈,这有助于我提高自己的下一篇文章。如果您有任何疑问,请在评论部分发表你的疑问,如果您喜欢这篇文章,请与您的朋友分享。并记得点下推荐哦!

原文地址:https://www.c-sharpcorner.com/article/asp-net-core-web-api-with-oracle-database-and-dapper/
翻译人:依乐祝

总结

今天主要是翻译了一篇国外的使用Dapper以及Oracle的组合来开发asp.net core web api的教程!目的就是填补园子里使用Dapper以及Oracle的组合来开发asp.net core web api的空白!还有就是最近连续出差都没有更新文章了!接下来我会为大家介绍更多asp.net core 微服务相关的技术,希望大家持续关注!如果感觉博主写的还不错的话希望给个推荐!谢谢!

原文地址https://www.cnblogs.com/yilezhu/p/9276565.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

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

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

相关文章

一个c#开发的web绘流系统

本项目为Web版流程图绘图&#xff0c;兼容IE、FF、Chrome等各主流浏览器&#xff0c;提供了各类基础图形&#xff0c;至于如何应用及用来做什么就随各位了&#xff0c;常规的流程图及逻辑辅助、工作流等皆可胜任。本系统虽为开源项目&#xff0c;然精心调配开发测试&#xff0c…

【二进制】17倍

17倍 题目大意&#xff1a; 有一个二进制数&#xff0c;求它的17倍 原题: 题目描述&#xff1a; 在了解做软件开发可能赚很多的钱之后&#xff0c;农夫约翰也开了一家小的软件公司为客户写程序。约翰的第一个任务对他来说看起来相当简单&#xff1a;输入一个数N&#xff0…

图像处理作业第五次

第5次图像处理作业 1. 复习理解课本中最佳陷波滤波器进行图像恢复的过程&#xff0c;请推导出w(x,y)最优解的计算过程. 根据公式: σ21(2a1)(2b1)∑∑[g−wη−(gˉ−wηˉ)]2\sigma ^2 \frac{1}{(2a1)(2b1)}\sum\sum[g-w\eta - (\bar g-w\bar\eta)]^2σ2(2a1)(2b1)1​∑∑[g…

2020牛客国庆集训派对day8G-Shuffle Cards【Splay】

正题 题目链接:https://ac.nowcoder.com/acm/contest/7865/G 题目大意 nnn个数从1∼n1\sim n1∼n&#xff0c;mmm次拿出其中一段放到头部&#xff0c;求最终序列。 解题思路 用SplaySplaySplay拿出一段区间然后丢到头部就好了。 时间复杂度O(nlog⁡n)O(n\log n)O(nlogn) cod…

将系统分解为微服务的策略

几年前&#xff0c;Vladik Khononov和他的团队决定开始使用微服务&#xff0c;但是几个月后他们发现自己陷入了巨大的混乱之中。他在最近于伦敦Skills Matter举行的DDD eXchange 2018会议上指出&#xff0c;造成这一现象的原因在于&#xff0c;他们只专注于采用酷炫的新技术&am…

图像处理作业 第8次

图像处理作业 第8次 7.11 说明尺度函数ϕ(x)1,0.25≤x<0.75\phi(x)1 ,0.25 \le x\lt 0.75ϕ(x)1,0.25≤x<0.75并未满足多分辨率分析的第二个要求. ϕ1,0(x)2ϕ(2x)1\phi_{1,0}(x)\sqrt 2 \phi(2x)1ϕ1,0​(x)2​ϕ(2x)1 当且仅当满足0.125≤x<0.3750.125 \le x\lt 0…

【dfs】马蹄印

马蹄印 题目大意&#xff1a; 有一个只含括号的图&#xff0c;要你走一条路&#xff08;从左上角出发&#xff09;&#xff0c;使你走的路上的括号加在一起是先k个左括号再k个右括号组成的&#xff0c;要求k最大 原题&#xff1a; 题目描述&#xff1a; 虽然当奶牛贝里斯找…

P4852-yyf hates choukapai【单调队列优化dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4852 题目大意 给出n,m,c,dn,m,c,dn,m,c,d&#xff0c;有n∗cmn*cmn∗cm张卡牌。进行nnn次连抽mmm次单抽&#xff0c;连抽连续ccc张卡牌会获得第一张卡牌的欧气值&#xff0c;单抽可以获得抽到卡牌的欧气值。不能连续进行dd…

P4317-花神的数论题【组合数学】

正题 题目链接:https://www.luogu.com.cn/problem/P4317 题目大意 定义sum(i)sum(i)sum(i)表示iii二进制下111的个数 求∏i1nsum(i)\prod_{i1}^nsum(i)i1∏n​sum(i) 解题思路 考虑计算有iii个111的有多少个数字。 对于nnn的每一个111&#xff0c;我们可以知道如果这一位为…

【暴力】排队的奶牛

排队的奶牛 题目大意&#xff1a; 有一个序列&#xff0c;要你删去序列中的一类相同的数&#xff0c;然后求最长的相同数字段的长度 原题&#xff1a; 题目描述 农夫约翰的N只奶牛排成了一条直线&#xff0c;每只奶牛都有一个特定的标识序号&#xff0c;从左到右第i只奶牛…

NOIP2019 Emiya家今天的饭

NOIP2019 Emiya家今天的饭 ACM退役选手远程口胡 csf如今真的是太菜了,最后16分的做法愣是想了一下午 考虑使用容斥方法: 1 采用动态规划,先求出在无限制情况下,安排kkk种烹饪方法总的方案数. 记dp2[i][j]dp2[i][j]dp2[i][j]表示已经考虑完前iii种烹饪方法,共做了jjj个菜的方…

.NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

一、案例结构总览这里&#xff0c;假设我们有两个客户端&#xff08;一个Web网站&#xff0c;一个移动App&#xff09;&#xff0c;他们要使用系统&#xff0c;需要先向IdentityService进行Login以进行验证并获取Token&#xff0c;在IdentityService的验证过程中会访问数据库以…

牛客练习赛71C-数学考试【容斥,dp】

正题 题目链接:https://ac.nowcoder.com/acm/contest/7745/C 题目大意 求一nnn的排列&#xff0c;给mmm个限制pip_ipi​表示1∼pi1\sim p_i1∼pi​不能是pip_ipi​的排列。求方案数。 解题思路 定义fif_ifi​表示1∼pi1\sim p_i1∼pi​是pip_ipi​的排列的情况下1∼pi1\sim …

【DP】景观美化

景观美化 题目大意&#xff1a; 有n个花圃&#xff0c;里面有一定的泥土&#xff0c;可以将泥土运到别的花圃&#xff0c;也可以填入&#xff0c;也可以挖出&#xff0c;现在要改变花圃中的泥土数量&#xff0c;问最少花多少钱 原题&#xff1a; 题目描述&#xff1a; 农夫…

CentOS安装使用.netcore极简教程(免费提供学习服务器)

本文目标是指引从未使用过Linux的.Neter&#xff0c;如何在CentOS7上安装.Net Core环境&#xff0c;以及部署.Net Core应用。 仅针对CentOS&#xff0c;其它Linux系统类似&#xff0c;命令环节稍加调整&#xff1b;需要提前准备好服务器地址、用户名、密码&#xff1b;如果手上…

ASP.NET Core MVC+EF Core从开发到部署

笔记本电脑装了双系统&#xff08;Windows 10和Ubuntu16.04&#xff09;快半年了&#xff0c;平时有时间就喜欢切换到Ubuntu系统下耍耍Linux&#xff0c;熟悉熟悉Linux命令、Shell脚本以及Linux下的各种应用的安装、配置、运行。使用下来的感受是Linux确实相当好使&#xff0c;…

初一模拟赛(4.27)

成绩&#xff1a; rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf320320320100100100100100100100100100202020222hkyhkyhky296296296100100100100100100868686101010333wjjwjjwjj276276276100100100909090868686000444fyfyfy24824824810010010…

P4145-上帝造题的七分钟2/花神游历各国【并查集,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P4145 题目大意 一个序列要求支持 区间开根向下取整区间求和 解题思路 一个数开根约logloglog次就会到111&#xff0c;所以我们对于每个数记录一下开根多少次会到111&#xff0c;每次修改用并查集找还没到111的暴力修改树状…

网络流及建模专题(上)

前言 不断更新中…… 这几天新坑填不下去了&#xff0c;回来回顾一些经典的模型套路&#xff0c;先拿网络流开刀&#xff0c;窃以为洛谷这几道网络流的题目还是非常具有代表性的&#xff0c;涵盖了网络流调整、多解计数、最小割、最大权闭合子图问题。 还涵盖了图论&#xff0…

基于 websocket 实现的 im 实时通讯案例

分享利用 redis 订阅与发布特性&#xff0c;巧妙的现实高性能im系统。为表诚意&#xff0c;先贴源码地址&#xff1a;https://github.com/2881099/im下载源码后的运行方法&#xff1a;运行环境&#xff1a;.NETCore 2.1 redis-server 2.8下载Redis-x64-2.8.2402.zip&#xff0…