C# ODB.NET 输出参数始终为 DBNull

C# ODB.NET Out parameter is always DBNull

我在 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 开发人员按预期工作。 将输出参数传输到调用 C# API 有问题。 我在谷歌上搜索了很多,也搜索了 Whosebug,所以我希望有人能帮我找到一个有效的答案。

如我的问题所述,我已尝试将输出参数的 DbType 更改为 Int64。在查看时,我注意到还有另一个 (IN OUT) 参数被声明为 DbType.Long。改一个的时候没改另一个,显然还是报错

我得到的错误是:

ORA-06502: PL/SQL: numeric or value error: character string buffer too small

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

事后看来,这是一个简单的答案。 我仍然不明白为什么这是个问题。
Long 不应该是 Int64 的 same/an 别名吗?

很抱歉打扰了您,非常感谢您花时间尝试提供帮助。 :)
我希望有人可以用我的 question/answer.

解决他们的(类似)问题