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
با تشکر.
اگر هنگام فراخوانی یک پروسیجر خطایی در آن (منظور کد 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
با تشکر.