2013-07-16 30 views
0

我有一組查詢,我正在用VB.NET代碼隱藏在讀取用戶輸入的開始日期和結束日期的網頁上。下面是代碼/查詢:在Oracle查詢中使用日期參數

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:一個非數字字符被發現,其中一個數字是 預期

我試圖更改查詢和參數。以至少十幾種不同的方式添加()語句並且沒有任何工作。我究竟做錯了什麼?

謝謝。

編輯:

的開始和結束日期是宣佈並設置像這樣的全局變量:

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

似乎NLS_DATE_FORMAT在應用程序會話不等於MM/DD/YYYY。這就是隱式字符到最新轉換失敗的原因。

您應該在OracleParameter構造函數中使用DateTime對象,而不是字符串之一。請,read this question and answers

另一個解決方案是字符串參數轉換爲日期明確:在TO_DATE

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') 

格式mask參數具有比會話NLS設置更高的優先級。

+0

我再次嘗試了這兩個,都沒有工作......我很難過。感謝您的幫助。 – Tim

+0

請爲'strEndDate'和'strStartDate'顯示聲明和賦值。 – suPPLer

+0

更新了問題以顯示變量聲明和賦值 – Tim

0

正如編輯我的問題所述,我設置的參數不符合默認情況下在ODP.NET中不允許的順序。參數由命令,除非該行的代碼包含

OracleCommand.BindByName = True 

這在this thread了在Oracle論壇上指出的約束。