简体   繁体   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

I have created a stored procedure in Oracle 12c and in order to debug the problem I've reduced it to just returning 2 output values.我在 Oracle 12c 中创建了一个存储过程,为了调试问题,我将其简化为仅返回 2 个输出值。 I have tried running the stored procedure in SQL Developer and it returns the values that I'm expecting.我尝试在 SQL Developer 中运行存储过程,它返回我期望的值。 However, when I call it from my C# code, I get the following error in Visual Studio 2015:但是,当我从 C# 代码调用它时,在 Visual Studio 2015 中出现以下错误:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small ORA-06502:PL/SQL:数字或值错误:字符串缓冲区太小

ORA-06512: at \\" MY_PROCEDURE ", line 32 ORA-06512:在 \\" MY_PROCEDURE ",第 32 行

ORA-06512: at line 1 ORA-06512:在第 1 行

This is my C# code:这是我的 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();

Here is the stored procedure - I've reduced it to just provide values to the output parameters and I still get the same error even with that:这是存储过程 - 我已将其简化为仅向输出参数提供值,即使如此,我仍然遇到相同的错误:

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;

Any help is greatly appreciated.任何帮助是极大的赞赏。 I feel like I'm just missing something small to fix it.我觉得我只是缺少一些小东西来修复它。

One problem I can see is that the string output parameter doesn't have a max length set.我可以看到的一个问题是字符串输出参数没有设置最大长度。 Change the setup of the P_CODE parameter in the C# code to将 C# 代码中 P_CODE 参数的设置更改为

oraComm.Parameters.Add("P_CODE", 
                       Oracle.DataAccess.Client.OracleDbType.Varchar2, 
                       32767,
                       ParameterDirection.Output);

Best of luck.祝你好运。

I have no idea why this worked, but Bob's solution gave me an idea.我不知道为什么会这样,但是 Bob 的解决方案给了我一个想法。 I decided to just break up the parameter code in my C# code instead of using the constructor and it worked.我决定在我的 C# 代码中分解参数代码而不是使用构造函数并且它起作用了。

Here's the code:这是代码:

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

Thanks again for all the replies.再次感谢所有回复。

Try this one:试试这个:

oraComm.Parameters.Add("P_CODE", OracleDbType.Varchar2, 32767, null, ParameterDirection.Output);
oraComm.Parameters["P_CODE"].DbType = DbType.String;

Try this one:试试这个:

command.Parameters.Add("keys", OracleDbType.Varchar2, 32767).Direction = ParameterDirection.Output;

It worked for me !它对我有用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 ORA-06502:PL / SQL:数字或值错误:C#代码中的字符串缓冲区太小异常 - ORA-06502: PL/SQL: numeric or value error: character string buffer too small exception from C# code ORA-06502:PL / SQL:数字或值错误从C#Web服务调用存储过程 - ORA-06502: PL/SQL: numeric or value error calling a stored procedure from c# web service PL/SQL:数字或值错误:字符串缓冲区太小 - 应用程序远程发布 - PL/SQL: numeric or value error: character string buffer too small - app remotely published 从ac#Web服务调用PL / SQL存储过程的ORA 00936错误 - ORA 00936 error calling a PL/SQL stored procedure from a c# web service Oracle.DataAccess.Client.OracleException ORA-06502:PL / SQL:数字或值错误:字符串缓冲区太小。 ExecuteReader步骤出错 - Oracle.DataAccess.Client.OracleException ORA-06502: PL/SQL: numeric or value error: character string buffer too small. Error at ExecuteReader step 使用C#调用Oracle函数时出现字符串缓冲区太小错误 - Character string buffer too small error while calling Oracle function using C# 从C#代码调用SQL Server存储过程时出错 - Error calling SQL Server stored procedure from C# code 从C#代码调用存储过程时,出现SQL错误“过程或函数需要参数,但未提供” - Sql error “Procedure or function expects parameter , which was not supplied” when calling a stored procedure from c# code 从C#应用程序动态调用SQL Server存储过程 - Dynamically calling a SQL Server stored procedure from a C# application 从C#调用存储过程时出错 - Error with calling stored procedure from C#
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM