如何将字符串类型查询的特定部分投射到日期以避免 "ORA-01843: not a valid month" 错误?
How can I cast specific part of string type query to date to avoid "ORA-01843: not a valid month" error?
所以我试图在数据库关闭时备份失败的查询,并在数据库准备就绪后立即执行它们。到目前为止,我将所有失败的查询保存在文本文件中。当数据库启动时,我从文件中逐行执行那些失败的查询。由于那些失败的查询以字符串格式存储,当我为 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' 部分转换为日期
谢谢!!!
不要将 DateTime
作为字符串传递,而是使用参数。
如果你必须传递一个字符串,那么你必须使用 TO_DATE
将其转换为日期,就像你的情况一样:
TO_DATE('06-03-2015 12:05:00', 'dd-mm-yyyy hh24:mi:ss')
但是,如果您通过 C# 发送值,那么 不要连接值,而是使用参数。 例如:
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 Injection。
所以我试图在数据库关闭时备份失败的查询,并在数据库准备就绪后立即执行它们。到目前为止,我将所有失败的查询保存在文本文件中。当数据库启动时,我从文件中逐行执行那些失败的查询。由于那些失败的查询以字符串格式存储,当我为 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' 部分转换为日期
谢谢!!!
不要将 DateTime
作为字符串传递,而是使用参数。
如果你必须传递一个字符串,那么你必须使用 TO_DATE
将其转换为日期,就像你的情况一样:
TO_DATE('06-03-2015 12:05:00', 'dd-mm-yyyy hh24:mi:ss')
但是,如果您通过 C# 发送值,那么 不要连接值,而是使用参数。 例如:
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 Injection。