我在Oracle SQL Server的包中有一个存储过程。 此过程具有输入和输出参数。该过程本身有效,在Oracle SQL Developer中执行时,输出参数读取预期输出(最后一行的列值)。 此过程必须由Web API通过ODP.NET(Oracle托管数据访问)调用。
问题:永远不会返回输出参数(ODP中的Long类型和db中的NUMBER(12,0))。执行命令后,输出参数始终为DBNull。
以下是我的代码的相关部分(其他参数被省略): 包装程序:
PROCEDURE post_event (event_id OUT OPIS_REGISTRATIE_PROJ.PROJECT_ID%TYPE)
IS BEGIN
-- Some stuff that's happening (that works)
SELECT MAX(PROJECT_ID) INTO event_id FROM OPIS_REGISTRATIE_PROJ WHERE PERSOON_ID = worksheet_id;
END;
使用的参数:
parameters.Add(new OracleParameter("event_id", OracleDbType.Long, ParameterDirection.Output));
C#中的调用代码:
if (con.State == ConnectionState.Open)
{
// Create command and set parameters
using (var cmd = new OracleCommand(cmdText, con))
{
cmd.CommandType = CommandType.StoredProcedure;
foreach (var p in parameters)
{
cmd.Parameters.Add(p);
}
// Execute the stored procedure
try
{
cmd.ExecuteNonQuery();
}
catch (OracleException ex)
{
Console.WriteLine(ex.Message);
}
long paramEventId = 0;
if (cmd.Parameters["event_id"].Value != DBNull.Value)
{
paramEventId = (long)(OracleDecimal)cmd.Parameters["event_id"].Value;
}
正如您所看到的,我知道如何检查DBNull值,但这不是问题。它不应该获得DBNull值。
到目前为止我尝试过的一些事情:
我尝试的一切虽然SQL Developer按预期工作。 它将Output参数传递给有问题的调用C#API。 我搜索了很多搜索Stackoverflow,所以我希望有人可以帮我找到有效的答案。
答案 0 :(得分:0)
正如我的问题所述,我试图将Output-parameter的DbType更改为Int64。在查看时,我注意到有另一个(IN OUT)参数被声明为DbType.Long。当换一个时,我没有改变另一个,所以显然仍然出错。
我得到的错误是:
ORA-06502:PL / SQL:数字或值错误:字符串缓冲区太小
解决方案:将所有OracleDbType.Long参数更改为OracleDbType.Int64 。
后见之明这么容易回答。 我仍然不明白为什么这是一个问题 是不是应该是Int64的相同/别名?
很抱歉打扰了你,我感谢您花时间去尝试和帮助。 :)
我希望有人可以解决我的问题/答案中的(类似)问题。