در دلفی پایه و اساس دسترسی به داده ها DataSet است و یک شئی DataSet اغلب یک جدول، یک کوئری (Query) و یا یک Stored Procedure است. TDataSet TDataSet جد تمام اشیا DataSet ای می باشد (مثل Table، کوئری، Stored Procedure) که شما در برنامه تان ایجاد میکنید. TDataSet یک مجموعه داده مجازی است بدین معنی که بسیاری از متدها و خواص آن مجازی (Virtual) و یا Abstract هستند. در مورد متدهای Vritual و Abstract : هم توی پرانتز داشته باشید که : متدهای Virtual : متدی است که میتوان پیاده سازی آن را در اشیاء فرزند Override کرد. متدهای Abstract : متدی است بدون پیاده سازی واقعی. که مانمیتونیم مستقیما از اون توی برنامه هامون استفاده کنیم. TDataSet هم شامل متدهای Abstract است برای همین مستقیما نمیشه ازش در برنامه ها استفاده کرد و بجاش از فرزندهای اون مثل TQuery، TClientDataSet, TStoredProc و TTable استفاده میکنیم که همتون تا حالا باهاشون کار کردین.
پاسخ : مفاهیم پایه ای : DataSet، جستجو و فیلتر کردن باز و بسته کردن DataSet ها جهت خواندن یا نوشتن داده ها در یک جدول یا از طریق یک کوئری، بایستی ابتدا DataSet را باز کنیم. به 2 طریق میتوان یک DataSet را باز کرد : 1- خاصیت Active آنرا True کنیم. یا در زمان طراحی از طریق Object Inspector یا در زمان اجرا : [TABLE] [TR] [TD="class: gutter"]1 [/TD] [TD="class: code"]MyTable.Active := True; [/TD] [/TR] [/TABLE] 2- استفاده از متد Open: [TABLE] [TR] [TD="class: gutter"]1 [/TD] [TD="class: code"]MyTable.Open; [/TD] [/TR] [/TABLE] به همین ترتیب به 2 طریق هم میتوان یک DataSet را بست یا با خاصیت Active و متد Active و یا استفاده از متد Close : [TABLE] [TR] [TD="class: gutter"]1 [/TD] [TD="class: code"]MyTable.Close; [/TD] [/TR] [/TABLE] ممکنه یک DataSet را در زمان تغییر خواصش و یا بدلیلی خاص در برنامه ببندیم و در زمان لازم اون رو باز کنیم. حالتهای DataSet: حالت و وضعیت یک DataSet مشخص میکند که چه عملیاتی میتواند بر روی داده ها صورت گیرد. مثلا وقتی DataSet ما بسته است حالت آن dsInActive است یعنی هیچ عملیاتی بر روی داده ها امکان پذیر نیست. پس حالت (State) یک DataSet ممکن است : dsInactive, dsBrowse, dsEdit, dsInsert, sdSetKey, dsCalcFields, dsFilter و ... باشد که با خیلی از اونا تا حالا کار کردیم : در حالت پیش فرض، هنگام باز کردن DataSet در حالت dsBrowse قرار دارد. جهت تغییر آن باید از متدهای منطبق بر آن حالت استفاده کنیم. مثلا برای رفتن به حالت dsInsert از متد Insert استفاده میکنیم : [TABLE] [TR] [TD="class: gutter"]1 [/TD] [TD="class: code"]MyTable.Insert; [/TD] [/TR] [/TABLE] بدین ترتیب یک رکورد جدید در جدول MyTable ایجاد می شود. جهت ثبت داده ها از متد Post استفاده می کنیم. بدین ترتیب در صورت موفقیت Post، جدول مجددا به حالت dsBrowse می رود. ***هر زمان که حالت DataSet تغییر کند ، رویداد OnStateChange مربوط به DataSource ما فراخوانی می شود. غیرفعال کردن یک DataSet : همانطور که گفتم در زمانی که یک DataSet غیرفعال است که بسته باشد که در این حالت دسترسی به رکوردها نداریم. در زمان طراحی یک DataSet بصورت پیش فرض بسته است تا خاصیت Active آنرا True کنیم و در زمان اجرا هم یک DataSet بصورت Default بسته است مگر آنکه از متد Open یا خاصیت Active استفاده کنیم. رویدادهای BeforeClose و AfterClose جهت کنترل بیشتر در پاسخ به متد Close قابل کد نویسی اند. برای مثال اگر یک DataSet در حالت dsInsert و یا dsEdit باشد و متد Close فراخوانی شود، شما ممکن است بخواهید پیغامی به کاربر بدهید که ابتدا تغییرات انجام شده را به ثبت رسانده یا انصراف دهد و سپس Close فراخوانده شود. در این حالت از BeforeClose استفاده میکنیم : [TABLE] [TR] [TD="class: gutter"]1 2 3 4 5 6 7 8 9 10 11 [/TD] [TD="class: code"]Procedure MyTable.VerifyBeforeClose(DataSet : TDataSet); Begin If (MyTable.State = dsEdit) or (MyTable.State = dsInsert) Then Begin If MessageDlg('Post Changes Before Closing?', mtConfirmation,mbYesNo,0) = mrYes Then MyTable.Post Else MyTable.Cancel; End; End; [/TD] [/TR] [/TABLE]