ورود

View Full Version : TADOStoredProc



sasan_vm
سه شنبه 10 خرداد 1390, 15:44 عصر
سلام

اگر هنگام فراخوانی یک پروسیجر خطایی در آن (منظور کد t-sql سمت server است) پیش آید ، در صورتیکه پروسیجر را با استفاده از TADOStoredProc فراخوانی کرده باشید ، سمت client هیچ خطائی گزارش داده نمی شود ولی در صورتیکه از TADODataSet یا TADOQuery برای فراخوانی استفاده شده باشد exception سمت Client رخ خواهد داد.

علت این مسئله چیست ؟
راه حلی برای آنکه TADOStoredProc مانند TADODataSet یا TADOQuery عمل کند دارد ؟

پروسیجر نمونه:


ALTER PROC pr_WaitToTemp
@IdNo varchar(50)
AS
BEGIN
DECLARE @InDate datetime
DECLARE @Repeat bit
DECLARE @GID bigint
DECLARE @Title int
DECLARE @Time datetime
DECLARE @Error int

SET @Time = DATEADD(day, DATEDIFF(day, 0, getdate()), 0)
SELECT TOP 1 @GID = GID, @Title = Title, @InDate = InDate, @Repeat = Repeat FROM tbl_wait WHERE IdNo = @IdNo
IF (@InDate IS NULL OR @Repeat IS NULL)
BEGIN
RAISERROR('کد شناسائی در لیست موجود نیست.', 16, 1)
RETURN -1
END

BEGIN TRANSACTION MOVE_TO_TEMP_1

INSERT INTO tmp4out (IdNo, InDate, OutDateOrd, Repeat) VALUES (@IdNo, @InDate, @Time, @Repeat)
SELECT @Error = @@ERROR
IF @Error <> 0
BEGIN
RAISERROR('Can not insert in table temp.', 16, 1)
ROLLBACK TRANSACTION MOVE_TO_TEMP_1
RETURN -2
END

DELETE FROM tbl_wait WHERE IdNo = @IdNo
SELECT @Error = @@ERROR
IF @Error <> 0
BEGIN
RAISERROR('Can not delete from list.', 16, 1)
ROLLBACK TRANSACTION MOVE_TO_TEMP_1
RETURN -3
END

COMMIT TRANSACTION MOVE_TO_TEMP_1

BEGIN TRANSACTION MOVE_TO_TEMP_2

INSERT INTO tbl_waitarchive (GID, Title, IdNo, InDate, OutDateOrd, Stay) VALUES (@GID, @Title, @IdNo, @InDate, @Time, DATEDIFF(day, @InDate, @Time))
SELECT @Error = @@ERROR
IF @Error <> 0
BEGIN
RAISERROR('عمل انتقال انجام شد، ولی ثبت آرشیو با شکست مواجه شد.', 16, 1)
ROLLBACK TRANSACTION MOVE_TO_TEMP_2
RETURN -4
END

COMMIT TRANSACTION MOVE_TO_TEMP_2
RETURN @Error
END


با تشکر.

sasan_vm
سه شنبه 10 خرداد 1390, 16:02 عصر
خوب ظاهرا جواب و پیدا کردم
اگه به جای ExecProc تابع Open را call کنیم یا Active را برابر true قرار دهیم، از ADOStoredProc می خواهیم که نتیجه را بصورت set برگرداند، در نتیجه error handling آن مانند ADODataset و ADOQuery عمل میکند.

یوسف زالی
سه شنبه 10 خرداد 1390, 17:26 عصر
یه جای دیگه هم باگ هست.
اگر AdoStoreProc استفاده کرده باشیم و تو StoredProc از Exec استفاده کرده باشیم اگه اروری تو Exec باشه Client متوجه نمی شه.
یکی از دوستان می گفت با
SET NOCOUNT OFF
میشه جلوشو گرفت . یعنی اولین خط SQL ما باشه.
اما راستش من نفهمیدم چه ربطی داشت .

hossein_h62
چهارشنبه 11 خرداد 1390, 15:58 عصر
اگر AdoStoreProc استفاده کرده باشیم و تو StoredProc از Exec استفاده کرده باشیم اگه اروری تو Exec باشه Client متوجه نمی شه.
سلام
با استفاده از Raiserror پیغام خطا رو برای client ارسال کنید!