站長留言

  • ✅ 本站維護及更新歷史紀錄,詳情請參考公告
  • ✅ 有任何意見、想法,歡迎留言給Spicy知道喔
  • ✅ 固定於每周一至周五更新Blogger文章,周末不定期
程式資料庫C#

【Dapper】EP1:Oracle ManagedDataAccess與Dapper的相遇,一起合作從Oracle資料庫將資料Select出來


專案環境

  • Visual Studio 2019
  • .Net Framework 4.5
  • Oracle SQL 12c
  • C# WinForms 專案
  • 沒有安裝Oracle Client

1. 安裝library

打開管理NuGet套件,根據自己.Net Framework下載相對應的版本
  • Oracle ManagedDataAccess
  • Dapper

補充說明:
  • Oracle ManagedDataAccess安裝後,會在App.config自動生成一些設定,但這些設定可能造成主程式錯誤,建議刪除
  • Oracle ManagedDataAccess與資料庫建立連線時,可能會出現該錯誤- 'OracleInternal.NotificationServices.ONSException' in Oracle.ManagedDataAccess.dll,而且出現6次,但不會造成主程式終止。若想修正此錯誤,則參考資料 🔗,可於connectionString中加入:  
load balancing=false;ha events=false;

2. 撰寫ConnectionString

通常ConnectionString都會放在App.config中進行管理
<connectionStrings>  
  <add name="test_ConnectionString" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={your server}})(PORT={your port}}))(CONNECT_DATA=(SERVICE_NAME={service name})));User Id={user id};Password={password};" />
</connectionStrings>

3.撰寫Service並建立連線

為什麼要用Oracle ManagedDataAccess?

1. 其實專案原本是用OleDb Connection,但使用這個library去跟Oracle SQL建立連線的話,作業系統環境需要另外安裝Oracle Client,蠻麻煩的
2. 所以才另外找尋辦法,剛好Oracle和微軟官方推薦他們自己寫的library- Oracle ManagedDataAccess
3. 以下為參考資料:
namespace Test.Services
{
    class ServiceTest
    {
        private readonly string connectionString = ConfigurationManager.ConnectionStrings["test_ConnectionString"].ConnectionString;
        
        public OracleConnection GetConnection()
        {
            // 從app.config取資料庫設定    
            return new OracleConnection(this.connectionString);
        }
        
        ...
    }
}

4. 簡介要撈的table

主要目標是將所有設備撈出來,但會join到設備類型的table
  • EQP:id, unit, name, type
  • EQP_TYPE:id, name, items, fab

5. 建立Entities

基本上,就是按照EQP、EQP_TYPE欄位的名稱及類型創建

注意事項

  • class屬性名稱要跟SQL的欄位名稱相同
  • 若有外鍵(FK)關係,其id類型可以不寫int,直接寫該物件類型,並於步驟6利用參數map告訴Dapper要映射的對象
  • 用不到的欄位可以不寫在Entities的屬性中

EQP

namespace Test.Models
{
    class EQP
    {
        public int ID { get; set; }
        public string UNIT { get; set; }
        public string NAME { get; set; }
        public EQPType TYPE { get; set; }
    }
}

EQP_TYPE

namespace Test.EQPType
{
    class ServiceTest
    {
        public int ID { get; set; }
        public string FAB { get; set; }
        public string NAME { get; set; }
        public string ITEMS { get; set; }
        
        // 用不到的欄位可以不寫,例如我在這個專案用不到C1~C15
    }
}

6. Select Data from Oracle SQL by Dapper

為什麼要用Dapper?

1. library檔案很小
2. 效率可能比較好
3. 撰寫出來的程式就是簡潔、易於維護,無法接受傳統 ADO.NET 的複雜寫法
4. 以下為參考資料:

注意事項

  • 利用語法糖 using,管理資料庫連線open, close
  • 利用語法糖字串前方加@,string可以多行或直接撰寫跳脫字元
  • 利用語法糖 $-字串插補,參考官方文件 🔗
  • 利用語法糖 lambda 運算式及匿名類別
  • SQL字串不可用變數相加,應避免SQL Injection
  • SQL字串不可分號;結尾
  • Oracle SQL是用冒號:,而不是@
  • 外鍵放在該table物件的最後一個,否則會splitOn錯誤
public List<EQP> GetEQPs()
{  
    string sql = $@"SELECT eqp.ID, eqp.UNIT, eqp.NAME, eqp.TYPE, type.ID, type.NAME, type.ITEMS, type.FAB
        FROM {TableEQP} eqp
        INNER JOIN {TableEQPType} type ON eqp.TYPE = type.ID
        WHERE type.FAB IN :fabs";
    using (OracleConnection conn = this.GetConnection())
    {
        return eqps = conn.Query<EQP, EQPType, EQP>(
sql, map: (eqp, type) => { eqp.TYPE = type; return eqp; }, splitOn: "TYPE", param: new { fabs = new[] { "A廠", "B廠", "C廠" } }).ToList(); } }

補充說明:

延伸閱讀

沒有留言:

張貼留言

本網站建議使用電腦或平板瀏覽