PDA

View Full Version : سوال: از کجا بفهمیم ارتباط کلاینت با سرور در شبکه بعد از true شدن اتصال کانکشن قطع شده



SirMehdi
یک شنبه 31 مرداد 1389, 15:25 عصر
سلام دوستان
برنامه ای دارم با دلفی که تحت شبکه استفاده می شه
روش اتصال به بانک اطلاعاتی SQL از طریق Ado Connection می باشد
به علت ضعیف بودن access point ممکنه هر از گاهی ارتباط شبکه قطع بشه در حالی که برنامه در حال استفاده توسط کاربر می باشد و کانکشن باز است حالا وقتی شبکه قطع میشه از اونجایی که کامپوننت Ado connection نمی فهمه که ارتباط قطع شده و ممکنه در خط بعدی برنامه یه Query چیزی اجرا بشه سیستم میره تو هنگ و پیغام خطا و بعضی وقتا فقط باید از task manager پروسه رو End Task کنی تا برنامه بسته شه!!
می خواستم ببینم دوستان آیا چنین تجربه ای داشتن؟ یا راه حلی؟ من Event های کانکشن رو چک کردم هیچکدوم هوشمندی لازمو ندارن که بفهمن ارتباط با سرور قطع شده!!
چصور می شه قبل از هر اجرا دستور دیتا بیسی چک بشه که اگر ارتباط کانکشن با سرور برقراره انجام بشه؟

با تشکر از همه دوستان

mofrad
یک شنبه 31 مرداد 1389, 20:28 عصر
خودتون که جواب خودتون رو دادید دیگه! قبل از این که کوئری اجرا بشه چک کنید که اگر adoconnection1.connected = true اونوقت اجرا بشه. فکر نکنم چیزی غیر از این باشه؟!
به لینک زیر هم یک سری بزنید:
http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_21320511.html

101101000
یک شنبه 31 مرداد 1389, 23:10 عصر
بله ado ابزار کار راه بندازیه اما خیلی خنگه یعنی هیچ انعطافپذیری نداره. منم با مفرد موافقم
قبل از انجام عملیات دیتا بیسیت connection رو چک کن.

sasan_vm
دوشنبه 01 شهریور 1389, 00:22 صبح
بله ado ابزار کار راه بندازیه اما خیلی خنگه یعنی هیچ انعطافپذیری نداره. منم با مفرد موافقم
قبل از انجام عملیات دیتا بیسیت connection رو چک کن.

ADOConnection یک property داره به نام ConnectionTimeout که زمان انتظار برای ارتباط با server
هست بعد از به پایان رسیدن این زمان و عدم ارتباط شما پیغام خطا را می بینید، در واقع سیستم
hang نمی کنه. مقدار default آن 15 ثانیه است با توجه به ترافیک و سرعت شبکه می شه آن
آن را تنظیم کرد.

SirMehdi
دوشنبه 01 شهریور 1389, 01:02 صبح
خودتون که جواب خودتون رو دادید دیگه! قبل از این که کوئری اجرا بشه چک کنید که اگر adoconnection1.connected = true اونوقت اجرا بشه. فکر نکنم چیزی غیر از این باشه؟!
به لینک زیر هم یک سری بزنید:
http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_21320511.html


سلام و ممنون از جواباتون
مشکل همین جاس دیگه!!!!!!!! وقتی ارتباط قطع میشه هنوز adoconnection1.connected = true هستش و نمی تونه تشخیص بده که ارتباط قطع شده مگر اینکه یک خط دستور اجرا بشه و موقع اجرا دستور می فهمه یعنی نمی شه قبل از اجرا دستور با همین شرطی که دوستمون گفته فهمید که ارتباطش قطع شده!!! در واقع آنلاین نیس!!

در مورد time Out هم تست کردم هیچ کمکی نمی کنه حداقل تو کاری که من انجام می دم چون موقع بستن فرم یک خط query باید اجرا بشه و در حالت معمولی فرم بازه کاربر مثلا یک ربع بعد می خواد فرم رو ببنده حالا ممکنه تو این یک ساعت ارتباط قطع و وصل شده باشه، اون موقع ست که گیر می کنه و حتی اون فرم رو هم نمی بنده و باید End task بشه!

اینم از عیب این روشه کا کانکشنت باید باز بمونه!!

vcldeveloper
دوشنبه 01 شهریور 1389, 01:13 صبح
اینم از عیب این روشه کا کانکشنت باید باز بمونه!!
مجبور نیستید که کانکشن رو همش باز نگه دارید. اگر کارتون طوری هست که نیاز به اتصال دائم ندارید، بعد از باز شدن دیتاست ها، خصوصیت Connection اونها رو nil کنید، و بعدش هم AdoConnection رو Disconnect کنید. البته قبل از ارسال داده به سرور، باید مجددا AdoConnection را Connect کنید، و خصوصیت Connection همه دیتاست ها رو هم مجددا مقداردهی کنید.

