Pourquoi cette cause un ArithmeticException en C # quand SQLPlus est tout ok
-
30-09-2019 - |
Question
J'ai vue connecter 4 tables
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
Il y a une petite arithmétique date en cours qui trouve le nombre de jours était un livre fin
(SYSDATE - l.expectedReturnDate)
Quand je fais un SELECT * FROM BookCopyInfo
, je reçois des lignes comme
4 | Human Computer Interaction | Alan Paul | 10-JUL-10 | -13.642292
Il est donc correct et -13 est la bonne réponse en fait.
retourne 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)
Cependant, en C #
DataTable dtBookInfo = new DataTable();
da = new OracleDataAdapter("SELECT * FROM BookCopyInfo", con);
da.Fill(dtBookInfo);
capture une exception dans la ligne da.Fill
OverflowException a été non gérée par le code utilisateur.
opération arithmétique a donné lieu à un trop-plein.
Pourquoi ça marche bien dans SQLPlus mais échoue en C #? : S
La solution
Je crois qu'il doit avec le type de données SQL Nombre. Vous pouvez essayer l'option suivante ..
1) .... Round ((SYSDATE - l.expectedReturnDate), 2) ...
2) convertir le type de données de "NoOfDaysLate" à nombre entier.
Autres conseils
Si vous êtes intéressé par une partie de la différence entre les deux dates, vous devez utiliser à la place DateDiff ...
Par exemple: DATEDIFF (yy, startDate, endDate) YearsPassedSinceStart
retourne le pas. des années écoulées depuis la date de début.
De même pour trouver plusieurs mois, l'utilisation « m » comme datepart ou « d » pour déterminer non. de jours.