2013年8月23日 星期五

如何將資料存入Oracle的CLOB型態欄位中-以C#為例

Oracle資料型態中,varchar2最大可儲存4000byte文字資料,當超過4000以上時,則應採用CLOB儲存。但當改用CLOB時,程式寫入部分也需配合修改,否則可能發生字串被截斷的問題。

下範例為將報告存入資料庫時,發生存入字串被截斷的問題,其中content_html content_txt欄位為CLOB型態,此型態可儲存4GB字元資料,原作法是採用類似以下指令。
update rpt
    set content_html      = '.....'
        , content_txt     = 'Test......'
where rpt_id = {0}
此方式是以採用Single Quote直接將字串包夾方式存存CLOB
1.  無法存入具有特特殊字元
存入字串具有特殊字元(如Single Quote)時,將發生語法錯誤,雖然方法可避免,但不建議。

2. 字串截斷
由於是使用一般字串的處理方式,即隱喻欄位之資料型態為varchar2,因此即已限制最多僅能存入4000字元(2000個中文字)。

不管採行應用varchar2CLOB均建議採用Parameter 方式,並指定其型態為OracleDbType.Clob,即可順利存入,程式碼如下所示:
string sSQL = "";
 sSQL += "update rpt\n";
 sSQL += "  set content_html  = :content_html \n";
 sSQL += "      , content_txt = :content_txt \n";
 sSQL += "where rpt _id = {0}\n";

 sSQL = string.Format(sSQL, sRptId); 

 OracleConnection cn = new OracleConnection(OraConn.UserConn);
 cn.Open();
 OracleCommand cmd = new OracleCommand(sSQL, cn);


 cmd.Parameters.Add("content_html"OracleDbType.Clob);
 cmd.Parameters.Add("content_txt"OracleDbType.Clob);

 cmd.Parameters["content_html"].Value = txt_html;
 cmd.Parameters["content_txt"].Value  = htmltxt;
 try
 {
     cmd.ExecuteNonQuery();
 }
 catch (Exception ex)
 {
     string Msg = ex.Message;
}
 finally
 {
     cn.Close();
     cmd.Dispose();
 }
    

沒有留言:

張貼留言