ورود

View Full Version : خواندن دسته ایی از داخل یک query



Kamyar.Kimiyabeigi
شنبه 12 آذر 1390, 10:55 صبح
با سلام
من یک sp دارم که نتیجه اون چندین رکورد هست مثلا 7000 رکورد حالا میخوام این تعداد رکورد را داخل یک tstringlist بریزم ولی نمیخوام بصورت زیر اینکار رو انجام بدم چون خیلی کنده آیا راهی هست که به صورت دسته ایی این کار رو انجام داد؟

while not FLookupSource.DataSet.Eof do
begin
FItems.Add(FLookupSource.DataSet.FieldByName(GetLo okupDisplay).AsString);
FLookupSource.DataSet.Next;
end;

m-khorsandi
شنبه 12 آذر 1390, 16:27 عصر
این رو اجرا کن :
create table sumerizestr(code int identity, sumstr varchar(100))

insert into sumerizestr(sumstr) values('1')
insert into sumerizestr(sumstr) values('2')
insert into sumerizestr(sumstr) values('3')
insert into sumerizestr(sumstr) values('4')
insert into sumerizestr(sumstr) values('5')
insert into sumerizestr(sumstr) values('6')
insert into sumerizestr(sumstr) values('7')
insert into sumerizestr(sumstr) values('8')


declare @sum varchar(max)

set @sum = ''

select @sum = @sum + CHAR(13) + sumstr
from sumerizestr

print @sum

خروجی آخر رو میتونی به عنوان یه پارامتر به ADO برگردونی و استفاده کنی.

Kamyar.Kimiyabeigi
یک شنبه 13 آذر 1390, 08:10 صبح
من در واقع نمیخوام این مشکل رو از سمت sql حل کنم میخوام از سمت دلفی حل بشه چون مشکل من مربوط به یک کامپوننت هست که به دیتابیس وصل میشه و از نوع combobox هست منتها هر دفعه ممکنه به یک object متصل باشه یک بار به adotable و یک بار به adostorpeorcedure بخاطر همین باید از داخل سورس کامپوننت این کندی رو حل کنم

Kamyar.Kimiyabeigi
چهارشنبه 16 آذر 1390, 15:12 عصر
این کامپوننتهای خود دلفی که به دیتابیس وصل میشن به چه روشی اینقدر سریع دیتاها رو نمایش میدن؟

x_epro_x
چهارشنبه 16 آذر 1390, 23:01 عصر
سلام
با ایندکس گذاشتن میتونن سریع عمل کنن

vcldeveloper
پنج شنبه 17 آذر 1390, 11:33 صبح
من در واقع نمیخوام این مشکل رو از سمت sql حل کنم میخوام از سمت دلفی حل بشه
اون کد از نظر بهینه سازی در دلفی چند مشکل داره، اولا از DisableControls استفاده نکرده تا آپدیت کنترل های متصل به اون دیتاست موجب کندی حرکت بین حرکت ها نشه، ثانیا از BeginUpdate استفاده نکرده، تا با هر بار اضافه شدن یک داده، اون لیست مجددا رسم نشه، ثالثا از FieldByName در یک حلقه استفاده کرده که موجب میشه در هر بار اجرای حلقه، فیلد مربوطه در بین لیست فیلدهای موجود برای دیتاست جستجو بشه. اینها بهینه سازی هایی هست که در سمت دلفی می تونید انجام بدید. در سمت سرور هم باید Execution Plan ایی که برای فراخوانی اون دستورات توسط SQL Server آماده شده، بررسی بشه، و در صورت امکان با تعریف ایندکس های مناسب یا تغییرات در برخی از دستورات، اجرای آن را بهینه کرد.

کد دلفی شما میتونه چیزی شبیه به این باشه:


var
Filed : TField;
begin
FLookupSource.DataSet.DisableControls;
FItems.BeginUpdate;
try
Field := FLookupSource.DataSet.FieldByName(GetLookupDisplay );
FLookupSource.DataSet.First;
while not FLookupSource.DataSet.Eof do
begin
FItems.Add(Field.AsString);
FLookupSource.DataSet.Next;
end;
finally
FItems.EndUpdate;
FLookupSource.DataSet.EnableControls;
end;
end;

Kamyar.Kimiyabeigi
یک شنبه 20 آذر 1390, 10:17 صبح
با تشکر از دوستان عزیز من خودم به این راه حل رسیدم که سرعتش با کدی که آقای کشاورز نوشته یکی هست و برای اطلاع این دو کد تعداد 7000 آیتم را که قبلا 20 ثانیه طول میکشید تا لود کند ولی با این دو کد 5 ثانیه طول می کشد

procedure TForm1.FastLoadingIntoStringList(StringList: TStrings);
Var
V: Variant;
I: Integer;
beging
Adotbl.Open;
StringList.Clear;
if not Adotbl.IsEmpty then
begin
Adotbl.DisableControls;
Adotbl.First;
V := Adotbl.Recordset.GetRows(adGetRowsRest, emptyParam, 'FieldName');
for I := VarArrayLowBound(V, 2) to VarArrayHighBound(V, 2) do
StringList.Add(V[0, I]);
end;
end;