Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何解决SQL错误:ORA-01843:不是有效月份_C#_Sql_.net_Oracle - Fatal编程技术网

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语法),而是需要冒号
前缀。