專案環境
- Visual Studio 2019
- .Net Framework 4.5
- Oracle SQL 12c
- C# WinForms 專案
- 沒有安裝Oracle Client
1. 安裝library
打開管理NuGet套件,根據自己.Net Framework下載相對應的版本
補充說明:
- 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. 以下為參考資料:
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(); } }
補充說明:
沒有留言:
張貼留言