Warum ist diese Ursache einer ArithmeticException in # C, wenn SQLPlus alles in Ordnung ist
-
30-09-2019 - |
Frage
habe ich einen Blick Anschluss von 4 Tabellen
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
Es gibt eine kleine Datumsberechnungen auf diesen Funden gehen, wie viele Tage waren ein Buch spät
(SYSDATE - l.expectedReturnDate)
Wenn ich eine SELECT * FROM BookCopyInfo
tun, bekomme ich Zeilen wie
4 | Human Computer Interaction | Alan Paul | 10-JUL-10 | -13.642292
So ist es richtig ist, und -13 ist die richtige Antwort tatsächlich.
DESC BookCopyInfo
kehrt
Name Null? Type
----------------------------------------- -------- ---------------
BOOKCOPYID NOT NULL NUMBER(38)
BOOKTITLE NOT NULL VARCHAR2(100)
BORROWEDBY VARCHAR2(126)
EXPECTEDRETURNDATE NOT NULL DATE
NOOFDAYSLATE NUMBER(38)
Jedoch in C #
DataTable dtBookInfo = new DataTable();
da = new OracleDataAdapter("SELECT * FROM BookCopyInfo", con);
da.Fill(dtBookInfo);
fängt eine Ausnahme in der da.Fill Zeile
Overflow wurde durch Benutzercode nicht behandelte.
Arithmetische Operation führte zu einem Überlauf.
Warum funktioniert es fein in SQLPlus aber nicht in C #? : S
Lösung
Ich glaube, es muss mit SQL-Datentyp Zahl. Sie können die folgende Option versuchen ..
1) .... Rund ((SYSDATE - l.expectedReturnDate), 2) ...
Konvertieren2), den Datentyp "NoOfDaysLate" auf ganze Zahl.
Andere Tipps
Wenn Sie nur in einem Teil der Differenz zwischen den beiden Daten interessiert sind, dann sollten Sie DateDiff verwenden stattdessen ...
Zum Beispiel: DATEDIFF (yy, startdate, endDate) YearsPassedSinceStart
gibt die Nr. von Jahren seit dem Start Datum überschritten.
Auf ähnliche Anzahl von Monaten zu finden, verwenden Sie ‚m‘ als Datumsteil oder ‚d‘ nicht zu bestimmen. von Tagen.