使用ODP.NET从Oracle存储过程中获取日期值

本文关键字:过程中 获取 取日期 存储过程 存储 ODP NET Oracle 使用 | 更新日期: 2023-09-27 18:26:47

我希望这是一个简单的WPF,因为这是我的第一个带有Oracle11g(版本11.2)应用程序的WPF。

我可以从我的WPF应用程序代码中调用Oracle存储过程并检索输出(int和string)参数,但是当我尝试检索日期值时,我只得到以下值01/01/0001 00:00:00,这表明实际上没有返回日期?

存储过程在Oracle中运行良好,即它返回日期。

这是我的代码:

string sql = "pkge_intautotest.ScheduleNextRun";
OracleCommand cmd = new OracleCommand(sql, conn);
cmd.BindByName = true;
cmd.CommandType = System.Data.CommandType.StoredProcedure;
DateTime outSchedDateTime;
cmd.Parameters.Add("outSchedDateTime", OracleDbType.Date, ParameterDirection.Output);
cmd.ExecuteNonQuery();
//Get the values output by the stored procedure
outSchedDateTime = (DateTime)cmd.Parameters["outSchedDateTime"].Value;
conn.Close();
conn.Dispose();

这是我的(简化的)存储过程:

PROCEDURE ScheduleNextRun (inIntno NUMBER, outCaseno OUT NUMBER, outSchedDateTime OUT DATE ) AS
BEGIN
    DECLARE
        sched_datetime DATE;
        init_diary_id DIARY.ID%TYPE;
        v_proceed PLS_INTEGER;
    BEGIN
        -- Get the schedule time for 4 minutes from now
        SELECT TO_DATE(SYSDATE + 4/(24*60)) INTO sched_datetime FROM dual;
        outSchedDateTime := sched_datetime;
    END;
END ScheduleNextRun;

我会继续关注这个问题,但有什么想法我做错了吗?

使用ODP.NET从Oracle存储过程中获取日期值

现在可以工作了。

在我的存储过程中,我必须更改以下行:

SELECT TO_DATE(SYSDATE + 4/(24*60)) INTO sched_datetime FROM dual;

收件人:

SELECT SYSDATE + 4/(24*60) INTO sched_datetime FROM dual;

然后,正如JMK所建议的那样,在我的.NET代码中,我不得不更改:

cmd.Parameters.Add("outSchedDateTime", OracleDbType.Date, ParameterDirection.Output);

收件人:

cmd.Parameters.Add("outSchedDateTime", OracleDbType.TimeStamp, ParameterDirection.Output);

所以现在在我的WPF应用程序中,我可以看到日期和时间部分。我希望这能有所帮助。

我最初会尝试从oracle中获取一个字符串,然后使用DateTime.Parse将其获取到DateTime对象中,如下所示:

cmd.ExecuteNonQuery();
//Get the values output by the stored procedure
string rawDateTime = cmd.Parameters["outSchedDateTime"].Value.ToString();
var outSchedDateTime = DateTime.Parse(rawDateTime);

之所以只返回Date,是因为您使用的是OracleDbType的Date枚举。我想如果你把它改成TimeStamp,你会得到一个日期和一个时间:

cmd.Parameters.Add("outSchedDateTime", OracleDbType.TimeStamp, ParameterDirection.Output);