.NET Core 版本已推進到 2.0,但對我而言,相關元件、程式庫的支援度才是能否用於工作的關鍵。最近有則好消息 – Oracle 在這個月推出 ODP.NET Core 12.2 Beta,感覺在工作專案使用 .NET Core 的日子又更近了~

工作環境常會存取 Oracle 資料庫,.NET Core 再好用,連不上資料庫也是白搭。ODP.NET Core 補上這塊拼圖,背後的另一層意義是 Oracle 也已正式將 .NET Core 納入支援平台!(雖然 Oracle 支援 .NET 的腳步向來不快,過去常需靠第三方程式庫墊檔,例如千呼萬喚始出來的 Oracle 官方版 Entity Framework姍姍來遲的好物 – Managed ODP.NET)

ODP.NET Core 12.2 Beta 目前尚未放上 NuGet,要測試需自行從官網下載安裝,ZIP 檔裡有一個 Oracle.ManagedDataAccess.dll 及一份 PDF 說明文件。不出意外的好消息是 ODP.NET Core 採 Managed ODP.NET,使用時不需安裝 Oracle Client。與 .NET Framework 版相比,ODP.NET Core 少了一些 API,部分來自於 .NET Core 本身限制,例如: ConfigurationManager、RegistryKey、EventLog、分散式交易、Code Access Security... 等,其餘功能如 Entity Framework(System.Data.Metadata.Edm)、DbProviderFactories、DirectoryServices 則計劃在 .NET Core 2.1 或之後加入。

期待以久的產品上市,當然要馬上開箱測試一下。用 Visual Studio 2017 建立一個 .NET Core Console App 專案:

使用 Add Reference 瀏覽找到剛才下載的 Oracle.ManagedDataAccess.dll:

加入後 Oracle.ManagedDataAccess.dll 應該要出現在 Dependencies\Assemblies 下:

Dapper 老早就支援 .NET Core,用 NuGet 即可安裝。寫資料庫程式不必扯出一堆囉嗦的 OracleCommand、OracleParameter、OracleDataReader 就是爽!

排版顯示純文字
using System;
using System.Linq;
using Oracle.ManagedDataAccess.Client;
using Dapper;
 
namespace OdpNetCore
{
    class Program
    {
        private static string cs = "data source=BLAH;user id=BLAH;password=***";
        static void Main(string[] args)
        {
            Console.WriteLine("ODP.NET Core Test");
            using (var cn = new OracleConnection(cs))
            {
                var text = cn.Query<string>("SELECT :t AS T FROM DUAL", 
                    new { t = "Hurray"}).Single();
                Console.WriteLine(text);
            }
            Console.Read();
        }
    }
}

寫好程式,在 VS2017 按 F5 測試 OK!

重頭戲來了,一模一樣的程式搬到 Linux 也能跑,這才是 .NET Core 的價值所在。

使用 Publish 產生部署用的檔案。(較詳細的 .NET Core 部署說明可參考 試駕體驗-小工具程式 .NET Core 1.1 版試寫)

在 Linux 主機確認裝妥 .NET Core 2.0 (安裝步驟請參考官方文件),將上述檔案與 TNSNAMES.ORA 複製到同一目錄下,執行 dotnet AppName.dll,我們的 .NET 程式就從 Linux 連上 Oracle 資料庫,酷!

註:TNSNAMES.ORA 除了與程式放在同一目錄,也可放在共用目錄(例如: /etc/oracle/network/admin) 再設定環境參數 export TNS_ADMIN=/etc/oracle/network/admin


Comments

Be the first to post a comment

Post a comment