在oracle准备的.net4语句中使用日期
鉴于此表:在oracle准备的.net4语句中使用日期,.net,oracle,.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 使用这些参数: O
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_日期,但这似乎是一个可怕的倒退
已尝试使用SetSessionInfo(来自OracleGlobalization)匹配区域性指定的日期格式,但无效
最初,该应用程序使用MS oracle提供程序运行.net2,没有任何问题,但迁移到.net4和oracle.DataAccess会让我头疼
按照此处的说明,使用System.DateTime作为日期的.net类型:
.net框架4
Oracle.DataAccess(v4.112.3.0)我忘记了Oracle.DataAccess默认为BindByName=false
解决方案:OCmd.BindByName=True我假设在后台,日期作为字符串传递。您需要具有良好的格式,以便Oracle能够将日期重新转换为预期的格式 两种解决方案: 第一个是使用最新的。。。 第二个是更改客户端的日期格式。为此,您有两种方法: -在操作系统级别: 导出NLS_DATE_FORMAT='DD/MM/yyyyy HH24:MI:SS'(针对linux导出,针对windows设置) -在软件中: sql“alter session set NLS_DATE_FORMAT='DD/MM/yyyyy HH24:MI:SS' 在这两种情况下,你都必须找到“好”的格式 您还可以通过更改客户端的国家/地区代码来更改格式。通常,甲骨文方面的目的是与我们的格式。那么 出口语言=C(或en_US.UTF-8) 我会成功的 但是,正如甲骨文非常清楚它是如何工作的,我发现其他人并不总是这样。所以你必须进行实验 首先,打印一个日期以知道使用的是哪种默认格式 或者只是用来约会。。。哪怕它很难看,也能起作用
关于,所以实际上问题不在于日期格式,而是Oracle根据应用的顺序绑定参数。更改为BindByName=True,一切正常:)