本文首發自:博客園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 微服務相關的技術,但願你們持續關注!若是感受博主寫的還不錯的話但願給個推薦!謝謝!