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

C# 使用ODP.NET从Oracle存储过程获取日期值,c#,wpf,oracle,date,odp.net,C#,Wpf,Oracle,Date,Odp.net,我希望这是一个简单的例子,因为这是我使用Oracle11g(11.2版)的第一个WPF。应用程序 我能够从我的WPF应用程序代码调用Oracle存储过程并检索输出(int和string)参数,但是当我尝试检索日期值时,我只得到以下值01/01/0001 00:00:00,这表明实际上没有返回日期 存储过程在Oracle中工作正常,即返回日期 这是我的密码: string sql = "pkge_intautotest.ScheduleNextRun"; OracleCommand cmd = n

我希望这是一个简单的例子,因为这是我使用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;

我将继续研究这个问题,但知道我做错了什么吗?

我会尝试从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);
之所以只返回日期,是因为您使用的是的日期枚举。我想如果你把它改成时间戳,你会得到一个日期和一个时间:

cmd.Parameters.Add("outSchedDateTime", OracleDbType.TimeStamp, ParameterDirection.Output);
这是现在的工作

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

SELECT TO_DATE(SYSDATE + 4/(24*60)) INTO sched_datetime FROM dual;
对下列事项:

SELECT SYSDATE + 4/(24*60) INTO sched_datetime FROM dual;
cmd.Parameters.Add("outSchedDateTime", OracleDbType.TimeStamp, ParameterDirection.Output);
然后,正如JMK所建议的,在我的.NET代码中,我必须更改:

cmd.Parameters.Add("outSchedDateTime", OracleDbType.Date, ParameterDirection.Output);
对下列事项:

SELECT SYSDATE + 4/(24*60) INTO sched_datetime FROM dual;
cmd.Parameters.Add("outSchedDateTime", OracleDbType.TimeStamp, ParameterDirection.Output);

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

嗨,谢谢JMK,那好多了。我现在看到的是一个日期,但不是时间部分,例如,rawDateTime和outSchedDateTime变量的“08/08/2013 00:00:00”。您能否发布一个从Oracle返回的日期时间示例,以便我们可以看到格式?是的,这就是我在Oracle中得到的:“08-08-2013 11:08:59”。干杯。别担心,我真的很感谢你花时间在这件事上。我已经更改了存储过程,因此它现在输出一个VARCHAR2而不是一个日期,因此,使用您的时间戳建议,我设法在.NET中获得了日期和时间,尽管小时不正确,所以我仍在处理它。我想我可能很接近。再次感谢。只需将参数类型设置为DBType.Date,并将其作为.net类型返回即可。如果需要,ODP.net提供程序将输出.net类型而不是Oracle类型。本文件涵盖了详细信息