Почему это вызывает ArithmeticException в C#, когда SQLPlus все в порядке
У меня есть вид, соединяющий 4 таблицы
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
Происходит небольшая арифметика дат, которая определяет, на сколько дней книга опоздала
(SYSDATE - l.expectedReturnDate)
Когда я делаю SELECT * FROM BookCopyInfo
я получаю строки как
4 | Human Computer Interaction | Alan Paul | 10-JUL-10 | -13.642292
Так что это правильно, и -13 является правильным ответом на самом деле.
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)
Однако в C#
DataTable dtBookInfo = new DataTable();
da = new OracleDataAdapter("SELECT * FROM BookCopyInfo", con);
da.Fill(dtBookInfo);
ловит исключение в строке da.Fill
OverflowException не было обработано кодом пользователя.
Арифметическая операция привела к переполнению.
Почему он отлично работает в SQLPlus, но не работает в C#?:S
2 ответа
Я считаю, что это связано с типом данных SQL-номер. Вы можете попробовать следующий вариант.
1).... Round ((SYSDATE - l.expectedReturnDate), 2)...
2) Преобразовать тип данных "NoOfDaysLate" в целое число.
Если вас просто интересует какая-то часть различий между двумя датами, вам следует использовать вместо него DateDiff...
Например: DATEDIFF(yy, startDate, endDate) YearsPassedSinceStart
возвращает нет. лет прошло с даты начала.
Аналогично, чтобы узнать количество месяцев, используйте "m" в качестве части даты или "d", чтобы определить "нет". дней.