我有一组查询,我在网页上运行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
...
答案 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中有所提及。