【发布时间】:2012-08-24 11:56:47
【问题描述】:
好的,我正在尝试获取 Oracle 11g 中 DATE 列的字符串值以传递给 C# 应用程序中的 UI(通过 WCF)。我想准确地显示我在 SQL Developer 中拉回 C# 中的字符串变量的内容。相反,当我有一个 Date 列时,我会得到一些非常古怪的解析 DateTime 值。
例子:
SQL Developer 中的值:26-AUG-75 VS 中来自 myDataRow[0].ToString() 的值:8/26/0975 12:00:00 AM SQL Developer 中的价值:01-JUL-76 VS 中来自 myDataRow[0].ToString() 的值:7/1/1776 12:00:00 AM
Oracle 日期为look right。 VS 没有。谢谢,本富兰克林和Edward the Martyr。什么鬼?
SQL 很简单。我显然在更改字段名称,但就是这样:
SELECT DISTINCT(MyDate) FROM
User1.TableOfDates@DateTableLink
WHERE MyDate IS NOT NULL ORDER BY
MyDate
向数据库抛出 SQL 的共享代码也很简单。我将在这里对它进行大量审查,但到目前为止它在其他任何地方都运行良好,而且我认为我已经掌握了重要的东西:
internal Oracle.DataAccess.Client.OracleConnection oracleConn;
...
DataTable dtReturn = new DataTable();
Oracle.DataAccess.Client.OracleCommand cmdTemp = null;
string strScrub = "";
// strScrub is magically loaded with SQL, which is,
// if you grab it with a breakpoint here, after it's
// scrubbed, equal to what I've written, above
cmdTemp = new Oracle.DataAccess.Client.OracleCommand(strScrub, this.oracleConn);
Oracle.DataAccess.Client.OracleDataReader dr = cmdTemp.ExecuteReader();
dtReturn.Load(dr);
dr.Dispose();
...
return dtReturn;
那部分有效。我只在此处包含它,以防我应该注意使用 Oracle.DataAccess 的某些东西。一切都打开和关闭并收集得很好。我们每天在开发中通过它发送数百条命令,在部署中至少有数千条。
以下是第一个值 (26-AUG-75) 的即时窗口中的一些信息,dr 现在代表从上面代码中提取的 DataTable 中的单个 DataRow:
只用? dr[0]——它给出了同样的东西:
?dr[0]
{8/26/0975 上午 12:00:00}
日期:{8/26/0975 12:00:00 AM}
天数:26
DayOfWeek: 星期六
日期:238
小时:0
种类:未指定
毫秒:0
分钟:0
月:8
第二:0
滴答声:307569312000000000
时间:{00:00:00}
年份:975
现在有趣的是,它是一个 DateTime,而它只是 Oracle 中的一个日期。也许我错过了有关 Oracle Dates 的一些东西...
?博士[0].GetType() {Name = "DateTime" FullName = "System.DateTime"}无论如何,如果我能达到我在 SQL Developer 中看到的相同值(例如,26-AUG-75),我很好。我可以接受它并为所欲为。
隐式转换在哪里进行,我怎样才能早一点进入那里?
我应该补充一点,我无法使用 SELECT 语句和TO_CHAR 获得创意。这是一个相当复杂的自动化过程,它根据用户标准构建查询。因此,更改此 SELECT 将是“给机器一条鱼”而不是“教机器钓鱼”的答案。任何字段都可以是这种格式的日期,因此打开 GetType 值并在 C# 中解析一些创造性的方式是可以的,但更改 SQL 则不行。
编辑使用来自here的建议:
select dump(sysdate)today from dual;
在上面的 SQL 中使用dump,从 SQL Developer 运行,我得到:
Typ=12 Len=7: 119,175,8,26,1,1,1 用于 26-AUG-75 的行。所以甲骨文得到了正确的日期。
按照找到的转换说明here...
119 - 100 "excess" = 19 centuries == 1900
175 - 100 "excess" = 75 years == 75
那是 1975 年。
【问题讨论】:
-
原始值不是
26-AUG-75。这只是在某处应用的字符串转换 - 可能由 SQL Developer 应用,也可能由数据库本身应用。我确信甲骨文不会像这样存储它的Date值。请注意,DateTime是 .NET 中甚至用于“仅日期”的典型数据类型。 (我有一个日期/时间库可以纠正这个问题,但在这里对你没有帮助。) -
我是说你的“无论如何,如果我能得到原始值”是不正确的......
-
好吧,我也会对“原始”值感到满意,不管它是什么。 ;^) 谢谢;固定。
-
我怀疑你得到原始值 - 这不是你期望的值。
-
在您的即时窗口中,您将从 Oracle 获得的日期时间(“原始”值)转换为字符串,然后将其解析回日期时间。我认为这就是事情出错的地方。尝试(在即时窗口中)输入“?dr[0]”,看看这是不是你想要的。