C#ODB.NET Out参数始终为DBNull

时间:2016-08-12 12:49:40

标签: c# oracle output-parameter odp.net-managed

我在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值。

到目前为止我尝试过的一些事情:

  • 将参数DBType更改为Int64和其他(与其他人一起,我正确地获得有关参数类型的错误)
  • 将event_id设置为硬编码值(event_id:= 1234567;)
  • 直接在数据库中执行SELECT MAX(...过程外的查询。

我尝试的一切虽然SQL Developer按预期工作。 它将Output参数传递给有问题的调用C#API。 我搜索了很多搜索Stackoverflow,所以我希望有人可以帮我找到有效的答案。

1 个答案:

答案 0 :(得分:0)

正如我的问题所述,我试图将Output-parameter的DbType更改为Int64。在查看时,我注意到有另一个(IN OUT)参数被声明为DbType.Long。当换一个时,我没有改变另一个,所以显然仍然出错。

我得到的错误是:

  

ORA-06502:PL / SQL:数字或值错误:字符串缓冲区太小

解决方案:将所有OracleDbType.Long参数更改为OracleDbType.Int64

后见之明这么容易回答。 我仍然不明白为什么这是一个问题 是不是应该是Int64的相同/别名?

很抱歉打扰了你,我感谢您花时间去尝试和帮助。 :)
我希望有人可以解决我的问题/答案中的(类似)问题。