دسته بندی ها
11:42 1400/07/01

خطای Arithmetic operation resulted in an overflow در سی شارپ

مشخصات سوال کننده :
کاربر : pedram_khan     امتیاز کاربر : 277     رتبه کاربر : 6
دسته بندی : سی شارپ Asp.net Core

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 3164
هوش مصنوعی

پاسخ هوش مصنوعی

این خطا معمولاً زمانی رخ می دهد که عمل جمع (یا سایر عملیات ریاضی) بر روی مقادیری انجام شود که در محدوده نوع داده ای مورد استفاده نیستند. در کد شما، احتمالاً `PackageMainPrice` دارای مقادیری است که وقتی جمع می شوند، از حداکثر مقدار قابل قبول برای نوع داده ای که استفاده می کنید فراتر می رود.

برای رفع این مشکل می توانید از نوع داده ای بزرگتر مانند `decimal` یا `double` استفاده کنید. با این حال، برای جمع زدن مقادیر، بهتر است در SQL Server از `decimal` استفاده کنید تا دقت بالاتری داشته باشید.

شما می توانید کد خود را به شکل زیر تغییر دهید:

public decimal TotalForoosh()
{
   var query = (from up in _context.UserPackage_Tbl
                join p in _context.Package_Tbl on up.PackageID equals p.PackageID
                select new { 
                             total = (decimal)up.PackageMainPrice, 
                             ostadid = p.UserId
                           });
            if (userId != "-1")
            {
                query = query.Where(q => q.ostadid == userId);
            }
            return query.Select(q => q.total).DefaultIfEmpty(0).Sum();
}

توجه داشته باشید که در اینجا ما `PackageMainPrice` را به `decimal` تبدیل کردیم. اطمینان حاصل کنید که نوع داده اصلی در پایگاه داده نیز با نوع داده ای که در اینجا استفاده می کنید سازگار باشد.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : saedbfd 14:32 1400/07/01

رفع خطای Arithmetic operation resulted in an overflow

دلیل این خطا یعنی سر ریز شدن مقدار. به عنوان مثال ممکنه شما یک متغیر از نوع byte تعریف کردید ولی مقداری بیشتر از حد مجاز داخلش قرار دادید. مثلا مقدار 1685452 رو شما نمی تونید داخل یک متغیر از نوع بایت قرار بدید.

در کوئری که نوشته شده یک متغیر به نام total دارید و یک فیلد به نام PackageMainPrice که البته مشخص نکردید که از چه نوعی هست این متغیر. احتمالا از نوع int هست. شما میتونید در حین اجرای کوئری مشخص کنید که این متغیر بیشتر از یک int فضا داشته باشه. میتونید از دستور Convert.ToInt64 استفاده کنید. کد شما به صورت زیر میشه :

public long TotalForoosh()
{
   var query = (from up in _context.UserPackage_Tbl
                join p in _context.Package_Tbl on up.PackageID equals p.PackageID
                select new { 
                             total = Convert.ToInt64(up.PackageMainPrice), 
                             ostadid = p.UserId
                           });
            if (userId != "-1")
            {
                query = query.Where(q => q.ostadid == userId);
            }
            return query.Select(q => q.total).DefaultIfEmpty(0).Sum();
}

با کد بالا مشکل شما حل میشه. 

به این پاسخ امتیاز بدهید    0
امتیاز: 1664 رتبه: 1
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود