передача аргументов в команду oracle с использованием vb.net

Я пишу код в vb.net .am, используя оператор select в команде oracle. когда я передаю значения аргументов через переменную, я получаю сообщение об ошибке.

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 

person vps    schedule 20.07.2012    source источник
comment
И что это за ошибка, предоставьте сообщение/трассировку стека. Кроме того, из вашего кода не видно, что вы передаете параметр для d1.   -  person Adriaan Stander    schedule 20.07.2012


Ответы (2)


Вам не удалось указать дату в запросе SQL. Вы получаете сообщение об ошибке, потому что Oracle не может преобразовать строку + d1 + в дату в форме 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, поэтому вполне может быть одна или две (надеюсь, незначительные) ошибки при преобразовании:

    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
person Luke Woodward    schedule 20.07.2012

В 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 с вашим выражением

person calin    schedule 20.01.2015