通過C#語言,使用.net的ado組件錄入oracle數據庫的Clob類型字段:
1。當錄入字符串過長,導致ado的命令Command的CommandText字符串大於4056,錄入會失敗,提示:
ORA-01704字符串文字太長。
2。同樣情況下,如果采用通過ado的命令Command訪問oracle存儲過程,並且使用命令參數形式傳入超長的字符串,當字符串本身長度大於32512時,錄入才會失敗,提示:
ORA-01460 轉換請求無法實現或不合理。
出現上述兩種情況,可以用下面代碼解決:
/// <summary> /// 處理clob數據后保存,成功 /// </summary> private void button1_Click(object sender, EventArgs e) { string ClobString = CreateClobString(); string ConnectionString = ConfigurationManager.AppSettings["ConnectionString"].ToString(); System.Data.OracleClient.OracleConnection oc = new System.Data.OracleClient.OracleConnection(ConnectionString); oc.Open(); try { OracleCommand command = new OracleCommand(); command.Connection = oc; command.CommandType = CommandType.Text; command.CommandText = "INSERT INTO demo_table (demo_id,demo_clob) VALUES ("+id.ToString()+", 'aa')"; richTextBox1.Text = "SQL語句字符串長度:" + command.CommandText.Length + "\r\n" + "SQL語句字符串內容:"; richTextBox1.Text += command.CommandText; int ii = command.ExecuteNonQuery(); //修改Clob數據 if (ii > 0) UpdateClobData(oc, "SELECT demo_clob FROM demo_table WHERE demo_id=" + id + " FOR UPDATE", ClobString); } catch (Exception ex) { MessageBox.Show("保存失敗:" + ex.Message); } finally { oc.Close(); } } #region Oracle大對象處理 /// <summary> /// // CreateTempLob /// </summary> private OracleLob CreateTempLob(OracleCommand cmd, OracleType lobtype) { if (lobtype == null) return null; if (cmd == null) return null; //Oracle server syntax to obtain a temporary LOB. cmd.CommandText = "DECLARE A " + lobtype + "; " + "BEGIN " + "DBMS_LOB.CREATETEMPORARY(A, FALSE); " + ":LOC := A; " + "END;"; //Bind the LOB as an output parameter. OracleParameter p = cmd.Parameters.Add("LOC", lobtype); p.Direction = ParameterDirection.Output; //Execute (to receive the output temporary LOB). cmd.ExecuteNonQuery(); //Return the temporary LOB. return (OracleLob)p.Value; } /// <summary> /// 修改Clob數據 /// </summary> public void UpdateClobData(OracleConnection sc, string SQLString, string ReportString) { if (sc == null) return; if (string.IsNullOrEmpty(SQLString)) return; if (string.IsNullOrEmpty(ReportString)) return; //用OracleLob輸入Clob數據 OracleCommand cmd = sc.CreateCommand(); cmd.Transaction = cmd.Connection.BeginTransaction(); cmd.CommandText = SQLString; OracleDataReader reader = cmd.ExecuteReader(); using (reader) { reader.Read(); OracleLob blob = reader.GetOracleLob(0); OracleLob templob = CreateTempLob(cmd, blob.LobType); byte[] buffer = System.Text.Encoding.Unicode.GetBytes(ReportString); //將文件內容傳入Blob變量 templob.BeginBatch(OracleLobOpenMode.ReadWrite); templob.Write(buffer, 0, buffer.Length); templob.Position = 0; long actual = templob.CopyTo(blob); cmd.Transaction.Commit(); } } #endregion
下面是示例代碼地址:
http://files.cnblogs.com/wrzhao/DemoApplication.rar
下載后,需要執行“demoSQL.sql”建立程序運行所需表和存儲過程;需要修改“App.config”文件里的數據庫連接字符串。