View Full Version : سوال: قطع اتصال از بانک و حذف نشدن اطلاعات گرید
Mask
چهارشنبه 14 دی 1390, 11:07 صبح
با سلام.
چطوری میشه از بانک اطلاعاتی دیسکانکت شد. اما اطلاعات درون گرید. نمایش داده شوند.
ممنون.
az-navaei
پنج شنبه 15 دی 1390, 16:33 عصر
مي تونيد از آبجكت ClientDataSet استفاده نماييد
Mask
پنج شنبه 15 دی 1390, 18:10 عصر
لطفا یه نمونه قرار میدی؟
Mahmood_M
پنج شنبه 15 دی 1390, 19:13 عصر
همچین چیزی امکان پذیر نیست !
ClientDataSet می تونه به عنوان یک بانک اطلاعاتی موقت استفاده بشه و به فایل خاصی وابسته نباشه ، ولی این طور نیست که ابتدا اطلاعات درون فایل ذخیره بشن و بعد ارتباط با بانک ( فایل ) قطع بشه و باز هم اطلاعات قابل نمایش و ویرایش و ... باشن
تا جایی که من می دونم همچین چیزی امکان نداره ، مگر اینکه بخواید از روشهای غیر منطقی استفاده کنید ! مثلا اطلاعات رو در یک جدول موقت بریزید ، بعد ارتباط رو با فایل بانک اطلاعاتی قطع کنید و بعد جدول موقت رو نمایش بدید یا ویرایش کنید و یا راه های مثل این
بهتره بگید که هدف اصلیتون چیه ، شاید راه بهتری وجود داشته باشه ...
Felony
پنج شنبه 15 دی 1390, 23:51 عصر
اكر هدفتون فقط نمايش اطلاعات هست در مورد in memory dataset ها در دلفي تحقيق كنيد .
یوسف زالی
جمعه 16 دی 1390, 18:27 عصر
سلام.
اگر مساله خیلی براتون فنی نیست ADO رو در XML ذخیره کنید و داشته باشید.
vcldeveloper
جمعه 16 دی 1390, 19:06 عصر
چطوری میشه از بانک اطلاعاتی دیسکانکت شد. اما اطلاعات درون گرید. نمایش داده شوند.
به این حالت میگن Briefcase، هم با ClientDataset می تونید همچین چیزی داشته باشید، هم با ADO. در ADO، خصوصیت LockType را بر روی ltBatchOptimistic تنظیم کنید، و بعد از دریافت اطلاعات از بانک اطلاعاتی، ابتدا خصوصیت Connection دیتاست مربوطه را Nil کنید، سپس Connection را ببندید:
AdoQuery1.Connection := nil;
AdoConnection1.Close;
هر وقت که خواستید تغییرات را از برنامه به بانک منتقل کنید، Connection را باز کنید، و شی مربوطه را به خصوصیت Connection دیتاست مربوطه اختصاص بدید؛ سپس متد UpdateBatch را فراخوانی کنید:
AdoConnection1.Open;
AdoQuery1.Connection := AdoConnection1;
AdoQuery1.UpdateBatch();
tiphooo
جمعه 14 بهمن 1390, 21:56 عصر
سوال اینکه در این حالت که شما گفتید آیا فیلدهای محاسباتی CalcField ها هم هنوز قابل محاسبه هستند یا خیر چون ارتباط با بانک قطع شده و CalcField ها با هر تغییری مجددا محاسبه می شوند و نیازمند اتصال به بانک هستند.(فرض را بر این بگذارید که نتیجه CalcField بخواهد بر اساس مقدار رکورد جاری جدول جاری و مقادیر چند جدول دیگر باشد.) و اینکه اگر ما مثلا 100 رکورد را وارد کرده و به هر دلیلی از برنامه خارج شویم (برق قطع شود) با توجه به اینکه در زمان ذخیره کلی اتصال مجدد با بانک برقرار می شود تکلیف آن 100 رکورد چه خواهد شد آیا باید از اول وارد شود اگر راهی برای عدم تکرار این کار وجود دارد لطفا راهنمایی بفرمائید.
vcldeveloper
پنج شنبه 27 بهمن 1390, 12:03 عصر
سوال اینکه در این حالت که شما گفتید آیا فیلدهای محاسباتی CalcField ها هم هنوز قابل محاسبه هستند یا خیر
مقدارشون بر اساس مقادیر فیلدهای دریافتی از سرور محاسبه میشه.
اگر ما مثلا 100 رکورد را وارد کرده و به هر دلیلی از برنامه خارج شویم (برق قطع شود) با توجه به اینکه در زمان ذخیره کلی اتصال مجدد با بانک برقرار می شود تکلیف آن 100 رکورد چه خواهد شد
از بین میره.
اگر راهی برای عدم تکرار این کار وجود دارد لطفا راهنمایی بفرمائید.
1- در فواصل زمانی کوتاهتری به سرور متصل بشید و داده ها را ارسال کنید، تا در صورت بروز مشکل، داده کمتری را از دست بدید.
2- تغییرات را قبل از ارسال به سرور، مرتبا به صورت لوکال در یک فایل ذخیره کنید، تا در صورت عدم امکان اتصال به سرور یا بروز هر مشکل ناگهانی دیگه، بتونید به آنها برای ارسال مجدد دسترسی داشته باشید.
khoshblagh
سه شنبه 20 اسفند 1392, 00:31 صبح
به این حالت میگن Briefcase، هم با ClientDataset می تونید همچین چیزی داشته باشید، هم با ADO. در ADO، خصوصیت LockType را بر روی ltBatchOptimistic تنظیم کنید، و بعد از دریافت اطلاعات از بانک اطلاعاتی، ابتدا خصوصیت Connection دیتاست مربوطه را Nil کنید، سپس Connection را ببندید:
AdoQuery1.Connection := nil;
AdoConnection1.Close;
هر وقت که خواستید تغییرات را از برنامه به بانک منتقل کنید، Connection را باز کنید، و شی مربوطه را به خصوصیت Connection دیتاست مربوطه اختصاص بدید؛ سپس متد UpdateBatch را فراخوانی کنید:
AdoConnection1.Open;
AdoQuery1.Connection := AdoConnection1;
AdoQuery1.UpdateBatch();
با سلام خدمت دوستان
برای تغییرات خاصی بروی بخشی از یک جدول میبایست اول داده های مورد نظر را با یک کوئری بدست آورده و سپس آنرا به یک جدول موقت منتقل و تغییرات خاصی را بر آن اعمال و سپس همان رکوردها با تغییرات اعمال شده بروی بعضی از فیلدها به جدول اولیه بازگردانده شود. من برای این منظور از ترکیبی از دو روش گفته شده توسط جناب آقای کشاورز به این صورت استفاده نمودم. اول با یک کوئری رکوردهای مورد نظر را از جدول اصلی استخراج نمودم. خصوصیت LockType را بر روی ltBatchOptimistic تنظیم و نهایتا رکوردها را به ClientDataset منتقل و سپس در دیبی گرید نمایش میدهم. و البته کانکشن کوئری را nil مینمایم. تا اینجای کار مشکلی نیست . بعد از اعمال تغییرات میخواهم کلیه رکوردها با تغییرات داده شده در جدول اصلی بروزآوری گردد. برای این کار از دستورات مرحله دوم گفته شده استفاده مینمایم. ولی تغییرات در جدول اعمال نمیشود! علت چیست؟ متشکرم
پیام خطا:
Record not found or changed by another user
az-navaei
چهارشنبه 21 اسفند 1392, 10:37 صبح
با سلام
داخل یکی از برنامه هام این را پیدا کردم تست کنید ببنید کاری که شما می خواهید را انجام میده یا نه؟
موقع ثبت اطلاعات در سرور با ClientDataSet
if ClientDataSet.ChangeCount>0 then
ClientDataSet.ApplyUpdates(-1);
khoshblagh
جمعه 23 اسفند 1392, 23:29 عصر
با سلام
داخل یکی از برنامه هام این را پیدا کردم تست کنید ببنید کاری که شما می خواهید را انجام میده یا نه؟
موقع ثبت اطلاعات در سرور با ClientDataSet
if ClientDataSet.ChangeCount>0 then
ClientDataSet.ApplyUpdates(-1);
متاسفانه خیر.
pezhvakco
شنبه 24 اسفند 1392, 20:14 عصر
سلام
با سپاس از شما برنامه نویس گرام، 2 تا پرسش داشتم؟
در ایتدا روش کار من :
AdoConnection : برای ارتباط با پایگاه داده
ADODataSet : ارتباط دارد با AdoConnection اصلی برای ارتباط و خواندن داده های جدول مورد نظر بکار می رود (با یک کوئری )
DataSetProvider : برای ارتباط به ADODataSet
ClientDataSet : تنظیم شده برای ارتباط با DataSetProvider
DataSource : برای ازتباط بین جدول و ClientDataSet
DBGridEh : با دادن ارتباط به DataSource برای نمایش، ویرایش و ساخت ردیف جدید در جدول موقت
با این روش ردیف های جدیدی در جدول موقت ساخته و با کد دستور :
ClientDataSet.ApplyUpdates(-1);
ردیف های جدید را در جدول اصلی پایگاه داده اضافه می شود .
و پرسش های من :
1 - ایا می شود در DBGridEh یا ClientDataSet روشی پیاده کرد که چند ستون اضافه بر ستون های اصلی (ستون های موجود در جدول پایگاه داده) داشته باشیم با این امکان که بشه مقدار اون های رو ویرایش کرد (این ستون های فقط برای نمایش یکسری جزئیات هر ردیف است و هیچ کارایی دیگری ندارد) ؟
2 - اگر در زمان نوشن کد دستور کوئری خواندن داده های از جدول اصلی پایگاه داده (کوئری مربوط به ADODataSet) چند ستون اضافه نوشته شود و ستون های مورد نیاز از قبل در ClientDataSet ایجاد شده باشد (ClientDataSet=>Fields Editor )، می شود تا حدودی پرسش بالا را انجام داد، این روش برای زمان ردیف جدید درست جواب می دهد ولی برای هنگام ویرایش ردیف های ذخیره شده خطا می دهد :
Trying to modify read-only field
با توجه به این که فیلد های ClientDataSet و ستون های DBGridEh فقط خواندنی (Readonly) نیست .
روش درست برای انجام این کار تا درست کار کند ؟
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.