2012-07-20 2 views
1

oracle 명령의 select 문을 사용하여 vb.net .am의 코드 작성. 변수를 통해 인수 값을 전달할 때 오류가 발생합니다.vb.net을 사용하여 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 
+0

그리고 그 오류는 무엇입니까? 메시지/스택 추적을 제공해주십시오. 또한, 귀하의 코드에서 d1에 대한 매개 변수를 전달하는 것 같지 않습니다. –

+0

나는 나의 오류에 대해 언급했다. – vps

답변

3

SQL 쿼리에 날짜를 입력하지 않아도됩니다. 오라클이 문자열 + d1 +을 양식 mm/dd/yyyy의 날짜로 변환 할 수 없기 때문에 오류가 발생합니다. 나는 * SQL에서 정확히 같은 오류가 플러스 :

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 injection (의무적 인 XKCD comic link)의 위험에 코드를 집어 넣기 때문에이 작업을하는 습관에 빠지기를 바랍니다.

대신 bind 매개 변수를 사용하여 SQL 쿼리에 날짜를 설정하는 것이 좋습니다. 아래 예제 코드에서는 p_run_date이라는 바인드 매개 변수를 사용하여 d1 날짜를 쿼리에 전달하고 쿼리에서 반환 한 전화의 이름을 Console.WriteLine에 씁니다.

C#에서이 작업을 수행하는 코드를 작성하고 예상했던대로 작동하는지 확인한 다음 VB.NET으로 변환하려고 시도했습니다. 나는이 VB.NET 코드를 테스트하지 않은, 잘 변환에 하나 또는 두 개의 (희망 약간) 오류가있을 수 있습니다 : 당신이 시도 할 수 vb에서

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 
-1

:

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 문자열을 표현식에 연결하십시오.