PDA

View Full Version : آپدیت کردن با ClientDataset



Babak-Aghili
دوشنبه 25 مهر 1384, 23:01 عصر
سلام...

به کمک یک Privider ... اطلاعات را از AdoTable خواندم و در ClientDataSet قرار دادم و سپس AdoTable را هم Close کردم ...

خب بعد با داده های آفلاین in-memory کلاینت دیتاست کار کردم ...

حالا چطور در انتهای کار ، مجددا میتوانم به AdoTable مربوطه کانکت کنم و تغییرات موجود در کلاینت را ثبت کنم ؟

:ناراحت:

متشکر.

vcldeveloper
سه شنبه 26 مهر 1384, 03:12 صبح
چرا AdoTable را Close می کنید؟ اگه قصد شما فقط ذخیره اطلاعات در حافظه، ویرایش آنها و ثبت تغییرات در سرور هست، می تونید از یه AdoTable تنها هم استفاده کنید؛ فقط کافیه که خاصیت LockType را روی ltBatchOptimistic تنظیم کنید و بعد از باز کردن Dataset، خصوصیت Connection آن را nil کنید. در این صورت می تونید روی داده ها تغییرات انجام بدید، در زمان ثبت تغییرات، دوباره به خاصیت Connection مقدار معتبری بدید و به بانک متصل بشید. بعد از اتصال، با استفاده از متد BatchUpdate می تونید تغییرات را ذخیره کنید.
در صورتی که از ترکیب Provider و ClientDataSet استفاده می کنید، تغییرات فقط زمانی در بانک ذخیره می شوند که متد ApplyUpdates فراخوانی شود، در نتیجه لازم نیست کار خاصی انجام بدید، فقط بعد از انجام تمام تغییرات مورد نظر، یک بار ApplyUpdates را فراخوانی کنید.

Babak-Aghili
چهارشنبه 27 مهر 1384, 00:54 صبح
مثل همیشه .... کامل ، دقیق ، حرفه ای ( و البته دور از تکبر ... )

ممنون .

Babak-Aghili
پنج شنبه 28 مهر 1384, 00:38 صبح
مشکل قبلی به کمک شما حل شد ...

حالا این بار ، بجای Table از Query استفاده کردم با دستوری مثل Select * From ATable ... این بار هم صحیح جواب داد ...
بعد خواستم از دستوری مثل SELECT x,y FROM ATable, BTable WHERE ATable.id = BTable.id استفاده کنم و آنرا به روش فوق آپدیت کنم .. این بار خطا گرفت ...

میخواستم بدونم که آیا روشی که در بالا به آن رسیدیم ، فقط برای مواقعی ست که با یک جدول سروکار داریم ؟ پس برای Joinها ، چطور آپدیت کنیم ؟؟

vcldeveloper
پنج شنبه 28 مهر 1384, 04:51 صبح
پس برای Joinها ، چطور آپدیت کنیم ؟؟
اگه از BDE استفاده می کنید، می تونید از کامپوننت UpdateSQL (در صفحه BDE ) استفاده کنید. ADO در حالت عادی هنگام Update مشکلی در این زمینه نداره، ولی وقتی از ClientDataSet استفاده می کنید، کار یخورده پیچیده میشه. در صورتی که خصوصیت ResolveToDataSet از Provider را فعال کنید، Update توسط AdoDataSet صورت میگیره و مشلات کمتر میشه. می تونید در رویداد OnUpdateData شی DataSetProvider به داده هایی که از ClientDataSet برای Update رسیده دسترسی داشته باشید و خودتون از طریق کدنویسی محتویات AdoDataSet را با استفاده از داده های رسیده از ClientDataSet به روز کنید. همچنین می تونید در رویداد OnGetTableName نام جدولی که باید Update بشه را مشخص کنید.
در صورتی که از UpdateMode = upWhereKeyOnly استفاده می کنید، باید فیلدهای کلید را از طریق خصوصیت ProviderFlags هر فیلد مشخص کنید.
فکر کنم در این زمینه بتونید مقالاتی هم در اینترنت پیدا کنید.

Babak-Aghili
جمعه 29 مهر 1384, 01:08 صبح
برادر کشاورز ....

با تشکر ... اگر برایتان مقدور هست و لینکی دم دست دارید ، در همین رابطه ، زحمت لینک را بکشین ...

صد در دنیا ... یک در آخرت ... ( یا بالعکس .. )

vcldeveloper
جمعه 29 مهر 1384, 02:57 صبح
Resolving Joins with MIDAS 3 - by John Kaster در Borland Developer Networks

در کتاب های Delphi Developers Guides و Mastering Delphi هم در بخش مربوط به DataSnap (در ورژن های قدیمی تر MIDAS) درباره این مسئله توضیح داده شده.