2013-06-13 6 views
5

mam funkcja wykonuje się zbiór SearchCriteria obiektów: columnName lub klucza, operatora (<, <=, like, etc.), a wartością .ORA 01858: Postać nienumeryczny stwierdzono, gdzie oczekuje się numeryczny

Funkcja tworzy obiekt polecenia. Ustawiłem wartość jako parametr polecenia, a teraz moje testy jednostek nie będą działać dla dat. Ale wszystkie moje testy jednostkowe działają przeciwko wszystkim innym typom danych, takim jak varchar.

W debugera, jeden z moich testów jednostkowych daty, które nie skończy się z cmd patrząc tak:

SELECT * FROM (SELECT DocumentId 
       FROM idx1_AuthLetters a 
       INNER JOIN Documents b ON a.DocumentId = b.Id 
       WHERE Status in ('L','S','V') AND letter_date <= :1 
       ORDER BY DOCUMENTID) 
WHERE RowNum <= 14 

miałem ten parametr o nazwie jak: letter_date. Ale mogę mieć: letter_date> = ### & &: letter_date < = ### gdzie szukam między dwiema datami. Nie mogę mieć tej samej nazwy parametru dwa razy, więc używam licznika i ++ jako nazwy parametru, podczas gdy przechodzę przez wszystkie moje obiekty SearchCriteria. Dziwne, żeby zobaczyć parametr o takiej nazwie, ale wiem, że działa w większości przypadków.

Jeśli wezmę to i umieścić w oknie zapytań i spojrzeć skontrolować wartość param i podłącz że:

SELECT * FROM (SELECT DocumentId 
       FROM idx1_AuthLetters a 
       INNER JOIN Documents b ON a.DocumentId = b.Id 
       WHERE Status in ('L','S','V') AND 
        letter_date <= TO_DATE('2013-1-21', 'yyyy-mm-dd') 
       ORDER BY DOCUMENTID) 
WHERE RowNum <= 14 

to działa dobrze. Ale to nie zadziała z kodu C# z mojego testu jednostkowego. Znowu to działa dla wszystkich innych typów danych. I działało zanim sparametryzowałem wartość w instrukcji select.

Dokładny błędu:

{ "ORA-01858: charakter non-numeryczna została znaleziona gdzie oczekiwano numeryczny"}

+0

W swojej kod C#, jaki jest typ danych parametru data? Jeśli jest to ciąg znaków, w jaki sposób jest sformatowany - "yyyy-mm-dd", "mm/dd/rrrr" itd.? –

+0

Cóż, to naprawdę nie jest parametr daty. Jest bardzo ogólny. Przez większość czasu jest to varchar param. Ale sprawdzam, czy jest to pole daty przed czasem, a jeśli tak, to przekazuję tę wartość do funkcji parseDate. Mogę wziąć 4 formaty daty, ale zawsze zwracam je w formacie pasującym do mojej maski: rrrr-mm-dd. – Sam

+0

Tak więc w powyższym przykładzie podłączam się "2013-1-21. Powyższy SQL działał przez dłuższy czas. Dopóki nie zrobiłem tego jako parametru polecenia, przestało działać. Również, jak mówię powyżej, mogę podłączyć to do mojego okna zapytania i to działa dobrze. ODP.Net nie powinien przejmować się, czy pracuję z datą. Wszystko, co robię, polega na podłączeniu całego TO_DATE ('2013-1-21', 'rrrr-mm-dd') do symbolu zastępczego: 1. – Sam

Odpowiedz

5

Odpowiedź jest bardzo prosta tutaj: w twojej polecenie, zbuduj następujący ciąg TO_DATE(:1, 'yyyy-mm-dd'). Następnie upewnij się, że ciąg o numerze :1 ma dokładny format.

Tekst polecenie powinno być tak:

SELECT * FROM (SELECT DocumentId 
      FROM idx1_AuthLetters a 
      INNER JOIN Documents b ON a.DocumentId = b.Id 
      WHERE Status in ('L','S','V') AND letter_date <= TO_DATE(:1, 'yyyy-mm-dd') 
      ORDER BY DOCUMENTID) 
WHERE RowNum <= 14 
+0

@RichBianco Myślę, że moja odpowiedź to obejmuje. twoje dane wejściowe nie pasują do twojego "Modelu formatu". Wszystko inne - szczegół, który jest interesujący dla wiedzy ogólnej, ale nie jest tak ważny, aby wygenerować poprawkę. :-) Własny cytat: * "... upewnij się, że ciąg, który przechodzi w: 1 ma dokładny format." * Tj. Model formatu, który pasuje wejściowy –

+0

@RichBianco usunąć co? usunięcie pytania, które zawiera odpowiedź, nie jest świetnym pomysłem. Przyjmij odpowiedź, a życie będzie trwało. –

Powiązane problemy