使用 OracleDataAccess.Client 或 System.Data.OracleClient 呼叫存儲過程時,若輸出參數為 VARCHAR2/NVARCHAR2 等變長型別,必須指定 Size 屬性,否則會在 ExecuteNonQuery() 時拋出 No size set for variable length data type: String。
cmd.Parameters.Add("l_ReStatus", OracleType.VarChar).Direction = ParameterDirection.Output;
// 缺少 Size,執行時拋出例外
cmd.ExecuteNonQuery();
ReStatus = cmd.Parameters["l_ReStatus"].Value.ToString();
// 方式 1:Add 多載指定長度(建議)
cmd.Parameters.Add("l_ReStatus", OracleType.VarChar, 20).Direction = ParameterDirection.Output;
// 方式 2:先 Add 再設定 Size 屬性
var p = cmd.Parameters.Add("l_ReStatus", OracleType.VarChar);
p.Direction = ParameterDirection.Output;
p.Size = 20; // 必須設定
修正後畫面:
public bool RunProcZX(string User_Id, out string ReStatus)
{
using (var conn = new OracleConnection(connStr))
using (var cmd = new OracleCommand("存儲過程名", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
// IN 參數
cmd.Parameters.Add("l_User_Id", OracleType.VarChar, 50).Value = User_Id;
// OUT 參數:務必指定 Size
cmd.Parameters.Add("l_ReStatus", OracleType.VarChar, 20).Direction = ParameterDirection.Output;
try
{
conn.Open();
cmd.ExecuteNonQuery();
ReStatus = cmd.Parameters["l_ReStatus"].Value?.ToString() ?? string.Empty;
return true;
}
catch
{
ReStatus = string.Empty;
return false;
}
}
}
ORA-06502: numeric or value error: character string buffer too small。using 區塊自動釋放連線與命令物件,避免連線洩漏。