鉴于此表:
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)
答案 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 ......即使它很难看,也总能完成这项工作......
问候