C# 如何解决SQL错误:ORA-01843:不是有效月份
你知道我的问题出在哪里吗 我试图更新数据库中的一行,但我使用的查询导致异常C# 如何解决SQL错误:ORA-01843:不是有效月份,c#,sql,.net,oracle,C#,Sql,.net,Oracle,你知道我的问题出在哪里吗 我试图更新数据库中的一行,但我使用的查询导致异常 UPDATE Table1 SET CHANGE_DELIVERY_REASON = 'Card Activation', CHANGE_DELIVERY_NOTE = 'ACTIVATION SUCCESS [1 OK - 2 OK]', RECONCILIATION_STATUS = 1 , RECONCILIATION_LAST_UPDATED = '23/4/2018 12:00:
UPDATE Table1
SET CHANGE_DELIVERY_REASON = 'Card Activation',
CHANGE_DELIVERY_NOTE = 'ACTIVATION SUCCESS [1 OK - 2 OK]',
RECONCILIATION_STATUS = 1 ,
RECONCILIATION_LAST_UPDATED = '23/4/2018 12:00:00 AM',
RECONCILIATION_COUNT = '6',
ACTIVATION_FAILURE = 'SUCCESS';
我得到这个错误:
“SQL错误:ORA-01843:不是有效月份”
我不知道我的问题出在哪里
updateQuery = " UPDATE " + clsUtility.GetMasterTable() + " SET ";
updateQuery += " CHANGE_DELIVERY_REASON = 'Card Activation', ";
updateQuery += " CHANGE_DELIVERY_NOTE = '" + notes + "', ";
updateQuery += " RECONCILIATION_STATUS = 1 , ";
updateQuery += " RECONCILIATION_LAST_UPDATED = '" + DateTime.Today + "', ";
updateQuery += " RECONCILIATION_COUNT = '" + reconciliation_count + "',";
updateQuery += " ACTIVATION_FAILURE = '" + resultPart + "', ";
问题是你的日期格式
updateQuery = " UPDATE " + clsUtility.GetMasterTable() + " SET ";
updateQuery += " CHANGE_DELIVERY_REASON = 'Card Activation', ";
updateQuery += " CHANGE_DELIVERY_NOTE = '" + notes + "', ";
updateQuery += " RECONCILIATION_STATUS = 1 , ";
updateQuery += " RECONCILIATION_LAST_UPDATED = TO_DATE('" + DateTime.Today + "','DD/MM/YYYY HH:MI:SS AM'), ";
updateQuery += " RECONCILIATION_COUNT = '" + reconciliation_count + "',";
updateQuery += " ACTIVATION_FAILURE = '" + resultPart + "', ";
试试这个你应该使用
TO_DATE()
函数
将一行更改为此行:
updateQuery += " RECONCILIATION_LAST_UPDATED = TO_DATE('" +
DateTime.Today + "', 'DD/MM/YYYY HH:MI:SS AM'), ";
更正代码:
updateQuery = " UPDATE " + clsUtility.GetMasterTable() + " SET ";
updateQuery += " CHANGE_DELIVERY_REASON = 'Card Activation', ";
updateQuery += " CHANGE_DELIVERY_NOTE = '" + notes + "', ";
updateQuery += " RECONCILIATION_STATUS = 1 , ";
updateQuery += " RECONCILIATION_LAST_UPDATED = TO_DATE('" + DateTime.Today + "', 'DD/MM/YYYY HH:MI:SS AM'), "; //This Line is changed
updateQuery += " RECONCILIATION_COUNT = '" + reconciliation_count + "',";
updateQuery += " ACTIVATION_FAILURE = '" + resultPart + "', ";
一般语法:
updateQuery = " UPDATE " + clsUtility.GetMasterTable() + " SET ";
updateQuery += " CHANGE_DELIVERY_REASON = 'Card Activation', ";
updateQuery += " CHANGE_DELIVERY_NOTE = '" + notes + "', ";
updateQuery += " RECONCILIATION_STATUS = 1 , ";
updateQuery += " RECONCILIATION_LAST_UPDATED = TO_DATE('" + DateTime.Today + "', 'DD/MM/YYYY HH:MI:SS AM'), "; //This Line is changed
updateQuery += " RECONCILIATION_COUNT = '" + reconciliation_count + "',";
updateQuery += " ACTIVATION_FAILURE = '" + resultPart + "', ";
Oracle/PLSQL中的TO_DATE函数的语法为:
TO_DATE( string1 [, format_mask] [, nls_language] )
有关更多信息,请访问以下链接:
你的问题是你给出的日期的格式,这是在其他答案中处理的。对于其他日期字段,您将需要此字段,因此请务必查看它 但是,对于这种特殊情况,您可以简单地停止使用本地日期,让数据库完成以下工作:
RECONCILIATION_LAST_UPDATED = trunc(sysdate)
另请注意:请在查询中使用参数绑定。你很容易受到攻击
使用参数绑定,您不仅可以避免SQL注入攻击,而且不必担心数据的格式字符串,因为这些数据实际上不需要格式化存储:
using (var connection = new SqlConnection())
{
using (var command = connection.CreateCommand())
{
command.CommandText = "UPDATE " + clsUtility.GetMasterTable() + " SET RECONCILIATION_LAST_UPDATED = :last_updated, CHANGE_DELIVERY_NOTE = :delivery_note";
var parameterLastUpdated = command.CreateParameter();
parameterLastUpdated.ParameterName = ":last_updated";
parameterLastUpdated.SqlDbType = SqlDbType.DateTime;
parameterLastUpdated.Direction = ParameterDirection.Input;
parameterLastUpdated.Value = DateTime.Today;
command.Parameters.Add(parameterLastUpdated);
var parameterDelivery = command.CreateParameter();
parameterDelivery.ParameterName = ":delivery_note";
parameterDelivery.SqlDbType = SqlDbType.NVarChar;
parameterDelivery.Direction = ParameterDirection.Input;
parameterDelivery.Value = "Some string you want in notes";
command.Parameters.Add(parameterDelivery);
command.ExecuteNonQuery();
}
}
我不是在手工编写代码,我得到的是今天日期的updateQuery+=“对账\上次\更新=”+“日期时间.今天+”,“;我用提琴测试并编辑它而不刷新它并不意味着我复制它@Nishant Guptahy如果你认为我复制了你,你不需要删除你说的话@Nishant GuptaAm我做得对,因为我仍然得到相同的错误updateQuery+=“对帐上次更新=截止日期('+DateTime.Today+“,'DD/MM/YYYY HH:MI:SS'),”;您假设所有系统都将为
DateTime提供相同的输出。今天。ToString()
…@Lara不使用字符串连接来进行SQL查询。如果notes='fake\,CREDIT\u LIMIT=100000000,other\u column='fake'
,会发生什么情况?你刚刚允许某人设定10亿的信用额度!使用参数化查询。必须在VS 2017上对Oracle的ADO.NET连接使用此查询,因为获取[ADO NET源[2]]错误:System.Data.OleDb.OLEDBEException(0x80040E07):ORA-01843:不是有效月份。谢谢与VS 2019不同,VS 2019中的数据流中有Oracle源代码。理想情况下,您可以使用参数,停止将数据和代码混合在一个字符串中,然后将其拆分并重新解析为适当的数据类型。学习使用参数,您不需要在Oracle中使用@param_name
(这是SQL Server语法),而是需要冒号:
前缀。