【问题标题】:Cast .NET DateTime to OracleDate将 .NET DateTime 转换为 OracleDate
【发布时间】:2011-11-08 12:58:15
【问题描述】:

我正在尝试使用 ODP.NET 将 .NET DateTime 值插入到 Oracle DATE 列中。到目前为止,我已经尝试使用 OracleDate() 构造函数来转换 .NET DateTime,如下所示:

new OracleDate(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTimeNow.Hour, DateTime.Now.Minute, DateTime.Now.Second)

当我尝试这个时,它会在列中插入正确的年、月和日,但时间总是设置为午夜。如何插入正确的时间和日期?

没有参数,SQL 看起来像这样(为了清楚起见,使用 DateTime.Now,否则我只使用 SYSDATE):

"update mytable set timestamp = '" + new OracleTimeStamp(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTimeNow.Second) + "'"

【问题讨论】:

    标签: .net oracle odp.net


    【解决方案1】:

    根据this你应该使用OracleTimeStamp作为OracleDbType来实现你想要的......

    OracleDate 没有时间部分...这种行为是在不久前(IIRC Oracle 8 左右)使用 JDBC 驱动程序开始的...使用 JDBC 驱动程序有一些奇怪的解决方法,我不记得了现在...我不知道 ODP.NET 是否有解决方法...OracleTimeStamp 是官方支持的带有时间部分的日期方式...

    编辑 - OP 添加 SQL 语句后:

    首先,该语句包含两个问题 - 永远不要将列/表命名为保留字(即timestamp)...另一个问题是缺少使用在这种情况下不会导致的参数SQL 注入,但仍然是不好的做法,并且会导致(如果多次使用相同的语句)将性能损失降至最低...

    如果您仍然想以这种方式使用它,那么这将起作用:

    "update mytable set timestamp = TO_DATE ('" + DateTime.Now.ToString ("yyyyMMddHHmmss") + "', 'YYYYMMDDHH24MISS')";
    

    【讨论】:

    • 使用 OracleTimeStamp 类型会给我 Oracle 错误:“日期格式图片在转换整个输入字符串之前结束。”
    • 请显示准确的 SQL 语句 - 也许它需要做一些最小的修改
    【解决方案2】:

    您应该为此使用参数。当等效的 .NET 数据类型可以使用时,也无需使用特定于 Oracle 的数据类型。这样做的好处是以后可以很容易地将 ODP.NET 换成不同的驱动程序,因为大多数其他驱动程序都使用本机 .NET 数据类型。

    using (OracleConnection conn = new OracleConnection("your connection string here")
    {
        string query = "update mytable set timestamp = :foo";
    
        using (OracleCommand cmd = new OracleCommand(query, conn))
        {
            cmd.Parameters.Add(":foo", DateTime.Now);
    
            cmd.ExecuteNonQuery();
        }
    }
    

    【讨论】:

    • 我同意。没有理由使用时间戳。
    • 我也有类似的问题。我应该只输入日期时间吗?现在我输入一个以时间结尾的字符串。
    • @DmainEvent:是的,假设上面的“mytable.timestamp”列具有适当的数据类型(对于例如 Oracle 中的 DATE 或 Postgres 中的 TIMESTAMP)。
    猜你喜欢
    • 2020-03-04
    • 2010-11-04
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多