在.NetCore(C#)中使用ODP.NET Core+Dapper操作Oracle數據庫

前言

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)

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章