Почему это вызывает ArithmeticException в C #, когда SQLPlus все в порядке - PullRequest
1 голос
/ 26 июня 2010

У меня есть вид, соединяющий 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 ]

1 голос
/ 26 июня 2010

ЕСЛИ вас просто интересует какая-то часть разницы между двумя датами, тогда вам следует использовать DateDiff вместо ...

Например: DATEDIFF (гг, начало, конец, дата) YearsPassedSinceStart

возвращает нет. лет, прошедших с даты начала.

Аналогично, чтобы узнать количество месяцев, используйте «m» в качестве даты и «d», чтобы определить «нет». дней.

1 голос
/ 26 июня 2010

Я полагаю, что это связано с типом данных SQL-Number. Вы можете попробовать следующую опцию ..

1) .... Вокруг ((SYSDATE - l.expectedReturnDate), 2) ...

2) Преобразовать тип данных «NoOfDaysLate» в целое число.

...