如何将字符串类型查询的特定部分强制转换为日期以避免“;ORA-01843:不是有效月份“;错误

本文关键字:ORA-01843 错误 有效 日期 类型 查询 字符串 转换 定部 | 更新日期: 2024-10-20 01:29:54

所以我试图在数据库关闭时备份失败的查询,并在数据库准备好后立即执行它们。到目前为止,我将所有失败的查询保存在文本文件中。当数据库启动时,我从文件中逐行执行那些失败的查询。由于这些失败的查询是以字符串格式存储的,所以当我为Oracle数据库执行它们时(其中一列的数据类型是日期),我会得到ORA-01843:不是有效的月份。例如

INSERT INTO my_table ("MODULE", "USERNAME", "COMPUTER", "DATE","NAME", "EMAIL" ) values ('mymodule', 'mmouse', 'mickey007', '06-03-2015 12:05:00', 'Mickey Mouse', 'mmickey@gmail.com')

既然fail_queries文件中会有很多此类查询,那么有什么方法可以将字符串的"06-03-2015 12:05:00"部分转换为日期

事先谢谢!!!

如何将字符串类型查询的特定部分强制转换为日期以避免“;ORA-01843:不是有效月份“;错误

不要将DateTime作为字符串传递,而是使用Parameters。

如果你必须传递一个字符串,那么你必须使用TO_DATE将其转换为日期,就像你的情况一样:

TO_DATE('06-03-2015 12:05:00', 'dd-mm-yyyy hh24:mi:ss')

但是,如果您通过C#发送值,则使用Parameters而不是串联值喜欢:

using(OracleConnection connection = new OracleConnection("yourConnectionString"))
using (
    OracleCommand command =
        new OracleCommand(@"INSERT INTO my_table (MODULE, USERNAME, COMPUTER, DATE,NAME, EMAIL ) 
           values (:myModule, :mmouse,:mickey007, :myDateTime,:myothercol, :myEmail", connection))
{
    //add parameters
    command.Parameters.Add(":myModule", OracleDbType.Varchar2).Value = "myModule";
    command.Parameters.Add(":myDateTime", OracleDbType.Date).Value = DateTime.Now; // like this
    //add other parameters similarly. 
    connection.Open();
    //execute command
}

参数不仅可以避免此类错误,还可以避免SQL注入。