Почему это вызывает 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)

Когда я делаю a 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. Строка заливки

OverflowException был не обработан пользовательским кодом.
Арифметическая операция привела к переполнению.

Почему это хорошо работает в SQLPlus, но перестало работать в C#?:S

1
задан Peter Lang 26 June 2010 в 09:10
поделиться

2 ответа

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

1) .... Round ((SYSDATE - l.expectedReturnDate), 2) ...

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

1
ответ дан 2 September 2019 в 23:29
поделиться

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

Например: DATEDIFF (yy, startDate, endDate) YearsPassedSinceStart

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

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

1
ответ дан 2 September 2019 в 23:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: