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"}
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.? –
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
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