[譯]ASP.NET Core Web API 中使用Oracle資料庫和Dapper看這篇就夠了

来源:https://www.cnblogs.com/yilezhu/archive/2018/07/07/9276565.html
-Advertisement-
Play Games

[譯]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及以上,然後按照以下步驟操作。

  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發出請求並使用我們文章開始時創建的資料庫腳本來獲取我們在此處添加的員工列表數據。

ASP.NET Core Web Api

要獲取單個員工記錄,只需傳遞以下URL,如圖中所示。您可以在此處看到,我們希望查看員工ID 103的記錄。發送請求後,您可以看到如下所示的輸出。

ASP.NET Core

最後

所以,今天,我們已經學會瞭如何創建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 微服務相關的技術,希望大家持續關註!如果感覺博主寫的還不錯的話希望給個推薦!謝謝!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一步:頁面分析 我們要抓取的商品頁面: 這裡我們用正則表達式匹配出該段信息。進一步可以發現它是一個json數據,用json.loads()解析。解析後我們可以藉助線上工具可以查看數據的層級結構,找到需要數據的key。這裡我們把頁面分析與數據提取放到一塊來講了,代碼邏輯: 第三步:開始抓取 第四步: ...
  • 在我們碼字過程中,單元測試是必不可少的。但在從業過程中,很多開發者卻對單元測試望而卻步。有些時候並不是不想寫,而是常常會碰到諸如不能模擬一次HTTP請求,不能讀取配置文件,測試類的構造參數太多等問題,讓開發者放下了碼字的腳步。這些問題確實存在,但它們阻止不了我們那顆要寫單元測試的心。單元測試的優點很... ...
  • 在很多時候我們在生成C#exe文件時,如果在工程里調用了dll文件時,那麼如果不加以處理的話在生成的exe文件運行時需要連同這個dll一起轉移,相比於一個單獨乾凈的exe,這種形式總歸讓人不爽,那麼有辦法讓生成的軟體中直接就包含這個dll文件嗎,這樣就可以不用dll跟著exe走了,避免單獨不能運行的 ...
  • 前幾天做項目用到了動軟代碼生成器 對剛出社會的我來說可以說什麼都不知道,對此趕緊學習了一下才發現這是李天平老師開發的軟體膜拜一下! 以此總結一下 1.軟體基本使用 我在百度下載的是V2.78版的 添加伺服器 選擇要連接的資料庫 點擊連接/測試 看是否成功,同時選擇要連接的資料庫,不然載入全部庫要等好 ...
  • 在學完了C#的方法和數據類型之後,寫了一個簡易的計算器的界面。本次界面具備加減乘除求餘等五項運算。不過存在一點缺陷就是無法判斷輸入數據的類型,是整數還是小數,由於目前所學知識有限,等學到以後再進行完善。 本設計源代碼如下: using System; using System.Collections ...
  • 這個系列文章介紹的是Identity Server 4 的 Hybrid Flow, 前兩篇文章介紹瞭如何保護MVC客戶端, 本文介紹如何保護API資源. 保護MVC客戶端的文章: https://www.cnblogs.com/cgzl/p/9253667.html, https://www.cn ...
  • 前言 距離上一篇文章《基於EF Core的Code First模式的DotNetCore快速開發框架》已過去大半個年頭,時光荏苒,歲月如梭。。。比較尷尬的是,在這大半個年頭裡,除了日常帶娃溜娃做飯,偶爾接幾個私單外,個人開源項目幾乎沒啥動靜。那麼日常工作幹些什麼呢?肯定是堅守Nfx啊。。。為什麼呢? ...
  • 參考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重點: 實現多級子目錄的壓縮,類似winrar,可以選擇是否排除基準目錄 1 public void ZipDirectoryTest() ... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...