PDA

View Full Version : حرفه ای: خطای تقسیم بر صفر در بانک



ebrahim.rayatparvar
پنج شنبه 04 خرداد 1396, 12:33 عصر
سلام دوستان عزیز.

من یه قطعه کدی دارم داخل try catch اینو نوشتم و کارش اینه که یه لیستی رو به من بده. زمان لیست دادن سمت sql نصف لیست داده میشه و وسط کار خطای تقسیم بر صفر میده ولی این خطا به سمت try catch مورد نظر سمت برنامه نمیاد همون چند سطر رو در داخل گرید میریزه. حالا خودتون هم بیاین یه پروسیجر تو sql درست کنید و کد select 1/0 رو داخلش بنویسید زمانی که سمت بر نامه این رو فراخوانی میکنید باید تو catch بیافته و مدیریتش کرد ولی این کار انجام نمیشه.

Mag-Mag
شنبه 06 خرداد 1396, 08:30 صبح
سلام
به نظرم باید این خطا رو سمت خود اس کیو ال چک بکنید
چون بالاخره کد داره اونجا کامپایل میشه و خروجی به برنامه شما بر میگیرده
یک try catch توی اس کیو ال بزنید و اونچا مدیریتش کنید


BEGIN TRY
{ sql_statement | statement_block }
END TRY
BEGIN CATCH
[ { sql_statement | statement_block } ]
END CATCH

ebrahim.rayatparvar
سه شنبه 09 خرداد 1396, 09:12 صبح
سلام دوست من. من این داستان رو که تو try catch تو خود sql رو به دوستم که کد sql رو میزنه گفتم گقته من تمام کدها رو تو try catch میزنم و مدیریت میکنه مشکل اینه که تو sql ما خطا رو میبینیم ولی این خطا سمت برنامه نمیاد.

ژیار رحیمی
سه شنبه 09 خرداد 1396, 10:05 صبح
خب مشخصه از خطای تقسیم بر صفر که لیست شما آیتمی نداره یا یک ایتم در آن قرار دارد که 1/2 یا 0/2 بصورت int صفر برگردانده میشود که طول لیست رو بر نتیجه محاسبه نصف طول لیست (صفر) تقسیم میکنی پس نتیجه آن خطای مذکور رخ می دهد.لازم به try,catch نیست با if خود کنترل کن که اگر طول لیست بزرگتر با مساوی دو بود نصف لیست برگردانده شود در غیر اینصورت خود لیست برگردانده شود.

ebrahim.rayatparvar
سه شنبه 09 خرداد 1396, 11:51 صبح
خب مشخصه از خطای تقسیم بر صفر که لیست شما آیتمی نداره یا یک ایتم در آن قرار دارد که 1/2 یا 0/2 بصورت int صفر برگردانده میشود که طول لیست رو بر نتیجه محاسبه نصف طول لیست (صفر) تقسیم میکنی پس نتیجه آن خطای مذکور رخ می دهد.لازم به try,catch نیست با if خود کنترل کن که اگر طول لیست بزرگتر با مساوی دو بود نصف لیست برگردانده شود در غیر اینصورت خود لیست برگردانده شود.

سلام مهندس جان.

ببینید یه توضیح کوچیکی دیگه بدم اینه که ما یه گزارشی رو برای مشتری ارسال کرده بودیم سمت ما مشکلی نبود باید طبق قانون گزارش ما 13 ستون میامد ولی وقتی با مشتری داشتیم حرف میزدیم میگفت 4 ستون بیشتر تو نمودار نمیبینم ستون نه میله برای چارت های میله ای اینجور بهتره. ولی زمانی که ما تست میکردیم درست بود تا اینکه آرخر تونستیم بفمیم که تو یکی از سطر ها که سمت sql داره محاسبه میکنه یه جایی تقسیم بر 0 داریم که امدیم مدیریتش کردیم و درست کردیمش ولی برای فهمیدن مشکل از کجا هست تقریبا یک روز کاری ما رو گرفت که میدونید وقت برای هر فردی تو هر زمینه ای طلا هست ولی اما اگه همون اول خطای تقسیم بر صفر از تو sql که در سطر 5 ایجاد میشد به سمت برنامه میامد چنین وقی رو ما هدر نمیدادیم.

الان فکر کنم بهتر توضیح دادم مشکل من مدیریت کردن این فرمول تو sql نیست مشکل من اینه چرا این چنین خطاهایی که در sql رخ میده حتی در داخل try catch هم باشه تو برنامه نمایش داده نمیشه که کاربر و ماهایی که میخوایم پشتیبانی انجام بدیم دچار مشکل نشیم.

ebrahim.rayatparvar
سه شنبه 09 خرداد 1396, 12:14 عصر
یه نکته ای که هست شما همه میدونید sql زبان توصیفیه و مثل #C نیست که خط به خط بیاد چک کنه همه رو میگیره و جواب میده. مثال بالایی که زدم یکی از این نوع مشکلها بود حتی تو گزارش دیگه که این بیشتر اتفاق میافته ما توی ساخت گزارش خروجی رو در نظر گرفته بودیم int چون فکر نمیکردیم bigint بشه ولی تو یکی از سطر ها یکی از جواب ها شد bigint و خطا داد ولی باز هم گزارش سمت برنامه نمایش داده نشد.
الان این کوئری رو ببینید :


DECLARE @t_temp TABLE
(
name NVARCHAR(50)
,totallPrice INT
);

