在Oracle查询中使用日期参数

时间:2013-07-16 21:18:33

标签: vb.net oracle

我有一组查询,我在网页上运行VB.NET代码隐藏,读取用户输入的开始和结束日期。这是代码/查询:

strOraQuery = "SELECT a.col1, a.col2, a.col3 " & _
              "FROM a_table a LEFT JOIN b_table b ON (a.col1=b.col1) " & _
              "WHERE a.datecol BETWEEN :startdate AND :enddate"

oracmd = New OracleCommand(strOraQuery, oracn)    
oracmd.Parameters.Add(New OracleParameter(":enddate", strEndDate))
oracmd.Parameters.Add(New OracleParameter(":startdate", strStartDate))

编辑#2:这些参数在我的代码中实际上是乱序的,所以我翻了它们以显示我实际上遇到的问题。请参阅下面的答案/评论。

strStartDate和strEndDate都是mm / dd / yyyy格式。

这段代码通过DataReader和DataTable运行查询。我从运行查询中收到的错误是

  

ORA-01858:找到数字所在的非数字字符   预期

我试图以至少十几种不同的方式更改查询和Parameters.Add()语句,但还没有任何工作。我做错了什么?

谢谢。

编辑:

开始日期和结束日期是声明的全局变量,并设置如下:

Dim strStartDate As String
Dim strEndDate As String

Protected Sub btnRun_Click(sender As Object, e As EventArgs) Handles btnRun.Click
     strStartDate = txtStartDate.Text
     strEndDate = txtEndDate.Text
...

2 个答案:

答案 0 :(得分:0)

应用程序会话中的NLS_DATE_FORMAT似乎不等于MM/DD/YYYY。这就是隐式char-to-date转换失败的原因。

您应该在OracleParameter构造函数中使用DateTime对象而不是String。请read this question and answers

另一种解决方案是明确地将字符串参数转换为日期:

SELECT a.col1, a.col2, a.col3
  FROM a_table a LEFT JOIN b_table b ON (a.col1=b.col1)
 WHERE a.datecol BETWEEN to_date(:startdate, 'mm/dd/yyyy') AND to_date(:enddate, 'mm/dd/yyyy')

TO_DATE中的格式掩码参数的优先级高于会话NLS设置。

答案 1 :(得分:0)

正如在我的问题的编辑中所指出的,我设置的参数是乱序的,在ODP.NET中默认是不允许的。除非包含这行代码,否则参数按顺序绑定

OracleCommand.BindByName = True

这在Oracle论坛的this thread中有所提及。