我的工作场所有一个由邮政服务提供给我们的.net应用程序,它连接到在同一台机器上运行的oracle数据库,并负责注册、存储和打印发货标签。
由于数据库主机等是可配置的,我们询问公司是否可以在网络上使用该应用程序(简单地将其复制到另一台机器上会导致“文字与格式字符串不匹配”错误),我们得到的所有信息是“这是不可能的”。我不想被拒绝,我用反射器在exe文件中戳了一下。
连同Oracle的v$sqlarea视图,我将错误定位到几个日期比较函数,但我不知道为什么应用程序一开始就可以在原始计算机上运行。
原始应用程序使用的查询类似于
SELECT * FROM shipping WHERE date = '2011/03/28' --error
很容易用下面这样的东西修复
SELECT * FROM shipping WHERE to_char(date, 'yyyy/mm/dd') = '2011/03/28'
为什么原始应用程序可以正常工作而不会抛出任何错误?当应用程序在原始主机上使用时,v$sqlarea视图中会弹出不正确的查询,如果我复制查询并使用其他任何东西手动运行它会抛出错误,如果我在任何其他计算机上运行应用程序,它也会抛出错误,Oracle中是否有某些设置正在动态修改查询,但仅针对源自本地计算机的查询,而将原始查询存储在v$sqlarea中?
发布于 2011-03-28 23:09:31
这听起来像是两个客户端计算机之间的区域设置差异,因为日期的格式将取决于用于将日期转换为.NET中的字符串的区域性,并且除非应用程序指定区域性,否则它将使用运行该应用程序的当前登录用户的设置。如果数据库引擎期望它们采用某种格式,这显然是一个问题。参数化查询不太可能出现此问题,在参数化查询中,日期参数与查询分开传递,并以日期数据类型而不是字符串的形式传递。
发布于 2011-03-28 17:37:34
如果使用日期,则必须避免基于String.Format的查询生成。使用参数化的选择和参数来设置这些值。
OracleCommand cmd = new OracleCommand("SELECT * FROM shipping WHERE date = :dataParam", connection);
var param = cmd.Parameters.Add("date", OracleDbType.Date);
param.Value = DateTime.Now;它可以工作,因为格式与开发人员机器和目标数据库上的datetime设置相匹配。
换句话说:问题与您试图提供的不正确的日期时间格式有关。
发布于 2011-03-28 17:04:00
这可能是由于服务器上的区域设置造成的。请检查新服务器是否配置为使用相同的语言环境(EN-GB、EN-US或原始服务器配置为使用的任何语言环境)。
https://stackoverflow.com/questions/5456118
复制相似问题