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個中文字)。
不管採行應用varchar2、CLOB均建議採用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();
}
|
沒有留言:
張貼留言