繁体   English   中英

在.net4中的Oracle预准备语句中使用日期

[英]Using dates in oracle prepared statements from .net4

给定此表:

myTable
EMPID           NOT NULL CHAR(10)      
DEFFECTIVE      NOT NULL DATE 
SSCHEME                  CHAR(10)

这个准备好的声明:

update myTable set sScheme = :sScheme  
where empID = :sEmpID                 
and dEffective= :dStart      

具有以下参数:

OCmd.Parameters.Add("sEmpID", OracleDbType.Char).Value = sEmp_No        'string
OCmd.Parameters.Add("dStart", OracleDbType.Date).Value = dtStart        'System.DateTime
OCmd.Parameters.Add("sScheme", OracleDbType.Char).Value = sScheme       'string

为什么我不断获取Oracle.DataAccess.Client.OracleException ORA-01858:在期望数字的位置找到了非数字字符

我看到很多人建议将日期作为格式字符串传递,然后在查询中执行to_date-但这似乎是一个可怕的倒退。

尝试使用SetSessionInfo(来自OracleGlobalization)来匹配Culture指定的DateFormat,但无济于事。

最初,此应用程序使用MS oracle提供程序运行.net2时没有问题,但是迁移到.net4和Oracle.DataAccess会使我感到头痛。

根据此处的说明,使用System.DateTime作为日期的.net类型: http//docs.oracle.com/html/E15167_01/featTypes.htm

.net Framework 4 Oracle.DataAccess(v4.112.3.0)

我忘记了Oracle.DataAccess默认为BindByName = false。

解决方案:OCmd.BindByName = True

我想在后台将日期作为字符串传递。 而且您需要具有良好的格式,以便Oracle可以将日期重新转换为其预期的格式。

两种解决方案:第一种是使用to_date ...第二种是更改客户端的日期格式。 为此,您有两种方法:-在操作系统级别:export NLS_DATE_FORMAT ='DD / MM / YYYY HH24:MI:SS'(对于Linux导出,为Windows设置)-在软件中:sql'alter session set NLS_DATE_FORMAT = 'DD / MM / YYYY HH24:MI:SS';

在这两种情况下,您都必须找到“好”格式。

您也可以通过更改客户的国家/地区代码来更改格式。 通常,Oracle方面是针对美国格式的。 因此,导出LANG = C(或en_US.UTF-8)将解决问题。

但是,尽管Oracle对其工作原理很清楚,但我发现其他人并非总是如此。 所以你必须尝试...

首先,请打印日期以了解使用哪种默认格式...

或者只是使用to_date ...即使它很丑,它也总是可以做的...

问候

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM