首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

C# OracleParameter 錯誤「No size set for variable length data type」解決方案

     編輯:Oracle 資料庫基礎

使用 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();

正確寫法:指定 Size

// 方式 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;  // 必須設定

修正後畫面:

設定 Size 後正常執行

完整範例:呼叫存儲過程並取得 OUT 參數

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;
        }
    }
}

關鍵提醒

  • 所有變長型別參數(VARCHAR2, NVARCHAR2, RAW, CLOB, BLOB 等)在作為參數時都需指定 Size,固定長度型別(NUMBER, DATE, CHAR)則不需要。
  • Size 應大於等於實際可能回傳的最大長度,否則會發生 ORA-06502: numeric or value error: character string buffer too small。
  • 使用 using 區塊自動釋放連線與命令物件,避免連線洩漏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved