ورود

View Full Version : Try..Execpt و ادامه ی کار پس از قطع و وصل شدن اتصال SQL Server



Mojgan110
چهارشنبه 12 مهر 1385, 09:38 صبح
با سلام و خسته نباشید خدمت اساتید بخش دلفی :

هیچ ایده ای برای حل مشکلم ندارم :عصبانی++:. خیلی ممنون میشم اگر چند دقیقه ای حوصله کنید و این تاپیک را بررسی کنید.

من قسمته انتقال رکوردها از یک دیتابیس به یک دیتابیس دیگر ( هردو البته SQL Server ) را داخل یک حلقه While و بلوک Try Except نوشته ام ... شبیه به این :

شرطه پایان حلقه While را این گذاشته ام که تعداد رکوردهای انتقال داده شده تا کنون ، با تعداد کل رکوردهایی که باید انتقال داده میشده ، برابر باشه ...
حالا داخل این حلقه ، بلاک Try Except را هم نوشته ام که وظیفه انتقال رکوردها را انجام میده


WHILE (StrToInt(EdtTotal.Text) <> StrToInt(EdtTransfered.Text)) do
BEGIN

if ErrorHasOccured then
begin
// my error recovery codes in here
end;

try
DM.ADODataSet1.Active:= True;
DM.ADODataSet1.UpdateBatch();
DM.ServerConnection.CommitTrans;
ErrorIndicator.Brush.Color:= clLime;// no Error Occured
DM.ServerConnection.Connected:= False;
DM.ADODataSet1.Connection:= nil;
EdtTransfered.Text:= IntToStr(PackageNumber*MoveCount);
except
DM.ServerConnection.RollbackTrans;
ErrorIndicator.Brush.Color:= clRed;// Error has occured
raise;
end;

END; // of while
... حالا مثلا وقتی درحاله انتقاله رکودها هست و من سرویس SQL Server را خاموش یا پاز میکنم ، وارد قسمت Raise هم میشه و پرچم خطا را هم ست میکنه، ولی دیگه کاری انجام نمیده ! یعنی مثلا وقتی دوباره سرویسه SQL Server را اجرا میکنم و روشن میکنم ، خب انتظار دارم که وارد اون قسمتی که برای ریکاوری خطا نوشته بودم بشود ، ولی هیچ اتفاقی نمی افتد ...

اگر راه حلی به نظرتان میرسد ، کمک کنید لطفا

متشکرم

mzjahromi
چهارشنبه 12 مهر 1385, 09:53 صبح
اون Raise که توی قسمت Except گذاشتید باعث میشه که کنترل برنامه از While و حتی تابع جاری خارج بشه (فکر میکنم اگر اون رو بر دارید حل میشه)
ضمن اینکه یا کد کامل اینجا گذاشته نشده یا کد ایراد داره
این تراکنشی که Commit یا RollBack میشه کجا Start شده؟

Mojgan110
چهارشنبه 12 مهر 1385, 10:05 صبح
چشم آقای جهرمی.

raise را حذف میکنم و دوباره امتحان میکنم . ممنون.

استارت شدن تراکنش ، دقیقا قبل از try هست ... کد را خلاصه نوشتم آخه :



DM.ServerConnection.Connected:= True;
DM.ADODataSet1.Connection:= DM.ServerConnection;
DM.ServerConnection.BeginTrans;