2017-07-04

Dapper 讀取 Oracle 資料

Dapper 身為輕量級 ORM 的神器,自從蔡煥麟老師 - 好用的微型 ORM:Dapper 與 黑大 - 短小精悍的.NET ORM神器-- Dapper 撰文推廣後,讓愈來愈多人了解到 Dapper 的強大之處。而身為 ORM 愛用者,我也大量應用在實際專案上,使用上非常輕鬆寫意,直到後來工作上的 database 由 SQL Server 轉換為 Oracle

今天又遇到相同錯誤,紀錄一下,以後再遇到比較好抄XD


原始寫法

string cnstr = "Data source=YowkoOracle;User id=YowkoOracle_WRITE;Password=password;";
using (var cn = new System.Data.OracleClient.OracleConnection(cnstr))
{
 cn.Open();

 var result = cn.Query<string>(@"select TOKEN from TRIGGERTOKEN where ISACTIVE=1 and TOKEN=:token", new { token = "3D5998FASDF4531FDSAF64A4E" }).FirstOrDefault();
 result.Dump();
}

OracleConnection is Obsolete

1obsolete

既然微軟已標記為過時,當然就不該繼續使用,避免出現 bug 跟可能的問題

改使用 Oracle.DataAccess.Client

  • 使用 x86 版本
    • NuGet 下載

      2x86

    • ID:Oracle.DataAccess.x86
  • 實際 x64 版本無法成功連線
    • NuGet 下載

      3x64

    • ID:Oracle.ManagedDataAccess
    • x64 namespace 與 x86 不同,要留意

      using (var cn = new Oracle.ManagedDataAccess.Client.OracleConnection(cnstr))

    • 錯誤訊息:ORA-12154: TNS: 無法解析指定的連線 ID

      4error

  • 2017/11/18 重新 review 後,發現內文有錯,待修正後會補上正確用法連結
  • 完整程式碼
    string cnstr = "Data source=YowkoOracle;User id=YowkoOracle_WRITE;Password=password;";
      using (var cn = new Oracle.DataAccess.Client.OracleConnection(cnstr))
      {
       cn.Open();
    
       var result = cn.Query<string>(@"select TOKEN from TRIGGERTOKEN where ISACTIVE=1 and TOKEN=:token", new { token = "3D5998FASDF4531FDSAF64A4E" }).FirstOrDefault();
       result.Dump();
      }
    

參數與 SQL Server 用法不同

Oracle 與 SQL Server 在 sql secript 中使用參數寫法不同

  1. Oracle 寫法為 :Variable
    var result = cn.Query<string>(@"select TOKEN from TRIGGERTOKEN where ISACTIVE=1 and TOKEN=:token", new { token = "3D5998FASDF4531FDSAF64A4E" }).FirstOrDefault();
    
  2. SQL Server 寫法為 @Variable
    var list = cn.Query<Guid>("SELECT TOKEN FROM [TRIGGERTOKEN] where isActive=1 and token=@token", new { token = "3D5998FASDF4531FDSAF64A4E" }).FirstOrDefault();
    

心得

不知道是不是我不熟悉 Oracle 的關係,覺得 dapper 連線 Oracle 要注意的東西還不少,這個不做筆記,我想下次我還是會花不少時間

參考資訊

  1. Dapper連接Oracle
  2. 好用的微型 ORM:Dapper
  3. 短小精悍的.NET ORM神器-- Dapper

沒有留言:

張貼留言