![](/img/trans.png)
[英]ORA-06502: PL/SQL: numeric or value error: character string buffer too small exception from C# code
[英]Calling stored procedure from C# code in web application returns PL/SQL: numeric or value error: character string buffer too small
我在 Oracle 12c 中創建了一個存儲過程,為了調試問題,我將其簡化為僅返回 2 個輸出值。 我嘗試在 SQL Developer 中運行存儲過程,它返回我期望的值。 但是,當我從 C# 代碼調用它時,在 Visual Studio 2015 中出現以下錯誤:
ORA-06502:PL/SQL:數字或值錯誤:字符串緩沖區太小
ORA-06512:在 \\" MY_PROCEDURE ",第 32 行
ORA-06512:在第 1 行
這是我的 C# 代碼:
Oracle.DataAccess.Client.OracleConnection oraconn = new Oracle.DataAccess.Client.OracleConnection("My Connection String");
Oracle.DataAccess.Client.OracleCommand oraComm = new Oracle.DataAccess.Client.OracleCommand("MY_PROCEDURE", oraconn);
oraComm.Parameters.Add("P_REGISTRATION_ID", Oracle.DataAccess.Client.OracleDbType.Int32, ParameterDirection.Input);
oraComm.Parameters.Add("P_OFFICE_ID", Oracle.DataAccess.Client.OracleDbType.Int32, ParameterDirection.Input);
oraComm.Parameters.Add("P_SERIES_ID", Oracle.DataAccess.Client.OracleDbType.Int32, ParameterDirection.Input);
oraComm.Parameters.Add("P_USER_UPDATING", Oracle.DataAccess.Client.OracleDbType.Varchar2, ParameterDirection.Input);
oraComm.Parameters.Add("P_CODE", Oracle.DataAccess.Client.OracleDbType.Varchar2, ParameterDirection.Output);
oraComm.Parameters.Add("P_NUM", Oracle.DataAccess.Client.OracleDbType.Int32, ParameterDirection.Output);
oraComm.CommandType = CommandType.StoredProcedure;
oraconn.Open();
oraComm.ExecuteNonQuery();
var ticketCode = oraComm.Parameters["P_CODE"].ToString();
var ticketNum = oraComm.Parameters["P_NUM"].ToString();
這是存儲過程 - 我已將其簡化為僅向輸出參數提供值,即使如此,我仍然遇到相同的錯誤:
PROCEDURE MY_PROCEDURE(
P_REGISTRATION_ID IN NUMBER,
P_OFFICE_ID IN NUMBER,
P_SERIES_ID IN NUMBER,
P_USER_UPDATING IN VARCHAR2,
P_CODE OUT VARCHAR2,
P_NUM OUT NUMBER)
AS
BEGIN
P_CODE := 'AA';
P_NUM := 1;
END INS_REGISTRATION_QS_PR;
任何幫助是極大的贊賞。 我覺得我只是缺少一些小東西來修復它。
我可以看到的一個問題是字符串輸出參數沒有設置最大長度。 將 C# 代碼中 P_CODE 參數的設置更改為
oraComm.Parameters.Add("P_CODE",
Oracle.DataAccess.Client.OracleDbType.Varchar2,
32767,
ParameterDirection.Output);
祝你好運。
我不知道為什么會這樣,但是 Bob 的解決方案給了我一個想法。 我決定在我的 C# 代碼中分解參數代碼而不是使用構造函數並且它起作用了。
這是代碼:
Oracle.DataAccess.Client.OracleParameter tcParam = new Oracle.DataAccess.Client.OracleParameter();
tcParam.ParameterName = "P_CODE";
tcParam.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2;
tcParam.Size = 10;
tcParam.Direction = ParameterDirection.Output;
oraComm.Parameters.Add(tcParam);
再次感謝所有回復。
試試這個:
oraComm.Parameters.Add("P_CODE", OracleDbType.Varchar2, 32767, null, ParameterDirection.Output);
oraComm.Parameters["P_CODE"].DbType = DbType.String;
試試這個:
command.Parameters.Add("keys", OracleDbType.Varchar2, 32767).Direction = ParameterDirection.Output;
它對我有用!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.