ورود

View Full Version : سوال: رکوردهای بانک بدون دلیل مفقود/حذف می‌شوند!



p_ooya
سه شنبه 23 خرداد 1391, 00:17 صبح
سلام به همه.

من یه مشکل خیلی جدی دارم که زندگیم رو غم انگیز کرده (!) و امیدوارم دوستان با تجربه‌تر بتونند به من کنند.
من یه برنامه با دلفی ۷ نوشتم که از SQL Server 2000 استفاده می‌کنه. در این بانک یک جدول داریم برای ثبت تماس‌ها. مشکل اینجاست که بعضی از تماس‌ها بدون دلیل مفقود می‌شن! یعنی کاربر دکمه ثبت تماس رو می‌زنه و بدون اینکه خطا یا اروری پیش بیاد. بعداً موقع تهیه گزارش مشخص میشه که رکوردی موجود نیست!

کد مربوط در دلفی (برای اطمینان خیلی زیاد، من کد رو عیناً اینجا کپی می‌کنم)
time:=DateTimeToUnix(now);
DataModule1.ADOQueryMultiPurpose.Close;
DataModule1.ADOQueryMultiPurpose.SQL.Clear;
DataModule1.ADOQueryMultiPurpose.SQL.Text:='INSERT INTO Calls values ('+edit17.Text+','''+SolarDatePicker4.Text+' '+TimeToStr(DateTimePicker2.Time)+''','''+Memo5.Te xt+''','''+ComboBox5.Text+''','''+ComboBox6.Text+' '','+IntToStr(time)+')';
DataModule1.ADOQueryMultiPurpose.ExecSQL;

بعد از اینکه این مشکل شروع شد، برای اطمینان از اینکه ثبت انجام میشه یا نه، بعد از هر ثبت کنترل می‌کنم که آیا رکوردی وارد بانک شده یا خیر:

DataModule1.ADOQuerySuccessTest.Close;
DataModule1.ADOQuerySuccessTest.SQL.Clear;
DataModule1.ADOQuerySuccessTest.SQL.Text:='select * from calls where id='+Edit17.Text+' and unix_date='+IntToStr(time);
DataModule1.ADOQuerySuccessTest.Open;
if (DataModule1.ADOQuerySuccessTest.RecordCount=1) then
begin
پیام موفقیت تماس
UpdateLog('insert call',StrToInt(Edit17.Text),MidStr(memo5.Text,0,50 ));
SolarDatePicker4.ShowDefaultDate:=false;
SolarDatePicker4.Clear;
SolarDatePicker4.ShowDefaultDate:=true;
DateTimePicker2.Time:=Now;
Memo5.Clear;
ComboBox5.SetFocus;
end
else
begin
نمایش خطا
end;

من یه جدول کوچیک درست کردم که به عنوان log ثبت تماس عمل ‌میکنه. جالبترین قسمت ماجرا اینجاست که هنگام ثبت پیام موفقت تماس مشاهده میشه (یعنی رکورد در بانک هست!)، در log هم ثبت میشه. اما بعد از مدتی از جدول تماس‌ها مفقود/گم/پاک میشه.

به نظر شما دلیلش چیه؟ راهکارش چیه؟
پیشاپیش ممنون.

فتح الله زاده
سه شنبه 23 خرداد 1391, 09:40 صبح
دوست عزيز براي اطمينان از transection استفاده كن
مثال :


DataModule1.ADOConnection1.BeginTrans;
Try
DataModule1.ADOQueryMultiPurpose.SQL.Text:=
'INSERT INTO Calls values ('+QuotedStr(edit17.Text)+','+QuotedStr(SolarDateP icker4.Text)+','
+QuotedStr(TimeToStr(DateTimePicker2.Time))
+','+QuotedStr(Memo5.Text)+','
+QuotedStr(ComboBox5.Text)
+','+QuotedStr(ComboBox6.Text)
+','+IntToStr(time)+')';
DataModule1.ADOQueryMultiPurpose.ExecSQL;

DataModule1.ADOConnection1.CommitTrans;
Except
DataModule1.ADOConnection1.RollbackTrans;
showmessage('ÎØÇ');
end;

p_ooya
سه شنبه 23 خرداد 1391, 12:35 عصر
دوست عزيز براي اطمينان از transection استفاده كن
مثال :


DataModule1.ADOConnection1.BeginTrans;
Try
DataModule1.ADOQueryMultiPurpose.SQL.Text:=
'INSERT INTO Calls values ('+QuotedStr(edit17.Text)+','+QuotedStr(SolarDateP icker4.Text)+','
+QuotedStr(TimeToStr(DateTimePicker2.Time))
+','+QuotedStr(Memo5.Text)+','
+QuotedStr(ComboBox5.Text)
+','+QuotedStr(ComboBox6.Text)
+','+IntToStr(time)+')';
DataModule1.ADOQueryMultiPurpose.ExecSQL;

DataModule1.ADOConnection1.CommitTrans;
Except
DataModule1.ADOConnection1.RollbackTrans;
showmessage('ÎØÇ');
end;

ممنون از اینکه وقت گذاشتید و ممنون از پاسختون. صحبت شما میتن، اما سوالی که هست اینه که اگر رکورد ثبت نمیشه چرا در کوئری بعدی وجود داره و اگر در کوئری دوم هست چرا بعدا حذف میشه؟ آیا این یک امر عادی در مورد اس کیو ال سرور هست؟

فتح الله زاده
چهارشنبه 24 خرداد 1391, 08:24 صبح
دوست عزيز منظورت از ( كوئري بعدي ) و (كوئري دوم ) چيه ؟
اگه CommitTrans انجام بشه اطلاعات داخل بانك نوشته شده و تا خودت حذف نكني پاك نميشه .