Oracle函数调用的返回值返回空

时间:2018-07-18 20:25:57

标签: c# oracle plsql odp.net

我正在尝试从C#应用程序中调用Oracle函数,但是它返回{null}而不是数字。

该函数仅对该数字执行COUNT(*)RETURNS。现在,当我尝试从C#端调用它时,总是得到{null}的{​​{1}}。它不仅是cmd.Parameters["RowCount"].Value,而且看起来像是一个以null作为值的空对象。

这是C#的外观。

null

这是该函数在数据库上的外观。

OracleCommand cmd = null;

try
{
    cmd = new OracleCommand("pack_Ams_ActivityChange.func_ActivitySearchRowCount", this.Connection);
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add(new OracleParameter("RowCount", OracleDbType.Decimal, ParameterDirection.ReturnValue));
    cmd.Parameters.Add(new OracleParameter("FromDate", OracleDbType.Date, DateTime.Now(), ParameterDirection.Input));
    cmd.Parameters.Add(new OracleParameter("ThruDate", OracleDbType.Date, DateTime.Now().AddDays(1), ParameterDirection.Input));

    int activityRowCount = 0;
    cmd.ExecuteNonQuery();

    // Errors here since .Value is {null}
    activityRowCount = ((OracleDecimal)cmd.Parameters["RowCount"].Value).ToInt32();

    return activityRowCount;
}

2 个答案:

答案 0 :(得分:1)

我发现Oracle数字格式和.NET类型转换产生奇怪的结果和行为-尤其是在使用NUMBER格式而没有任何精度的情况下。我通常将值转换为OracleDecimal并使用其内置的.IsNull函数,而不是尝试使用.NET DbNull.Value等。

var temporaryResult = new OracleDecimal(cmd.Parameters["RowCount"].Value);
activityRowCount = temporaryResult.IsNull ? 0 : Convert.ToInt32(temporaryResult.Value);

仍然不确定为什么它仍然返回null!

答案 1 :(得分:0)

您只需要:

FUNCTION func_RowCount
(
 in_FromDate         IN DATE,
 in_ThruDate         IN DATE
) RETURN NUMBER AS
 lvnCount            NUMBER;
BEGIN
    SELECT COUNT(*) 
     INTO lvnCount 
     FROM SomeTable 
     WHERE StartDate > in_FromDate 
     AND StartDate < in_ThruDate;
    RETURN lvnCount;
EXCEPTION
 WHEN NO_DATA_FOUND THEN
  RETURN 0;
END func_RowCount;

有了这样的例外,即使您的SELECT以某种方式返回null,您也将获得保证的号码。完全不需要EXECUTE和bind变量。

此外,由于这是一个函数,因此您可以按常规选择返回其结果,而无需像存储的proc一样调用它。 这样的事情将达到目的:

cmd = new OracleCommand("select pack_Ams_ActivityChange.func_ActivitySearchRowCount(?,?) from dual", this.Connection);
相关问题