Oracle SQL 語句文本長度限制 4000 位元組(VARCHAR2 字面值上限)。直接拼接超長字符串會報 ORA-01704: string literal too long。SQL Server 無此限制(批次提交 26 萬字符測試通過),遷移時必須改寫。
using System.Data.OracleClient;
string connStr = "Data Source=ORCL;User ID=app;Password=pwd;";
using (OracleConnection conn = new OracleConnection(connStr))
{
conn.Open();
string sql = "INSERT INTO gw_expointlist (id, name, content) VALUES (1, 'name', :clob)";
using (OracleCommand cmd = new OracleCommand(sql, conn))
{
OracleParameter p = new OracleParameter("clob", OracleType.Clob);
p.Value = hugeText; // 超過 4000 字符的字符串變量
cmd.Parameters.Add(p);
cmd.ExecuteNonQuery();
}
}
關鍵點:
:clob 而非拼接。OracleType.Clob 告知驅動走 LOB 流式寫入路徑。
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
IDbCommand cmd = new OracleCommand();
cmd.CommandText = "INSERT INTO gw_expointlist (id, name, content) VALUES (1, 'name', :clob)";
cmd.Connection = conn; // 假設 conn 已打開
OracleClob clob = new OracleClob((OracleConnection)conn);
OracleParameter param = new OracleParameter("clob", OracleDbType.Clob, clob, ParameterDirection.Input);
param.Value = hugeText;
cmd.Parameters.Add(param);
cmd.ExecuteNonQuery();
進階用法:流式寫入超大 CLOB(避免 LOH 內存壓力)
using (OracleClob clob = new OracleClob((OracleConnection)conn))
{
using (Stream writer = clob.GetStream())
using (StreamReader reader = new StreamReader(new MemoryStream(Encoding.UTF8.GetBytes(hugeText))))
{
reader.BaseStream.CopyTo(writer); // 分塊流式傳輸
}
// clob 隱式綁定到參數
OracleParameter p = new OracleParameter("clob", OracleDbType.Clob, clob, ParameterDirection.Input);
cmd.Parameters.Add(p);
cmd.ExecuteNonQuery();
}
// OracleClient
OracleParameter p = new OracleParameter("blob", OracleType.Blob);
p.Value = fileBytes; // byte[]
// ODP.NET
OracleBlob blob = new OracleBlob((OracleConnection)conn);
using (Stream ws = blob.GetStream())
using (FileStream fs = File.OpenRead(path))
fs.CopyTo(ws);
| 維度 | System.Data.OracleClient | Oracle.DataAccess (ODP.NET) |
|---|---|---|
| 部署 | 需安裝 Oracle Client + 註冊 GAC | XCopy 部署可行(Managed Driver 純 .NET) |
| 效能 | 基礎 | 原生優化、陣列綁定、Statement Cache |
| 功能 | 基礎類型 | 支援 UDT、REF CURSOR、XMLType、高可用 (FCF/ONS) |
| 維護狀態 | Microsoft 已棄用(.NET Core 不支援) | Oracle 官方長期維護,推薦新專案 |
:clob。Pooling=true;Min Pool Size=5;Max Pool Size=100,減少物理連接開銷。OracleClob 預設緩存,大對象寫入後建議 clob.Close() 釋放臨時段。Encoding.GetBytes。棄用 SQL 拼接,擁抱參數化綁定。新專案首選 ODP.NET Managed Driver(NuGet Oracle.ManagedDataAccess),零配置部署、原生效能、全功能支援,完美解決 CLOB/BLOB 大對象寫入難題。