在.NetCore(C#)中使用ODP.NET Core+Dapper操作Oracle數(shù)據(jù)庫(kù)
前言
雖然一直在說(shuō)“去IOE化”,但是在國(guó)企和政府,Oracle的歷史包袱實(shí)在太重了,甚至很多業(yè)務(wù)邏輯都是寫(xiě)在Oracle的各種存儲(chǔ)過(guò)程里面實(shí)現(xiàn)的……
我們的系統(tǒng)主要的技術(shù)棧是Django / Spring / AspNetCore,Java的不必說(shuō)對(duì)Oracle支持肯定沒(méi)問(wèn)題,關(guān)鍵在于Django對(duì)Oracle版本有要求,兼容性不是特別好,Oracle版本沒(méi)辦法隨意升級(jí)的,所以我想到用.Net Core來(lái)寫(xiě)個(gè)中間層,讓其他系統(tǒng)可以方便的使用Oracle的數(shù)據(jù)和存儲(chǔ)過(guò)程…
ODP.NET Core是一個(gè)ADO.NET驅(qū)動(dòng)程序,提供從Microsoft .NET Core客戶端到Oracle數(shù)據(jù)庫(kù)的快速數(shù)據(jù)訪問(wèn)。它可以在Windows和Linux上運(yùn)行。ODP.NET由一個(gè)100%托管代碼動(dòng)態(tài)鏈接庫(kù)Oracle.ManagedDataAccess.dll組成,可通過(guò)NuGet安裝獲得。
這個(gè) Oracle.ManagedDataAccess.Core 是真的方便,不用安裝Oracle客戶端,兼容性、便捷性,反正就是開(kāi)箱即用,一把梭就完事了
簡(jiǎn)單使用
首先用nuget安裝這個(gè) Oracle.ManagedDataAccess.Core ,之后就可以執(zhí)各類(lèi)操作了,不過(guò)從代碼量上看還是比較繁瑣的,上代碼:
var connStr = $"DATA SOURCE=127.0.0.1/db_name; PASSWORD=password; PERSIST SECURITY INFO=True; USER ID=user_id";
using (var conn = new OracleConnection(connStr)) {
using (var command = conn.CreateCommand()) {
try {
if (conn.State == ConnectionState.Closed) {
conn.Open();
}
command.BindByName = true;
command.CommandText = $"select * from table_name";
using (var reader = command.ExecuteReader()) {
while (reader.Read()) {
Console.WriteLine(reader.GetString("DEPART_NAME"));
}
}
}
catch (Exception ex) {
Console.WriteLine(ex.StackTrace);
Console.WriteLine(ex.Source);
Console.WriteLine(ex.Message);
}
}
}
這就是執(zhí)行 select * from table_name 這條SQL語(yǔ)句的代碼,有點(diǎn)長(zhǎng)…… 吐了
再看看執(zhí)行存儲(chǔ)過(guò)程的…
var connStr = $"DATA SOURCE=127.0.0.1/db_name; PASSWORD=password; PERSIST SECURITY INFO=True; USER ID=user_id";
using (var conn = new OracleConnection(connStr)) {
conn.Open();
var command = new OracleCommand("proc_name", conn) {
CommandType = CommandType.StoredProcedure
};
// 輸入?yún)?shù)
command.Parameters.Add(new OracleParameter("id", "0001"));
// 輸出參數(shù)
var vOut = new OracleParameter("v_out",
OracleDbType.Varchar2,
1000,
"",
ParameterDirection.InputOutput
);
command.Parameters.Add(vOut);
var affectRows = command.ExecuteNonQuery();
Console.WriteLine(vOut.Value);
}
這里去掉了錯(cuò)誤處理,顯得短一點(diǎn),不過(guò)還是麻煩得不行……
所以這里我們要用Dapper這個(gè)輕量級(jí)ORM來(lái)簡(jiǎn)化操作
使用Dapper
不多說(shuō),首先nuget安裝是常規(guī)操作,包名就是簡(jiǎn)單的 Dapper 。
首先是增刪改查這類(lèi)普通的SQL語(yǔ)句:
using Dapper;
var connStr = $"DATA SOURCE=127.0.0.1/db_name; PASSWORD=password; PERSIST SECURITY INFO=True; USER ID=user_id";
using var cn = new OracleConnection(connStr);
var result = cn.Query("select * from table_name");
foreach (var item in result) {
Console.WriteLine(item);
}
可以看到引入Dapper之后只要使用 OracleConnection 的擴(kuò)展方法 Query 來(lái)執(zhí)行SQL就行了~ 返回的結(jié)果是 IEnumerable<dynamic> 類(lèi)型,當(dāng)然你也可以在 Query 方法的泛型參數(shù)里指定返回的類(lèi)型,我這里為了通用就不指定了
繼續(xù)看存儲(chǔ)過(guò)程的,很簡(jiǎn)單,更上面的差不多,就多一個(gè)參數(shù)告訴程序我們的SQL類(lèi)型是啥而已
var connStr = $"DATA SOURCE=127.0.0.1/db_name; PASSWORD=password; PERSIST SECURITY INFO=True; USER ID=user_id";
using var cn = new OracleConnection(connStr);
var result = cn.Query("proc_name", commandType: CommandType.StoredProcedure);
foreach (var item in result) {
Console.WriteLine(item);
}
如果是有帶參數(shù)的存儲(chǔ)過(guò)程咋辦?
很簡(jiǎn)單(代碼來(lái)自官方例子)~
var user = cnn.Query<User>("spGetUser", new {Id = 1},
commandType: CommandType.StoredProcedure).SingleOrDefault();
ok,很方便,更多操作看Dapper文檔就完事了(我也是第一次接觸Dapper,之前都用FreeSQL和EFCore),此文完結(jié)~
Dapper項(xiàng)目主頁(yè): https://github.com/StackExchange/Dapper
參考資料
.NET Core 使用ODP.NET Core連接操作Oracle數(shù)據(jù)庫(kù): https://www.cjavapy.com/article/271/
元件開(kāi)箱:Managed ODP.NET for Linux
到此這篇關(guān)于在.NetCore(C#)中使用ODP.NET Core+Dapper操作Oracle數(shù)據(jù)庫(kù)的文章就介紹到這了,更多相關(guān).NetCore操作Oracle數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ASP.NET MVC4 HtmlHelper擴(kuò)展類(lèi),實(shí)現(xiàn)分頁(yè)功能
本文主要做了一個(gè)HtmHelper類(lèi)的分頁(yè)擴(kuò)展函數(shù),方便在視圖中調(diào)用,有需要的朋友可以參考一下,希望對(duì)大家有所幫助。2016-03-03
ASP.NET?Core通過(guò)Microsoft.AspNetCore.App元包簡(jiǎn)化程序集引用
這篇文章介紹了ASP.NET?Core通過(guò)Microsoft.AspNetCore.App元包簡(jiǎn)化程序集引用的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
asp.net SqlParameter如何根據(jù)條件有選擇的添加參數(shù)
有時(shí)候?qū)憇ql語(yǔ)句的時(shí)候會(huì)根據(jù)方法傳進(jìn)來(lái)的參數(shù)來(lái)判斷sql語(yǔ)句中where條件的參數(shù),下面有個(gè)示例,大家可以參考下2014-06-06
ASP.NET泛型四之使用Lazy<T>實(shí)現(xiàn)延遲加載
這篇文章介紹了ASP.NET泛型使用Lazy<T>實(shí)現(xiàn)延遲加載的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
使用grpcui測(cè)試ASP.NET core的gRPC服務(wù)
這篇文章介紹了使用grpcui測(cè)試ASP.NET core gRPC服務(wù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
.NET之后臺(tái)用戶權(quán)限管理實(shí)現(xiàn)
在功能性比較強(qiáng)大的后臺(tái)管理網(wǎng)站處于各種角度考慮多有應(yīng)用權(quán)限管理功能。以公司內(nèi)部管理系統(tǒng)為例,管理員根據(jù)不同員工所在不同部門(mén)賦予其不同權(quán)限,或者根據(jù)上下級(jí)隸屬關(guān)系實(shí)現(xiàn)“金字塔”管理。本文內(nèi)容有不盡不實(shí)之處懇請(qǐng)指正。2013-02-02
WinForm中窗體間的數(shù)據(jù)傳遞交互的一些方法
通過(guò)子窗口向外引發(fā)一個(gè)事件,父窗口去實(shí)現(xiàn)該事件,我們可以再不關(guān)閉父窗口和子窗口的情況下進(jìn)行數(shù)據(jù)的傳輸顯示2012-12-12
ASP.NET Core為Ocelot網(wǎng)關(guān)配置Swagger
這篇文章介紹了ASP.NET Core為Ocelot網(wǎng)關(guān)配置Swagger的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
asp.net頁(yè)面?zhèn)髦禍y(cè)試實(shí)例代碼(前后臺(tái))
本文為大家詳細(xì)介紹下asp.net頁(yè)面?zhèn)髦档木唧w實(shí)現(xiàn),感興趣的朋友可以參考下哈,本人水平有限,還請(qǐng)各位朋友多多指教2013-06-06

