我正在尝试从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;
}
答案 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);