c# ODB.. NET Out参数总是DBNull

本文关键字:DBNull 参数 Out ODB NET | 更新日期: 2023-09-27 18:02:20

我在Oracle SQL Server的一个包中有一个存储过程。这个程序有输入和输出参数。该过程本身工作,在Oracle SQL Developer中执行时,输出参数读取预期的输出(最后一行的列值)。这个过程必须由Web API通过ODP调用。. NET (Oracle Managed Data Access).

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

c# ODB.. NET Out参数总是DBNull

正如我在问题中提到的,我试图将输出参数的DbType更改为Int64。在检查时,我注意到还有另一个(IN OUT)参数被声明为DbType.Long。当我改变其中一个时,我没有改变另一个,所以显然仍然给出一个错误。

得到的错误是:

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

解决方案:修改所有OracleDbType。长参数为OracleDbType.Int64.

事后看来,这么简单的答案。我还是不明白为什么这是个问题。
是不是Long应该是Int64的相同/别名?

我很抱歉打扰你,我很感激你花时间尝试和帮助。:)
我希望有人可以用我的问题/答案来解决他们(类似)的问题。