ORA-01843在WPF中不是有效月份,但在SQL Developer中是OK

ORA-01843在WPF中不是有效月份,但在SQL Developer中是OK,wpf,oracle,visual-studio-2010,Wpf,Oracle,Visual Studio 2010,当我在WPF应用程序中调用Oracle函数并传入如下日期时: var getRateQry = new StringBuilder(); getRateQry.Append("SELECT fn_get_rate("); getRateQry.Append(string.Format("TO_DATE('{0}','MM/DD/YYYY HH24:MI:SS')", implemStartDt.ToString(System.Globalization.CultureInfo.Invariant

当我在WPF应用程序中调用Oracle函数并传入如下日期时:

var getRateQry = new StringBuilder();
getRateQry.Append("SELECT fn_get_rate(");
getRateQry.Append(string.Format("TO_DATE('{0}','MM/DD/YYYY HH24:MI:SS')", implemStartDt.ToString(System.Globalization.CultureInfo.InvariantCulture)));
getRateQry.Append(") DUMMY FROM DUAL");
我正在OleDB.ExecuteReader()中返回ORA-01843错误。例如,我将日期传递为2018年1月4日16:00:00

但是,当在where子句中使用TOU DATE运行T-SQL查询时,它工作得很好

我正在使用VS2010(由于我的操作系统是Win10,所以设置为Win7兼容模式)。奇怪的是,我的其他同事也有相同的工作站设置,但他们没有我的问题

我被卡住了,因为我不知道我最后安装了什么才遇到这个问题

更新#1:我的工作站中的语言设置是用英语(美国)设置的,但我认为这没有关系。

当我卸载OracleXE(64位)时。注意:64位。这时我可以在代码中正确运行查询。 我将尝试安装32位版本,因为我需要它来运行SQL Developer,并查看问题是否仍然存在。

经验教训:不要仅仅因为您的操作系统是64位的,就安装64位产品。

更新#2:即使安装了OracleXE 32位,我仍然可以在代码中运行查询。如果安装了OracleXE 64位,我仍然很惊讶是什么导致了错误。


但是无论如何,我现在就让这个设置完成,因为这是为了我的目的。

您正在将查询构建为一个字符串。这是一个非常糟糕的主意,因为它会让您面临sql注入以及这类问题。 您应该编写一个参数化查询,并将日期参数作为datetime而不是字符串的一部分传递

您可能应该进一步了解这一点,但下面是一个示例线程,其中包含一些需要考虑的代码:

我还建议您研究orm,例如实体框架或Dapper

因为它是,我会检查你的机器上的文化设置。
您正在将查询构建为字符串。这是一个非常糟糕的主意,因为它会让您面临sql注入以及这类问题。 您应该编写一个参数化查询,并将日期参数作为datetime而不是字符串的一部分传递

您可能应该进一步了解这一点,但下面是一个示例线程,其中包含一些需要考虑的代码:

我还建议您研究orm,例如实体框架或Dapper

因为它是,我会检查你的机器上的文化设置。
这与安迪的答案基本相同。 您应该尝试将查询构建为带有日期参数的命令对象

有很多方法可以访问数据库,我不知道你是怎么做到的。使用OleDb,它可能看起来像这样

OleDbConnection db ;

// Get or open connection 
OleDbCommand cmd = db.CreateCommand();
cmd.CommandText = "SELECT fn_get_rate(TO_DATE('{?}') DUMMY FROM DUAL";
cmd.Parameters.Add("@P1",OleDbType.DBTimeStamp).Value = implemStartDt ;

OleDbDataReader rdr = cmd.ExecuteReader();
这仍然有一个SQL语句,但是?作为参数的占位符

在较低的级别,日期将被格式化并插入SQL语句中,但您不必处理细节


正如Andy所说,您可以更好地抵御SQL注入攻击,即使这在您的应用程序中不是一个真正的问题。

这与Andy的答案基本相同。 您应该尝试将查询构建为带有日期参数的命令对象

有很多方法可以访问数据库,我不知道你是怎么做到的。使用OleDb,它可能看起来像这样

OleDbConnection db ;

// Get or open connection 
OleDbCommand cmd = db.CreateCommand();
cmd.CommandText = "SELECT fn_get_rate(TO_DATE('{?}') DUMMY FROM DUAL";
cmd.Parameters.Add("@P1",OleDbType.DBTimeStamp).Value = implemStartDt ;

OleDbDataReader rdr = cmd.ExecuteReader();
这仍然有一个SQL语句,但是?作为参数的占位符

在较低的级别,日期将被格式化并插入SQL语句中,但您不必处理细节


正如Andy所说,您可以更好地抵御SQL注入攻击,即使这在您的应用程序中不是一个真正的问题。

感谢您对SQL注入攻击的回答和关注。但是,我不能编辑代码的这一部分,因为这是生产代码,不需要编辑它。正如我所说,在我的其他同事的工作站上,他们可以毫无问题地调用函数。因此,由我来检查我的安装,看看是什么导致了这个问题。感谢您的回答和对SQL注入攻击的关注。但是,我不能编辑代码的这一部分,因为这是生产代码,不需要编辑它。正如我所说,在我的其他同事的工作站上,他们可以毫无问题地调用函数。因此,由我来检查我的安装,看看是什么导致了这个问题。感谢您的回答和对SQL注入攻击的关注。但是,我不能编辑代码的这一部分,因为这是生产代码,不需要编辑它。正如我所说,在我的其他同事的工作站上,他们可以毫无问题地调用函数。所以,我要检查我的安装,看看是什么导致了这个问题。你的文化设置一定是不同的。奇怪。您的团队仍应使用参数化查询。即使你目前有一些奇怪的体系结构,只是一个字符串是通行证。我们会考虑不久,我们的应用程序不暴露于互联网无论如何。赞赏你的答案和关注SQL注入攻击。但是,我不能编辑代码的这一部分,因为这是生产代码,不需要编辑它。正如我所说,在我的其他同事的工作站上,他们可以毫无问题地调用函数。所以,我要检查我的安装,看看是什么导致了这个问题。你的文化设置一定是不同的。奇怪。您的团队仍应使用参数化查询。即使你现在有一些奇怪的体系结构,只是一个字符串是通行证。我们会考虑不久,我们的应用程序不暴露于互联网反正。