ورود

View Full Version : حذف داده ها از پايگاه داده



Zahed2008
شنبه 21 شهریور 1388, 14:04 عصر
سلام، من با دستور زير داده ها رو از جدول(DBgrid) با ADOTable حذف مي كنم. ولي وقتي مي رم تو پايگاه داده(فايل Access مورد نظر) مي بينم حذف نشده. البته با اجراي دوباره برنامه داده هاي حذف شده نمايش داده نمي شن. فكر مي كنيد اشكال كار كجاست؟
اينم كدم:


for j := 0 to ADOTable1.RecordCount-1 do begin
ADOTable1.Delete;
ADOTable1.Last;
end;
ADOTable1.Refresh;

Tasnim
شنبه 21 شهریور 1388, 17:05 عصر
دوست عزیز اگه میخای محتوای بانک رو خالی کنی چرا از دستورات SQL استفاده نمی کنی؟

Zahed2008
شنبه 21 شهریور 1388, 18:37 عصر
سلام، خوب من دستورات SQL رو بلد نيستم و در حال حاضر دارم با ADOTable كار مي كنم. نمي دونم مي شه ادغام اين دو تا رو استفاده كرد يا نه؟
اگه مي شه ممنون مي شم كدش رو بذاريد.

Tasnim
دوشنبه 23 شهریور 1388, 13:47 عصر
adoquery:
delete * from tablename where field=1

matinebi
دوشنبه 23 شهریور 1388, 14:25 عصر
سلام، من با دستور زير داده ها رو از جدول(DBgrid) با ADOTable حذف مي كنم. ولي وقتي مي رم تو پايگاه داده(فايل Access مورد نظر) مي بينم حذف نشده. البته با اجراي دوباره برنامه داده هاي حذف شده نمايش داده نمي شن. فكر مي كنيد اشكال كار كجاست؟
اينم كدم:


for j := 0 to ADOTable1.RecordCount-1 do begin
ADOTable1.Delete;
ADOTable1.Last;
end;
ADOTable1.Refresh;


باید به جای last از next استفاده کنید

for j := 0 to ADOTable1.RecordCount-1 do begin
ADOTable1.Delete;
ADOTable1.next;
end;
ADOTable1.Refresh;

Zahed2008
دوشنبه 23 شهریور 1388, 14:48 عصر
سلام، با Next هم جواب نمي ده ؟!

جواد ملاولی
دوشنبه 23 شهریور 1388, 16:26 عصر
سلام، با Next هم جواب نمي ده ؟!
من این کد رو تست کردم. مشکلی نداره.

Mahmood_M
دوشنبه 23 شهریور 1388, 17:37 عصر
بعد از Delete نباید از Next استفاده بشه ، چون جدول بعد از حذف رکورد ، رکورد بعد از اون رو Select می کنه ...
باید به این صورت بنویسید :


for I := 1 to ADOTable.RecordCount do
ADOTable.Delete;

و نکته ی دیگه این که اگه از While استفاده کنید بهتره :

while not ADOTable.EOF do
ADOTable.Delete;

توجه کنید که قبل از حلقه ی مورد نظر ، بانک رو به رکورد اول ببرید :

ADOTable.First;
for ...
OR
while ...

علاوه بر موارد بالا از دستور DelereRecords هم می تونید استفاده کنید ، این دستور رو در Help دلفی جستجو کنید ...

موفق باشید ...

matinebi
دوشنبه 23 شهریور 1388, 20:17 عصر
یک ADOCommand قرار بده


// حذف تمامی محتویات یک جدول
with DataModule5.ADOCommand1 do
begin
CommandText:='delete from tbl1';
Execute;
end;

Zahed2008
سه شنبه 24 شهریور 1388, 09:58 صبح
سلام، ممنون از جوابتون. اشكال كار من اين بود كه جدول در حالت فيلتر رو delete مي كردم.
روش دوستمون matinebi با ADOCommand در حالت فيلتر هم جواب مي ده ولي اينبار اشكال اينجاست كه بعد از انجام حذف، جدول رو با داده ها نمايش مي ده.(حتما بايد برنامه يه بار بسته شه، تا جدول خالي رو نشون بده!)
چون تعداد ركوردهام خيلي زياده، وقتي هم فيلتر رو بر مي دارم خيلي زمان مي بره كه آپديت شه.
وقتي هم از دستور
ADOTable.DeleteRecords( arAll ); استفاده مي كنم خطاي زير رو مي ده:

Project Project1.exe raised class EOleExeption with message 'Operation is not allowed in this context.
http://barnamenevis.org/forum/F:%5CimageError1.JPG

bootshow
جمعه 27 شهریور 1388, 17:42 عصر
زمانی که از کنترلهای مربوط به sql استفاده میکنید تغییرات بانک اطلاعاتی با dbgrid به روز نمیشه و باید از دستوراتی مثل dbgrid.datasate.refresh استفاده کنید.
اگر از فیلتر پیشرفته استفاده کنید همینجوریه ، خیلی کند کار میکنه ولی اگر مثل کد پایین استفاده کنید(با توجه به استفاده از کامپوننت dbisam )از دستورات Sql سریعتر فیلتر و جستجو انجام میگیره)



tbldbisam.Filter:='name like'+QuotedStr(edtname.text);

فکر کنم برای ADOTable.DeleteRecords باید ADOTable.close استفاده کنید

MOJTABAATEFEH
جمعه 27 شهریور 1388, 21:13 عصر
استفاده از دستورات SQL براي كار با پايگاه خيلي سريعتر و بهتره


حذف كليه ركوردهاي جدول


delete from table1


حذف كليه ركوردهايي كه در شرط صدق مي كنند

delete from table1 where field1=1


البته اگر تعداد ركوردهاي شما زياد است ميتوانيد از دستور زير استفاده كنيد

TRUNCATE TABLE Table1


موفق باشيد

Zahed2008
شنبه 28 شهریور 1388, 12:19 عصر
فکر کنم برای ADOTable.DeleteRecords باید ADOTable.close استفاده کنید
با تشكر از جوابتون، اين دستور با يه همچين خطايي مواجه مي شه:
"Cannot perform this operation on a closed dataset"
Refresh هم جواب نمي ده.
در مورد دستورات SQL هم وقتي مي نويسم، خطا مي گيره يعني نمي شناسه.(البته شايد من بلد نيستم درست بنوسيم چون زياد با SQL آشنا نيستم.)
در ضمن نتونستم کامپوننت dbisam رو پيدا كنم. تو كدوم tab هستش؟

bootshow
شنبه 28 شهریور 1388, 14:02 عصر
DBGrid1.DataSource.DataSet.Refresh;

از دستورات زیر هم میتونی استفاده کنی.اول ADOCommand به فرم اضافه کنه.نمیدونم درست کار کنه یا نه

ADOCommand1.CommandText:='delete from table1 where field1=1';
ADOTable1.Recordset :=ADOCommand1.Execute;