2010-06-26 14 views
1

我有连接4台为什么这个事业在C#中ArithmeticException时的sqlplus一切ok

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

+0

如果你用一个常量替代'(SYSDATE-l.expectedReturnDate)',那么它是否工作(在你的视图中说'0 AS NoOfDaysLate'?只是为了确保日期计算实际上导致你的问题... – 2010-06-26 09:12:04

+0

是的。该应用程序运行正常,0 AS NoOfDaysLate:S – 2010-06-26 09:31:46

回答

1

我相信它必须使用SQL-Number数据类型。你可以试试下面的选项..

1)....回合((SYSDATE - l.expectedReturnDate),2)...

2)转换 “NoOfDaysLate” 的数据类型为整数。

+0

如何在Oracle 11g中执行转换? – 2010-06-26 09:32:26

+0

舍入取得了诀窍:) Thanx a million :) – 2010-06-26 09:36:48

+0

@Ranhiru:不客气。 – 2010-06-26 09:39:36

1

如果你是在这两个日期之间的差值的某些部分有兴趣,那么你应该使用DateDiff的,而不是...

如: DATEDIFF(YY,的startDate,结束日期)YearsPassedSinceStart

回报没有。自开始日期过去的几年。

类似于查找月数,使用'm'作为日期部分或'd'来确定no。的日子。

+0

DATEDIFF不是一个Oracle函数...这是SQL Server。 – jordanwillis 2017-07-07 15:25:06

相关问题