Perché questa causa un ArithmeticException in C #, quando SQLPlus è tutto ok
-
30-09-2019 - |
Domanda
Ho una visione che collega 4 tavoli
CREATE VIEW BookCopyInfo
AS
SELECT
bc.BookCopyID, b.BookTitle, m.FirstName || ' ' || m.LastName AS BorrowedBy,
l.expectedReturnDate, (SYSDATE - l.expectedReturnDate) AS NoOfDaysLate
FROM Book b, Member m, Lending l, BookCopy bc
WHERE b.BookID = bc.BookID AND l.MemberID = m.MemberID
AND l.BookCopyID = bc.BookCopyID
C'è un piccolo aritmetica delle date in corso che trova il numero di giorni era in ritardo di un libro
(SYSDATE - l.expectedReturnDate)
Quando faccio un SELECT * FROM BookCopyInfo
, ottengo le righe come
4 | Human Computer Interaction | Alan Paul | 10-JUL-10 | -13.642292
Quindi è corretto e -13 è la risposta corretta in realtà.
ritorna DESC BookCopyInfo
Name Null? Type
----------------------------------------- -------- ---------------
BOOKCOPYID NOT NULL NUMBER(38)
BOOKTITLE NOT NULL VARCHAR2(100)
BORROWEDBY VARCHAR2(126)
EXPECTEDRETURNDATE NOT NULL DATE
NOOFDAYSLATE NUMBER(38)
Tuttavia in C #
DataTable dtBookInfo = new DataTable();
da = new OracleDataAdapter("SELECT * FROM BookCopyInfo", con);
da.Fill(dtBookInfo);
cattura un'eccezione nella linea da.Fill
OverflowException è stata gestita dal codice utente.
operazione aritmetica ha comportato un trabocco.
Perché funziona bene in SQLPlus ma non riesce in C #? : S
Soluzione
credo che abbia a con SQL-Numero tipo di dati. Si può provare la seguente opzione ..
1) .... Round ((SYSDATE - l.expectedReturnDate), 2) ...
2) Convertire il tipo di dati "NoOfDaysLate" per intero.
Altri suggerimenti
se siete solo interessati a una parte della differenza tra le due date, allora si dovrebbe utilizzare DateDiff invece ...
Ad esempio: DATEDIFF (aa, startDate, endDate) YearsPassedSinceStart
restituisce il no. di anni trascorsi dalla data di inizio.
Allo stesso modo per trovare il numero di mesi, l'uso 'm' come datepart o 'D' per non determinare. di giorni.