專案環境
- 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();
}
}
補充說明:



沒有留言:
張貼留言