0

我有一组查询,我在网页上用完了 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
...
4

2 回答 2

0

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

OracleCommand.BindByName = True

这在 Oracle 论坛上的这个线程中有说明。

于 2013-07-17T16:26:40.360 回答
0

似乎NLS_DATE_FORMAT在应用程序会话中不等于MM/DD/YYYY. 这就是隐式字符到日期转换失败的原因。

您应该在 OracleParameter 构造函数中使用 DateTime 对象而不是 String one。请阅读这个问题和答案

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

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 设置。

于 2013-07-17T00:13:19.173 回答