Oracle"格式无效"使用Date时

时间:2016-04-11 17:54:01

标签: oracle oracle11g

我已经使用过SQL Server多年了,但我是Oracle SQL新手。我试图重构一个旧的应用程序,而我正在做的一件事就是将它转移到更新的Oracle托管数据访问。该应用程序使用带参数的所有内联SQL。

我遇到了处理日期问题的问题。我知道Oracle期望日期采用特定的格式,但我想如果我使用TO_DATE函数,我可以使用我使用的任何格式。

当我尝试使用参数运行以下查询时出现错误

  

其中一个标识的项目格式无效

我假设它与日期相关。

如果我使用LinqPad并运行以下查询,它将更新正常。

update SAP_DATES 
set DATE_VALUE = TO_DATE('2010-03-26','yyyy-mm-dd'), 
    DATE_MODIFIED = TO_DATE('2015-06-12','yyyy-mm-dd')  
where 
    EMP = '00000197' and DATE_TYPE = 'Retirement Date     '

但是,如果我使用以下内容,我会得到以下内容,我会收到错误消息。我可以在调用SQL处于“yyyy-mm-dd”之前确认日期值。格式。没有时间或分钟。

 public const String UPDATE_DATE_RECORD_SQL = "update SAP_DATES set " +
            "DATE_VALUE = TO_DATE(:dtValue,'yyyy-mm-dd'), DATE_MODIFIED = TO_DATE(:dtModified,'yyyy-mm-dd') " + 
            "where EMP = :Emp and DATE_TYPE = :dtType";

并在数据层中

using (objConnection)
{
    OracleCommand objCmd = objConnection.CreateCommand();
    objCmd.CommandText = oracleCmdText;

    objCmd.Parameters.Add(":Emp", OracleDbType.Varchar2).Value = employeeId;
    objCmd.Parameters.Add(":dtType", OracleDbType.Varchar2).Value = dtType;
    objCmd.Parameters.Add(":dtValue", OracleDbType.Date).Value = dtValue;
    objCmd.Parameters.Add(":dtModified", OracleDbType.Date).Value = dtModified;

    objConnection.Open();
    objCmd.ExecuteNonQuery();
}

任何人都知道为什么我可以使用LinqPad运行查询但是如果我使用带参数的内联SQL我会收到错误吗?

3 个答案:

答案 0 :(得分:1)

添加参数的顺序应与sql语句中定义更新查询的顺序相同

所以请使用此订单

     objCmd.Parameters.Add(":dtValue", OracleDbType.Date).Value = dtValue;
     objCmd.Parameters.Add(":dtModified", OracleDbType.Date).Value = dtModified;
     objCmd.Parameters.Add(":Emp", OracleDbType.Varchar2).Value = employeeId;
     objCmd.Parameters.Add(":dtType", OracleDbType.Varchar2).Value = dtType;

答案 1 :(得分:1)

:dtValue:dtModified的类型应为Varchar2,因为TO_DATE期望使用指定格式的字符串转换为日期.-

答案 2 :(得分:1)

我有这个问题,在我的情况下,它不是由Date类型引起的,而是由于引起的 由oracle数据库按位置绑定属性,你需要按名称绑定...

oracleCommand.BindByName = true