在.NetCore(C#)中使用ODP.NET Core+Dapper操作Oracle數(shù)據(jù)庫
前言
雖然一直在說“去IOE化”,但是在國企和政府,Oracle的歷史包袱實在太重了,甚至很多業(yè)務(wù)邏輯都是寫在Oracle的各種存儲過程里面實現(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上運行。ODP.NET由一個100%托管代碼動態(tài)鏈接庫Oracle.ManagedDataAccess.dll組成,可通過NuGet安裝獲得。
這個 Oracle.ManagedDataAccess.Core 是真的方便,不用安裝Oracle客戶端,兼容性、便捷性,反正就是開箱即用,一把梭就完事了
簡單使用
首先用nuget安裝這個 Oracle.ManagedDataAccess.Core ,之后就可以執(zhí)各類操作了,不過從代碼量上看還是比較繁瑣的,上代碼:
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語句的代碼,有點長…… 吐了
再看看執(zhí)行存儲過程的…
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); }
這里去掉了錯誤處理,顯得短一點,不過還是麻煩得不行……
所以這里我們要用Dapper這個輕量級ORM來簡化操作
使用Dapper
不多說,首先nuget安裝是常規(guī)操作,包名就是簡單的 Dapper 。
首先是增刪改查這類普通的SQL語句:
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 的擴展方法 Query 來執(zhí)行SQL就行了~ 返回的結(jié)果是 IEnumerable<dynamic> 類型,當(dāng)然你也可以在 Query 方法的泛型參數(shù)里指定返回的類型,我這里為了通用就不指定了
繼續(xù)看存儲過程的,很簡單,更上面的差不多,就多一個參數(shù)告訴程序我們的SQL類型是啥而已
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ù)的存儲過程咋辦?
很簡單(代碼來自官方例子)~
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ASP.NET在MVC中MaxLength特性設(shè)置無效的解決方法
這篇文章主要介紹了ASP.NET在MVC中MaxLength特性設(shè)置無效的解決方法,涉及對MVC中表單元素屬性的應(yīng)用技巧,需要的朋友可以參考下2014-11-11SignalR Self Host+MVC等多端消息推送服務(wù)(一)
這篇文章主要為大家詳細(xì)介紹了SignalR Self Host+MVC等多端消息推送服務(wù),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06asp.net 數(shù)據(jù)綁定時對數(shù)據(jù)列做個性化處理
asp.net 數(shù)據(jù)綁定時對數(shù)據(jù)列做個性化處理,需要的朋友可以參考下。2011-12-12CheckBoxList兩列并排編譯為表格顯示具體實現(xiàn)
CheckBoxList兩列并排的顯示效果相比大家都有見到過吧,下面是具體的實現(xiàn)代碼,感興趣的朋友可以參考下哈2013-05-05Asp.net獲取服務(wù)器指定文件夾目錄文件并提供下載的方法
這篇文章主要介紹了Asp.net獲取服務(wù)器指定文件夾目錄文件并提供下載的方法,涉及使用http協(xié)議操作文件的技巧,需要的朋友可以參考下2015-01-01asp.net SqlHelper數(shù)據(jù)訪問層的使用
如果不使用數(shù)據(jù)訪問層,那么你的代碼里會出現(xiàn)很多SqlConnection、SqlCommand、SqlDataReader、Open、 Close……這些類和方法,而且代碼量很大,讓你不勝其煩,而且代碼寫起來,其實都是體力活,沒有技術(shù)含量。2008-09-09