前言
Oracle 關係數據庫系統是目前世界上流行的關係數據庫管理系統,系統可移植性好、使用方便、功能強,適用於各類大、中、小、微機環境。它是一種高效率、可靠性好的 適應高吞吐量的數據庫解決方案。
現在的系統主要的技術棧是Java / .Net Core,Java方面不必說對Oracle支持肯定沒問題,.Net Core很少會使用到 Oracle數據庫。目前我現開發的項目是.Net Core與 Oracle 數據庫,所以我想到用.Net Core來寫個Oracle數據庫訪問層,可以方便的使用Oracle的數據和存儲過程。
ODP.NET Core是一個ADO.NET驅動程序,提供從Microsoft .NET Core客戶端到Oracle數據庫的快速數據訪問。它可以在Windows和Linux上運行。ODP.NET由一個100%託管代碼動態鏈接庫Oracle.ManagedDataAccess.dll組成,可通過NuGet安裝獲得。
這個Oracle.ManagedDataAccess.Core
是真的方便,不用安裝Oracle客戶端,兼容性、便捷性,開箱即用。
簡單使用
首先用nuget安裝這個Oracle.ManagedDataAccess.Core
,之後就可以執各類操作了,不過從代碼量上看還是比較繁瑣的,上代碼:
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);
}
}
}
這就是執行select * from table_name
這條SQL語句的代碼,類似C#中的DBHelper類。
再看看執行存儲過程的…
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
};
// 輸入參數
command.Parameters.Add(new OracleParameter("id", "0001"));
// 輸出參數
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安裝是常規操作,包名就是簡單的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
來執行SQL就行了,返回的結果是IEnumerable<dynamic>
類型,當然你也可以在Query
方法的泛型參數裏指定返回的類型,我這裏爲了通用就不指定了。
繼續看存儲過程的,很簡單,更上面的差不多,就多一個參數,指定一下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);
}
如果是有帶參數的存儲過程如何處理
直接上代碼
var user = cnn.Query<User>("spGetUser", new {Id = 1},
commandType: CommandType.StoredProcedure).SingleOrDefault();
是不是很方便,更多操作看Dapper文檔(本人也是第一次接觸Dapper,之前都用EFCore和SqlSugar)
參考資料
- .NET 連接操作Oracle數據庫:Oracle官網Demo地址
- Dapper項目主頁:https://github.com/StackExchange/Dapper