【发布时间】:2016-12-19 11:51:13
【问题描述】:
我在 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 按预期工作,但我尝试的一切。 将输出参数传输到调用 C# API 是有问题的。 我用谷歌搜索了很多,也搜索了 Stackoverflow,所以我希望有人能帮助我找到一个可行的答案。
【问题讨论】:
-
您能否在执行查询之前添加您的 c# out 参数(属性值)的状态详细信息?
-
在读取参数值之前关闭连接。
-
@Igor 我不确定你的意思/我该怎么做。参数值为空,因为它是一个输出参数。执行后变为 DBNull。史蒂夫,谢谢你的提示,我没想到。不幸的是,这并不能解决我的问题。此外,我还有其他程序几乎可以在不关闭连接的情况下工作(这是必要的,因为这些程序使用引用游标)。
-
对不起 - 我错过了你正在调用存储过程的事实 - 我的回答不适用。
-
@PaulF 没问题!感谢您的帮助:)
标签: c# oracle output-parameter odp.net-managed