البته دقت داشته باشید که استفاده از این حالت (که در اصطلاح بهش Disconnected mode یا Briefcase گفته میشه) شرایط خاص خودش رو داره. باز و بسته کردن مداوم Connection سر بار زیادی داره، و شما اگر میخواید از این روش استفاده کنید، باید سعی کنید تا حد امکان تغییرات کوچیک رو جمع کنید و با هم در زمان اتصال به سرور ارسال کنید، نه اینکه برای هر کار کوچیکی دائما به سرور وصل بشید و بعدش Disconnect کنید.

البته یک راه دیگه اینه که قبل از ارسال داده به سرور، هر بار سرور را Ping کنید، و اگر جواب گرفتید، داده را ارسال کنید، در غیر اینصورت، سعی کنید مجددا AdoConnection را Connect کنید. البته با توجه به اینکه این کار قبل از هر انتقال داده به سرور انجام میشه، این هم سربار خاص خودش را داره.

joker
دوشنبه 01 شهریور 1389, 08:19 صبح
میتونی یک برنامه ساده سوکت بنویسی از نوع اتصال دائم TCP
حالا هروقت ؛ حتی 1 ثانیه این ارتباط به هر علتی قطع بشه ؛ پروتکل Tcp تشخیص میده و میتونی از این امکان برای تشخیص قطعی ها استفاده کنی ، و مجددا کانکشن را فعال کنی.

SirMehdi
دوشنبه 01 شهریور 1389, 15:14 عصر
مجبور نیستید که کانکشن رو همش باز نگه دارید. اگر کارتون طوری هست که نیاز به اتصال دائم ندارید،

باز و بسته کردن مداوم Connection سر بار زیادی داره،

البته یک راه دیگه اینه که قبل از ارسال داده به سرور، هر بار سرور را Ping کنید، و اگر جواب گرفتید، داده را ارسال کنید، در غیر اینصورت، سعی کنید مجددا AdoConnection را Connect کنید. البته با توجه به اینکه این کار قبل از هر انتقال داده به سرور انجام میشه، این هم سربار خاص خودش را داره.

با تشکر از همه دوستان که راهنمایی کردن خصوصا تشکر ویژه از آقای کشاورز که همیشه لطف می کنن

تو این کار مجبورم کانکشن رو باز نگه دارم دائم و همین باعث شده که به مشکل بخورم
کاش Ado connection می فهمید ارتباطش قطع شده و true نمی موند اون وقت با یه چکینگ کار حل می شد
البته راه حلی هم که دوستمون گفتن (Joker) گفتن روش خوبی به نظر میاد ولی متاسفانه من تا حالا کار نکردم
می شه راهنماییم کنید چجوری شروع کنم؟ یه سمپلی چیزی

masoode
یک شنبه 22 مهر 1397, 14:43 عصر
با تشکر از همه دوستان که راهنمایی کردن خصوصا تشکر ویژه از آقای کشاورز که همیشه لطف می کنن

تو این کار مجبورم کانکشن رو باز نگه دارم دائم و همین باعث شده که به مشکل بخورم
کاش Ado connection می فهمید ارتباطش قطع شده و true نمی موند اون وقت با یه چکینگ کار حل می شد
البته راه حلی هم که دوستمون گفتن (Joker) گفتن روش خوبی به نظر میاد ولی متاسفانه من تا حالا کار نکردم
می شه راهنماییم کنید چجوری شروع کنم؟ یه سمپلی چیزی

سلام دوستان
می دونم این تاپیک خیلی قدیمیه، اما اینجا ظاهرا به نتیجه ای نرسیده. من هم این مشکل را دارم.
قبل از اجرای هر کوئری اول کانکشن را چک می کردم اما مشکل اینه که اگر کانکشن وصل باشه و در حین اجرای برنامه قطع بشه با adoconnection.connected مقدار true بر میگرداند و تازه وقتی adoquery باز شد یا execute شد خطا میدهد
چه کار کنم؟

masoode
چهارشنبه 25 مهر 1397, 09:41 صبح
سلام دوستان
می دونم این تاپیک خیلی قدیمیه، اما اینجا ظاهرا به نتیجه ای نرسیده. من هم این مشکل را دارم.
قبل از اجرای هر کوئری اول کانکشن را چک می کردم اما مشکل اینه که اگر کانکشن وصل باشه و در حین اجرای برنامه قطع بشه با adoconnection.connected مقدار true بر میگرداند و تازه وقتی adoquery باز شد یا execute شد خطا میدهد
چه کار کنم؟

آیا لازمه این موضوع که اینجا حل نشده باقی مانده را دوباره تاپیک جدید بزنم؟