我已经使用过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我会收到错误吗?
答案 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