前言
雖然一直在說“去IOE化”,但是在國企和政府,Oracle的歷史包袱實(shí)在太重了,甚至很多業(yè)務(wù)邏輯都是寫在Oracle的各種存儲過程里面實(shí)現(xiàn)的……
我們的系統(tǒng)主要的技術(shù)棧是Django / Spring / AspNetCore,Java的不必說對Oracle支持肯定沒問題,關(guān)鍵在于Django對Oracle版本有要求,兼容性不是特別好,Oracle版本沒辦法隨意升級的,所以我想到用.Net Core來寫個中間層,讓其他系統(tǒng)可以方便的使用Oracle的數(shù)據(jù)和存儲過程…
ODP.NET Core是一個ADO.NET驅(qū)動程序,提供從Microsoft .NET Core客戶端到Oracle數(shù)據(jù)庫的快速數(shù)據(jù)訪問。它可以在Windows和Linux上運(yùn)行。ODP.NET由一個100%托管代碼動態(tài)鏈接庫Oracle.ManagedDataAccess.dll組成,可通過NuGet安裝獲得。
這個 Oracle.ManagedDataAccess.Core 是真的方便,不用安裝Oracle客戶端,兼容性、便捷性,反正就是開箱即用,一把梭就完事了
簡單使用
首先用nuget安裝這個 Oracle.ManagedDataAccess.Core ,之后就可以執(zhí)各類操作了,不過從代碼量上看還是比較繁瑣的,上代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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語句的代碼,有點(diǎn)長…… 吐了
再看看執(zhí)行存儲過程的…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
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); } |
這里去掉了錯誤處理,顯得短一點(diǎn),不過還是麻煩得不行……
所以這里我們要用Dapper這個輕量級ORM來簡化操作
使用Dapper
不多說,首先nuget安裝是常規(guī)操作,包名就是簡單的 Dapper 。
首先是增刪改查這類普通的SQL語句:
1
2
3
4
5
6
7
8
9
10
|
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 來執(zhí)行SQL就行了~ 返回的結(jié)果是 IEnumerable<dynamic> 類型,當(dāng)然你也可以在 Query 方法的泛型參數(shù)里指定返回的類型,我這里為了通用就不指定了
繼續(xù)看存儲過程的,很簡單,更上面的差不多,就多一個參數(shù)告訴程序我們的SQL類型是啥而已
1
2
3
4
5
6
7
8
|
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ù)的存儲過程咋辦?
很簡單(代碼來自官方例子)~
1
2
|
var user = cnn.Query<User>( "spGetUser" , new {Id = 1}, commandType: CommandType.StoredProcedure).SingleOrDefault(); |
ok,很方便,更多操作看Dapper文檔就完事了(我也是第一次接觸Dapper,之前都用FreeSQL和EFCore),此文完結(jié)~
Dapper項目主頁: https://github.com/StackExchange/Dapper
參考資料
.NET Core 使用ODP.NET Core連接操作Oracle數(shù)據(jù)庫: https://www.cjavapy.com/article/271/
元件開箱:Managed ODP.NET for Linux
到此這篇關(guān)于在.NetCore(C#)中使用ODP.NET Core+Dapper操作Oracle數(shù)據(jù)庫的文章就介紹到這了,更多相關(guān).NetCore操作Oracle數(shù)據(jù)庫內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://www.cnblogs.com/deali/p/14373329.html