[英]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.