PDA

View Full Version : update چند رکورد به وسیله query



elahe1364
جمعه 16 فروردین 1387, 10:57 صبح
سلام دوستان
من یه کوئری update توی access ایجاد کردم.
حالا من می خوام مثلا 10 بار این کوئری رو توی دلفی اجرا کنم.
با این دستورات فقط یه بار کوئری اجرا می شه و فقط رکورد اولی update
می شه
کسی می تونه بگه ایراد کار کجاست؟ یا یه روش دیگه بگید.ممنون.


کوئری اکسسم دستوراتش اینه
UPDATE clothes SET [count] = [@Count]
WHERE clothesid=[@Id];

و دستورای دلفی هم اینه


with DmTables.ADOStoredProc1 do
begin
for i:=1 to 10 do
begin
Parameters.ParamByName('Count').Value:=1;
Parameters.ParamByName('Id').Value:=i ;
ExecProc;
end;
end;

SYNDROME
جمعه 16 فروردین 1387, 12:42 عصر
شما در شرط نوشته اید


WHERE clothesid=[@Id]

خوب فقط رکودهایی را Update می کند که clothesid در loop اول مساوی 1 در loop دوم مساوی 2 و . . .
اگر می خواهید همه رکوردها Update شود شرط بالا را بردارید و یا بنویسید


WHERE clothesid in (1,2,3,4,5,6,7,8,9,10)

موفق باشید

elahe1364
جمعه 16 فروردین 1387, 20:24 عصر
خوب می دونم منم می خوام یه رکوردهای خاصی update بشند نه تمام رکوردها.
این یه مثال هست که نوشتم برنامه اصلیم این نیست و رکوردهای خاصی باید update بشه ولی فقط رکورد با id=1 رو آپدیت می کنه.

SYNDROME
جمعه 16 فروردین 1387, 20:38 عصر
این یه مثال هست که نوشتم برنامه اصلیم این نیست و رکوردهای خاصی باید update بشه ولی فقط رکورد با id=1 رو آپدیت می کنه.
خوب دوست عزیز خودتان در شرط نوشته اید که با clothesid=1 باید Update شود.
موفق باشید

elahe1364
جمعه 16 فروردین 1387, 20:52 عصر
نمی دونم من اشتباه می کنم یا شما منظورمو متوجه نمی شید.
من نوشتم clothesId=i نه 1.
i هر دفعه عوض می شه خوب

mohinsoft
جمعه 16 فروردین 1387, 22:40 عصر
با سلام
کد شما رو به فرم زیر تغییر دادم ببینید مشکلتون حل میشه؟


with DmTables.ADOStoredProc1 do
begin
for i:=1 to 10 do
begin
active:=false;
Parameters.ParamByName('Count').Value:=1;
Parameters.ParamByName('Id').Value:=i ;
active:=true;
ExecProc;
end;
end;

SYNDROME
شنبه 17 فروردین 1387, 07:34 صبح
نمی دونم من اشتباه می کنم یا شما منظورمو متوجه نمی شید.
من نوشتم clothesId=i نه 1.
i هر دفعه عوض می شه خوب
آیا فیلد clothesId کلید بانکتان است؟
موفق باشید

vcldeveloper
شنبه 17 فروردین 1387, 12:51 عصر
کد شما رو به فرم زیر تغییر دادم ببینید مشکلتون حل میشه؟
نیازی به Active := True نیست. UPDATE هیچ دیتاستی برنمی گردونه، پس همون ExecProc کفایت میکنه.

elahe1364
شنبه 17 فروردین 1387, 15:45 عصر
کد شما رو به فرم زیر تغییر دادم ببینید مشکلتون حل میشه؟


این خطا رو می ده:current provider dose not support returning multiple recordesets from a single execution


آیا فیلد clothesId کلید بانکتان است؟


بله کلید اصلی هست.

دوستان یه چیز دیگه هم بگم البته شاید زیاد مهم نباشه.

من وقتی کوئری رو به adostoreprocedure وصل کردم توی خصوصیت parameters شی ء ado لیست پارامترهام به طور خودکار وارد نشد و من دستی اسم پارامترهامو وارد کردم.

elahe1364
شنبه 17 فروردین 1387, 18:06 عصر
ببخشید دوستان من این روش هم امتحان کردم.
ولی این خطا رو می ده :
syntax eror in update statement

with ADOQuery1 do
begin
for i:=5 to 10 do
begin
close;
SQL.Clear;
SQL.Text :='UPDATE clothes SET count=:count WHERE clothesid=:ID';
Parameters.ParamByName('count').Value:= 1;
Parameters.ParamByName('id').Value:=i;
ExecSQL;
open;
end;
end

Cave_Man
شنبه 17 فروردین 1387, 19:15 عصر
صرف نظر از اینکه این خطا از کجاست
بجای اینکه این Query رو توی یه While چند بار اجرا کنید بیاید توی یه While شرطها رو که توی Where باید ظاهر بشن توی یه مجموعه قرار بدید و Query رو فقط یه بار اجرا کنید
اونوقت زمان اجرای کد شما خیلی کم تر میشه


UPDATE clothes SET count=تعداد WHERE clothesid IN (مجموعه آی دی ها)

البته در صورتی که اون Count برای همه اون رکوردها یه مقدار باید Set بشه که این طور هم به نظر میاد

elahe1364
یک شنبه 18 فروردین 1387, 15:56 عصر
با تشکر از همه دوستانی که کمک کردند.
مشکلم یه جور دیگه حل شد.
یه ado query گرفتم و همون دستور کوئری توی اکسس رو توی خصوصیت sql شیئ query کپی کردم و بقیه دستورات مثل قبل.جواب داد.