INSERT INTO @t_temp
( name ,totallPrice )
VALUES
( N'ramin' -- name - nvarchar(50)
,123452678 -- totallPrice - int
),
( N'reza' -- name - nvarchar(50)
,852165289 -- totallPrice - int
),
( N'ebi' -- name - nvarchar(50)
,656525454 -- totallPrice - int
),
( N'sami' -- name - nvarchar(50)
,654655465 -- totallPrice - int
),
( N'zahra' -- name - nvarchar(50)
,655465235 -- totallPrice - int
),
( N'kolsom' -- name - nvarchar(50)
,656542654 -- totallPrice - int
),
( N'khadijeh' -- name - nvarchar(50)
,656542655 -- totallPrice - int
);

SELECT
SUM(tt.totallPrice) OVER ( ORDER BY tt.totallPrice ) AS sum_price
FROM
@t_temp AS tt
ORDER BY
tt.totallPrice;


این باید 7 سطر داشته باشه ولی از سطر 5 گفتم به جای اینکه int باشه bigint میشه شما اینو اجرا کنید میبینید 4 سطر جواب دارید و بعدش خطا میبینید که تو try catch سی شارپ نمیاد.

Mag-Mag
سه شنبه 09 خرداد 1396, 13:43 عصر
برای این کیوری که فرستادی میتونی با cast مشکلت رو رفع کنی

DECLARE @t_temp TABLE
(
name NVARCHAR(50)
,totallPrice INT
);





INSERT INTO @t_temp
( name ,totallPrice )
VALUES
( N'ramin' -- name - nvarchar(50)
,123452678 -- totallPrice - int
),
( N'reza' -- name - nvarchar(50)
,852165289 -- totallPrice - int
),
( N'ebi' -- name - nvarchar(50)
,656525454 -- totallPrice - int
),
( N'sami' -- name - nvarchar(50)
,654655465 -- totallPrice - int
),
( N'zahra' -- name - nvarchar(50)
,655465235 -- totallPrice - int
),
( N'kolsom' -- name - nvarchar(50)
,656542654 -- totallPrice - int
),
( N'khadijeh' -- name - nvarchar(50)
,656542655 -- totallPrice - int
);

BEGIN TRY


SELECT
SUM(CAST(tt.totallPrice as bigint)) OVER ( ORDER BY tt.totallPrice ) AS sum_price
FROM
@t_temp AS tt
ORDER BY
tt.totallPrice;


END TRY


BEGIN CATCH
select 0 AS sum_price
end CATCH


برای اون خطای تقسیم بر 0 هم باید توی خود اس کیو ال روش کار کنی

کد داره توی اس کیو ال کامپایل میشه
و همونجا خطا میخوره

فقط شما میتونی توی کدت بفهمی خطای اس کیو ال خوردی و مثلا به مشتری یک پیام مناسب نشون بدی یا حالا هر کار دیگه بسته به شزایط
اما نمی تونی هندل کنی اون خطا رو

try
{
//code
}
catch(SqlException sqlEx)
{
//code
}

Mahmoud.Afrad
سه شنبه 09 خرداد 1396, 19:23 عصر
مشکل از کد شماست(برای بنده مشکلی ندارد). کد sql و کد سی شارپی که این مشکل رو داره بزارید.

ebrahim.rayatparvar
چهارشنبه 10 خرداد 1396, 08:49 صبح
برای این کیوری که فرستادی میتونی با cast مشکلت رو رفع کنی

DECLARE @t_temp TABLE
(
name NVARCHAR(50)
,totallPrice INT
);





INSERT INTO @t_temp
( name ,totallPrice )
VALUES
( N'ramin' -- name - nvarchar(50)
,123452678 -- totallPrice - int
),
( N'reza' -- name - nvarchar(50)
,852165289 -- totallPrice - int
),
( N'ebi' -- name - nvarchar(50)
,656525454 -- totallPrice - int
),
( N'sami' -- name - nvarchar(50)
,654655465 -- totallPrice - int
),
( N'zahra' -- name - nvarchar(50)
,655465235 -- totallPrice - int
),
( N'kolsom' -- name - nvarchar(50)
,656542654 -- totallPrice - int
),
( N'khadijeh' -- name - nvarchar(50)
,656542655 -- totallPrice - int
);

BEGIN TRY


SELECT
SUM(CAST(tt.totallPrice as bigint)) OVER ( ORDER BY tt.totallPrice ) AS sum_price
FROM
@t_temp AS tt
ORDER BY
tt.totallPrice;


END TRY


BEGIN CATCH
select 0 AS sum_price
end CATCH


برای اون خطای تقسیم بر 0 هم باید توی خود اس کیو ال روش کار کنی

کد داره توی اس کیو ال کامپایل میشه
و همونجا خطا میخوره

فقط شما میتونی توی کدت بفهمی خطای اس کیو ال خوردی و مثلا به مشتری یک پیام مناسب نشون بدی یا حالا هر کار دیگه بسته به شزایط
اما نمی تونی هندل کنی اون خطا رو

try
{
//code
}
catch(SqlException sqlEx)
{
//code
}


مهندس جان اینکه با یه cast درست میشه رو ما هم فهمیدیم ولی منطور من اینه خطایی که روخ میده رو زمانی که برنامه دارین کار میکنید به سمت try catch خود همون sqlexception نمیاد منظور من اینه یعنی همون 4 سطری که ایجاد میشه رو نمایش میده و نمیگه از سر 5 خطا بوجود آمده.