اول اینکه وقتی می خواهم جدول را open کنم زمان زیادی را از کاربر می گیرد
علتش اینه که با باز کردن جدول، چون محدودیتی در تعداد رکوردهای درخواستی تعیین نکردید، کل رکوردها در حافظه بارگزاری میشند. این مسپله هم باعث کند شدن برنامه در هنگام باز شدن جدول میشه و هم باعث مصرف بیش از حد حافظه.
برای جلوگیری از مشکل فوق بهتره که از query استفاده کنید. در صورت استفاده از query نیازی به استفاده locate نیست. منظور از query این نیست که در خاصیت SQL از query بنویسید:
SELECT * FROM MyTable
استفاده از این دستور SQL ، فرقی با استفاده از کامپوننت TADOTable نداره!
منظور من از استفاده از query این بود که جستجو رو با یک query انجام بدید، تا فقط رکوردهای مورد نیاز توسط برنامه شما در خواست بشه. به دو مثال زیر توجه کنید:
مثال اول:
ADOQuery1.Close;
ADOQuery1.SQL.Text := 'SELECT * FROM MyTable';
ADOQuery1.Open;
ADOQuery1.Filtered := False;
ADOQuery1.Filter := 'Name = ' + Edit1.Text;
ADOQuery1.Filtered := True;
کل رکوردهای جدول MyTable در حافظه بارگزاری میشند، سپس با استفاده از Filter اون رکوردهایی که با شرط ما مطابقت ندارند، مخفی میشند - این رکوردها اگر چه نمایش داده نشدند، اما در حافظه وجود دارند.
مثال دوم:
ADOQuery1.Close;
ADOQuery1.Parameters.Clear;
ADOQuery1.Parameters.CreateParameter('paramNam e', ftString,
pdInput,100,Edit1.Text);
ADOQuery1.SQL.Text := 'SELECT * FROM MyTable WHERE Name = :ParamName';
ADOQuery1.Prepared := True;
ADOQuery1.Open;
دستور SQL ایی به سرور فرستاد میشه و رکوردهایی که با شرط ما مطابقت دارند درخواست میشه. فقط رکوردهای مطابق با شرط در حافظه بارگزاری میشند. چون ممکنه که از این query زیاد استفاده بشه، از Parameter و prepared استفاده شده. در این حالت برای تغییر شرایط جستجو فقط نیاز به تغییر parameter دارید، نه کل دستور SQL. از طرفی Prepared باعث میشه که دستور شما بعد از یک بار پردازش شدن توسط بانک اطلاعاتی، برای مراجعات بعدی در حافظه باقی بمونه و سرعت query گرفتن هم تا حدودی افزایش پیدا کنه.
اگه با دقت توجه کرده باشید، متوجه میشید که راه حل استفاده شده در مثال دوم، بخصوص در بانک های اطلاعاتی بزرگ، بهتر و سریعتر جواب میده.
موفق باشید