0

開始日と終了日のユーザー入力を読み取る Web ページで、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() ステートメントを少なくとも 12 の異なる方法で変更しようとしましたが、まだ何も機能していません。私は何を間違っていますか?

ありがとうございました。

編集:

開始日と終了日は、次のように宣言および設定されるグローバル変数です。

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 オブジェクトを使用する必要があります。この質問と回答を読んでください。

別の解決策は、文字列パラメーターを明示的に日付に変換することです。

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 に答える