[译]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及以上,然后按照以下步驟操作。
打開文件菜單,點擊新建>>項目
在新打開的新建項目窗口,首先你需要選擇 .NET Framework 4.6及以上版本,然后在左側面板選擇C# ,然后選擇 .NET Core
在右側面板中選擇“.NET Core Web 應用程序” 并且選擇項目位置,最后點擊“確定”
在下一個窗口,在眾多模板中選擇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”數據庫中創建表。
我們需要在表中添加一些虛擬數據,以便我們可以直接從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發出請求并使用我們文章開始時創建的數據庫腳本來獲取我們在此處添加的員工列表數據。
要獲取單個員工記錄,只需傳遞以下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 微服務相關的技術,希望大家持續關注!如果感覺博主寫的還不錯的話希望給個推薦!謝謝!
原文地址:https://www.cnblogs.com/yilezhu/p/9276565.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結
以上是生活随笔為你收集整理的[译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软宣布ASP.NET Core 2.0
- 下一篇: 一个c#开发的web绘流系统