1

オラクルコマンドでselectステートメントを使用して、vb.net .amにコードを書いています。変数を介して引数値を渡すと、エラーが発生します。

my code
------
chk1 = TextBox1.Text
d1 = Date.Parse(chk1)


--------
--------
try
   cn.Open()

        cmd = New OracleCommand("select PHONE from  reports.renewal_contact_t where run_date=to_date('+ d1 +','mm/dd/yyyy') and  EXP_DATE =to_date('07/21/2012','mm/dd/yyyy')", cn)

 ------------
 ada.Fill(ds, "reports.renewal_contact_t ")
end try


eror(in ada.fill statement)
 -----
ORA-01858: a non-numeric character was found where a numeric was expected 
4

2 に答える 2

3

SQLクエリに日付を入力することができませんでした。+ d1 +Oracleは文字列をフォームの日付に変換できないため、エラーが発生しますmm/dd/yyyy。SQL*Plusでもまったく同じエラーが発生します。

SQL> select to_date('+ d1 +', 'mm/dd/yyyy') from dual;
select to_date('+ d1 +', 'mm/dd/yyyy') from dual
               *
ERROR at line 1:
ORA-01858: a non-numeric character was found where a numeric was expected

日付をSQL文字列に連結して、機能しているように見えるクエリを取得する方法がありますが、それについては説明しません。コードがSQLインジェクションのリスクにさらされるため、これを行う習慣を身に付けてほしくありません(必須のXKCDコミックリンク)。

代わりに、バインドパラメータを使用してSQLクエリで日付を設定することをお勧めします。以下のサンプルコードはp_run_date、日付をクエリに渡すために指定されたバインドパラメータを使用d1し、クエリによって返された電話の名前をに書き込みますConsole.WriteLine

これをC#で実行するコードを記述し、テストして期待どおりに動作することを確認してから、VB.NETに変換しようとしました。私はこのVB.NETコードをテストしていないので、変換で1つまたは2つの(できればマイナーな)エラーが発生する可能性があります。

    Using OracleCommand cmd As New OracleCommand("select PHONE from reports.renewal_contact_t where run_date=:p_run_date and EXP_DATE =to_date('07/21/2012','mm/dd/yyyy')", cn)
        cmd.Parameters.Add(New OracleParameter() { Direction = ParameterDirection.Input, ParameterName = "p_run_date", OracleDbType = OracleDbType.Date, Value = d1 })
        Using OracleDataReader reader As cmd.ExecuteReader()
            While reader.Read()
                Console.WriteLine(reader.GetString(0))
            End While
        End Using
    End Using
于 2012-07-20T07:46:44.540 に答える
-1

あなたはvb試すことができます:

cmd = New OracleCommand(
    "select PHONE from  reports.renewal_contact_t where run_date=to_date('" & d1 & "','mm/dd/yyyy') and  EXP_DATE =to_date('07/21/2012','mm/dd/yyyy')", cn)

これにより、d1文字列が式に連結されます

于 2015-01-20T14:02:47.437 に答える