簡體   English   中英

在 Web 應用程序中從 C# 代碼調用存儲過程返回 PL/SQL:數字或值錯誤:字符串緩沖區太小

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM