لماذا هذا يسبب ArithMeticexception في C# عندما يكون SQLPlus كل شيء على ما يرام
-
30-09-2019 - |
سؤال
لدي عرض توصيل 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#؟ :س
المحلول
أعتقد أنه يجب أن يكون ذلك مع نوع بيانات SQL-Number. يمكنك تجربة الخيار التالي ..
1) .... جولة ((sysdate - l.ExegedReturndate) ، 2) ...
2) تحويل نوع البيانات من "noofdayslate" إلى عدد صحيح.
نصائح أخرى
إذا كنت مهتمًا فقط بجزء من الفرق بين التاريخين ، فيجب عليك استخدام Datediff بدلاً من ذلك ...
على سبيل المثال: Datediff (yy ، startDate ، enddate) yearspassedSincestart
يعود لا. من سنوات مرت منذ تاريخ البدء.
على غرار العثور على عدد من الأشهر ، استخدم "M" كـ DatePart أو "D" لتحديد لا. أيام.