2013-02-26 74 views
0

我想在Oracle中的日期字段中插入日期时间。到目前为止我已经使用了sysdate,它完美的工作,但是我需要使用相同的时间戳。将日期插入到Oracle中

有谁知道我如何创建一个与oracle的日期字段兼容的日期时间变量?我尝试的一切都会导致错误

我试图沿着这一行的变化:

Dim timestamp As DateTime = CDate(Now.ToString("yyyy/MM/dd HH:mm:ss")) 

.......more code.... 

insertBuilder.Append("date = to_date(" & timestamp & ")") 
+0

为什么拿一个日期,转换为字符串,然后_back_日期?这只是不必要的工作。如果你使用参数化查询,你将不必经历这个麻烦! – 2013-02-26 16:52:30

+0

我明白你的意思。上面的代码是糟糕的,但是对VB来说是新的,我还不知道更好。我想要做的就是创建一个日期时间/时间戳作为变量,并将其插入Oracle日期字段。 – Chris 2013-02-26 16:56:36

+0

我编辑了你的标题。请参见“[应的问题包括‘标签’,在他们的头衔?(http://meta.stackexchange.com/questions/19190/)”,这里的共识是“不,他们不应该”。 – 2013-02-26 17:06:43

回答

1

参数化查询是一个好的开始,因为您可以将本机.Net DateTime对象传递到企业库(例如)并指定它是DbType.DateTime并让EL担心它。但是,如果你不能这么做,因为你没有使用EL或类似的东西,并且坚持使用发布在你的问题中的SQL字符串,那么你需要知道Oracle如何在内部处理日期,特别是关于格式。

使用SQL开发人员或SQLPLUS,执行以下命令:

Select To_Char(sysdate) from Dual; 

所显示的格式是Oracle实例预计日期是如果你使用TO_DATE和Oracle将在TO_CHAR使用的格式。如果您在任何一个电话中都偏离该格式,那么您将遇到问题。然而,无论默认格式的使用,你可以通过在调用中指定它覆盖它:

ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH:MI:SS'; 

Select To_Char(sysdate, 'YYYY/MM/DD HH:MI:SS') from Dual; 
Select To_Date('2013/02/26 05:03:27', 'YYYY/MM/DD HH:MI:SS') from Dual; 

您可以通过设置NLS_DATE_FORMAT参数设置要Oracle使用默认的隐

请注意,前面的说明仅更改执行的会话的默认。我们使用自定义格式在我们的Oracle系统,并确保我们得到它,我们的登录触发器后使用的所有会话:

create or replace TRIGGER NLS_Parameters_OnLogon AFTER LOGON ON SCHEMA BEGIN  

-- This makes the database case insensitive for sorting and searching and sets the default date format for TO_CHAR and TO_DATE  

    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_COMP=LINGUISTIC'; 
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_SORT=BINARY_CI'; 
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY/MM/DD HH:MI:SS'''; 
End; 

有可能通过编辑一些改变整个Oracle服务器的默认日期格式的Oracle配置文件,但由于我们必须部署到我们无法控制的客户端服务器,因此我们使用此方法。

This article涵盖了我刚刚在示例中所做的更多一点。

+0

哇。这几乎涵盖了所有这一切。非常感谢史蒂夫 – Chris 2013-02-26 17:30:32

+0

没问题 - 我记得我经历了相反的痛苦:我知道.Net方面,但从未使用过Oracle。正如Steven Doggart所说,使用参数化查询是非常值得学习的。除了其他方面,它们可以使生活更轻松,并有助于防止SQL注入。许多框架可以帮助解决这个问题 - 我们在ODP和Instant Client中使用EL5/EntlibContrib。麻烦的一点是先让堆栈工作,但它工作得很好。 – 2013-02-26 17:38:44

3

首先,你似乎混淆了一个DateTime对象和DateTime对象格式化String表示之间的差异。 Now,甚至更好,DateTime.Now已经是DateTime对象,因此将其格式设置为字符串并解析字符串以再次将其返回DateTime值是没有意义的。所以,你可以简单地这样做是为了完成同样的事情:

Dim timestamp As Date = Date.Now 

注意,在VB.NET,Date是是短期的DateTime,就像IntegerInt32“短”的关键词。

其次,您不应该将DateTime值直接添加到SQL命令字符串中。您应该使用参数化查询。将DateTime值附加到SQL字符串时,必须确保格式正确(通过调用timestamp.ToString(...))。然而不幸的是,哪种格式是合适的,完全取决于服务器的文化设置。因此,使用DB参数会更好,请将参数值设置为等于实际的DateTime对象,然后让DB提供程序为您执行转换。

+1

我想这就是我没有阅读手册哈哈。为此欢呼! – Chris 2013-02-26 17:06:59