2016年2月4日 星期四

C# 連接 Oracle Database

由於公司接了一單水務署的工程,需要連接他們的Oracle Database,並拿走少量的數據放進Mysql裡面,在做的過程中,小人從中得知連接Oracle比連接SQL Server、MySQL較為複雜(好似係‧‧‧),所以訂立此帖以作紀錄。

1‧下載Oracle 的ODAC

由於水務署通常使用的系統、設備都 比較舊 (例如:Windows OS、Web Broswer),所以下載低version就 一定無死了 可以了,果然他們使用的是10g (冒汗‧‧‧2016年了‧‧‧)



2‧將已下載的檔案unzip、並將下圖的file轉移至Visual Studio的專案內

只有Oracle.DataAccess.dll能夠成為reference,其餘3個file只需放在一起便可。專案的佈局便大致完成。



3‧創建一個Class(類)

個人習慣,沒有什麼可以解釋。

class OracleData
{
     private string equip_no;
     private string location_code;
     private DateTime comm_date;
     private int maint_threshold;
     private string description;
     private int interval;

     public OracleData()
     {
         // TODO: Complete member initialization
     }

     public string GetEquipNo()
     {
         return equip_no;
     }

     public void SetEquipNo(string eq_no)
     {
         equip_no = eq_no;
     }

     public string GetLocationCode()
     {
         return location_code;
     }

     public void SetLocationCode(string loc_code)
     {
         location_code = loc_code;
     }

     public DateTime GetCommDate()
     {
         return comm_date;
     }

     public void SetCommDate(DateTime comm_dt)
     {
         comm_date = comm_dt;
     }

     public int GetThreshold()
     {
         return maint_threshold;
     }

     public void SetThreshold(int threshold)
     {
         maint_threshold = threshold;
     }

     public string GetDescription()
     {
         return description;
     }

     public void SetDescription(string desc)
     {
         description = desc;
     }

     public int GetInterval()
     {
         return interval;
     }

     public void SetInterval(int interv)
     {
         interval = interv;
     }
 }

4‧引用Oracle.DataAccess.dll


using Oracle.DataAccess.Client; 

5‧Connection String設定

跟SQL Server及MySQL 大致相同 (Username、Password、Host IP、Port),唯一分別是SID,但不一定要使用SID,SERVICE_NAME也可以使用,視乎Server設定
如果server為Express,SERVICE_NAME為XE;如果想直接引用tnsnames.ora,Datasource=ora內的名稱即可。

string connString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=" + oracleIP + ")(PORT=" + oraclePort + ")))" +
                    "(CONNECT_DATA=(SID=" + oracleServiceID + ")));" +
                    "User id=" + oracleUserName + ";" +
                    "Password=" + oraclePassword + ";";


6‧將Oracle 內的Data 打包

query跟SQL Server及MySQL 大致相同,我就不作解釋了,下面的Code大約就是將 Oracle 內的Data加進自訂的List<OracleData>裡面,以便調用。
*DBNull.Value的使用就是防止data field的值是(null)而產生的錯誤。*
*最好將下面的code放進try block以便debug,因為不一定第一次做就能夠成功(你明白的‧‧‧)*
 
OracleConnection conn = new OracleConnection(connString);
OracleCommand cmd = new OracleCommand(query, conn);
cmd.CommandTimeout = 1200;
conn.Open();

OracleDataReader dr = cmd.ExecuteReader();
List<OracleData> content = new List<OracleData>();
while (dr.Read()) {
   OracleData od = new OracleData();
   od.SetEquipNo(dr[0].ToString());
   od.SetLocationCode(dr[1].ToString());
   od.SetCommDate(Convert.ToDateTime(dr[2]));
   if (!DBNull.Value.Equals(dr[3]))
   {
      od.SetThreshold(Convert.ToInt32(dr[3]));
   }
   else
   {
      od.SetThreshold(0);              
   }
   od.SetDescription(dr[4].ToString());
   if (!DBNull.Value.Equals(dr[5]))
   {
      od.SetInterval(Convert.ToInt32(dr[5]));
   }
   else
   {
      od.SetInterval(0);               
   }
   content.Add(od);
}
conn.Close();

C# 連接 Oracle Database 就大致完成了!!

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。