本文首发自:博客园html
文章地址: http://www.javashuo.com/article/p-eomhwuat-ne.htmlweb
若是想深刻了解.NET Core中使用Dapper操做Oracle存储过程最佳实践,请查阅这篇文章https://www.cnblogs.com/yilezhu/p/10791877.html。包含对OracleDynamicParameters
的清真实现。sql
园子里关于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 有所帮助。json
本文的重点是介绍如何使用Dapper ORM+Oracle数据库的组合来建立ASP.NET Core Web API。首先,在这里,咱们不使用SQL ,由于互联网上已有不少文章都是使用SQL Server进行演示的。因此,我想写一篇使用Oracle做为数据库的文章。为了下降数据库访问逻辑的复杂性,咱们使用Dapper ORM。那么,让咱们赶忙开始实战演练吧。c#
若是要建立一个新的ASP.NET Core Web API项目的话,只须要打开Visual Studio 2017版本15.3及以上,而后按照如下步骤操做。api
在下一个窗口,在众多模板中选择Web API模板oracle
写如何新建ASP.NET Core Web API 的这些步骤的时候我都嫌累,我想你们应该都知道怎么建立吧!就不上图片了。app
首先要为演示建立数据库以及表,咱们这里使用Oracle Developer Tools。由于它很是小巧灵活,能够帮助咱们顺利的处理Oracle数据库。
Oracle SQL Developer是一个免费的集成开发环境,可简化传统和云部署中Oracle数据库的开发和管理。SQL Developer提供完整的PL / SQL应用程序端到端开发,运行查询和脚本的工做表,用于管理数据库的DBA控制台,报告界面,完整的数据建模解决方案以及用于迁移第三方数据到Oracle的平台。
建立一个名为“TEST_DB”的数据库名称,并在其中建立一个表名为“EMPLOYEE”。您可使用如下语法在“TEST_DB”数据库中建立表。asp.net
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;
从“工具”菜单的“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”的引用,若是有的话表示安装正确
咱们在Asp.Net Core Web API应用程序中使用Oracle,须要从Core应用程序访问Oracle数据库。要将Oracle数据库与.Net Core应用程序一块儿使用,咱们有Oracle库,它将帮助咱们管理数据库访问的逻辑。所以,咱们必须安装如下bata的软件包。
Install-Package Oracle.ManagedDataAccess.Core -Version 2.12.0-beta2
如今咱们已准备好与数据库相关的全部内容,如数据库,表和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类的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(); } } }
如今是时候在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发出请求并使用咱们文章开始时建立的数据库脚原本获取咱们在此处添加的员工列表数据。
要获取单个员工记录,只需传递如下URL,如图中所示。您能够在此处看到,咱们但愿查看员工ID 103的记录。发送请求后,您能够看到以下所示的输出。
因此,今天,咱们已经学会了如何建立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 微服务相关的技术,但愿你们持续关注!若是感受博主写的还不错的话但愿给个推荐!谢谢!