[譯]ASP.NET Core Web API 中使用Oracle資料庫和Dapper看這篇就夠了 本文首發自:博客園 文章地址: https://www.cnblogs.com/yilezhu/p/9276565.html 園子里關於ASP.NET Core Web API的教程很多,但大多都是使 ...
[譯]ASP.NET Core Web API 中使用Oracle資料庫和Dapper看這篇就夠了
本文首發自:博客園
文章地址: https://www.cnblogs.com/yilezhu/p/9276565.html
園子里關於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”資料庫中創建表。
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發出請求並使用我們文章開始時創建的資料庫腳本來獲取我們在此處添加的員工列表數據。
要獲取單個員工記錄,只需傳遞以下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 微服務相關的技術,希望大家持續關註!如果感覺博主寫的還不錯的話希望給個推薦!謝謝!