在.net4

时间:2017-03-29 12:47:12

标签: .net oracle

鉴于此表:

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框架4 Oracle.DataAccess(v4.112.3.0)

2 个答案:

答案 0 :(得分:0)

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

解决方案:OCmd.BindByName = True

答案 1 :(得分:0)

我认为,在后台,日期作为字符串传递。并且您需要具有良好的格式,以便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方面适用于美国格式。所以 export LANG = C(或en_US.UTF-8) 会做的伎俩。

但是,尽管甲骨文很清楚如何运作,但我发现其他人并不总是这样。所以你必须试验......

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

或者只是使用to_date ......即使它很难看,也总能完成这项工作......

问候