تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




صفحه 1 از 2 12 آخرآخر
نمايش نتايج 1 به 10 از 19

نام تاپيک: ارسال دستور به کلاینت

  1. #1
    مدیر انجمن برنامه نویسی Payman_62's Avatar
    تاريخ عضويت
    Dec 2005
    محل سكونت
    تهران
    پست ها
    2,445

    پيش فرض ارسال دستور به کلاینت

    سلام.
    برنامه ای نوشتم که 2 قسمت داره. یعنی کلاینت سروریه.
    من میخوام نسخه ای که روی سرور sql نصب شده به کلاینت دستور خاصی بفرسته تا بعدش کلاینت عمل خاصی انجام بده و مقداری رو از دیتابیس بخونه.
    پروتوکول namepipe چطوره برای برقراری ارتباط؟
    لطفا راهنمایی کنید.

  2. #2
    اگه نباشه جاش خالی می مونه MTPROG's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    شهر 3500 ساله
    پست ها
    432

    پيش فرض

    من میخوام نسخه ای که روی سرور sql نصب شده به کلاینت دستور خاصی بفرسته تا بعدش کلاینت عمل خاصی انجام بده و مقداری رو از دیتابیس بخونه.
    من برای رفع این شکل یک جدول کنترلی به دیتابیس اضافه کردم و دستورات لازم رو طبق الگوریتمی ارسال میکردم و کلاینتها اونو میخوندند و اجرا میکردند

    مثال: فرض کنید مدیر سیستم قصد اجرای بخشی به نام اصلاح بانک اطلاعاتی در برنامه رو داره که ایرادات سندی و ثبتی رو برطرف میکنه در هنگام اجرای این بخش نباید هیچ عملیاتی رو بانک از طریق کلاینتها انجام بشه. مدیر سیستم این تقتضا رو در جدول کنترلی ثبت میکنه(مثلا فیلد LockDatabase رو برابر Trueقرار میده). کلاینتها قبل از انجام هر عملی که روی بانک تاثیر میذاره این فیلد رو چک میکنن اگه True بود از انجام عمل منصرف میشن در غیر اینصورت کارشون رو انجام میدن.

    یه نمونه دیگه : فرض کنید مدیر سیستم میخواد کلاینت شماره 5 گزارش فروش خودشو بررسی کنه . کلاینتها باید دارای Thread هایی باشند که وضعیت فیلدهای کنترلی مخصوصی رو بررسی کنن .جهت این کار کلاینت جدول دستورات رو نگاه میکنه اگر ID اون کلاینت توی جدول موجود بود فیلد دستور رو نگاه میکنه.و اون دستور رو طبق الگوریتمی که شما از قبل برای آماده کردید انجام میده

  3. #3
    مدیر انجمن برنامه نویسی Payman_62's Avatar
    تاريخ عضويت
    Dec 2005
    محل سكونت
    تهران
    پست ها
    2,445

    پيش فرض

    سلام.
    نه این روش حرفه ای نیست. چون من بلافاصله بعد از اعمال تغییرات باید به کلاینت مورد نظر بگم دیتابیس رو بخونه. اگه بخوام بذارم که خودشون بخونن باید هر ثانیه به سرور وصل شن و اطلاعات رو بخونن. حالا فرض 200 تا کلاینت داریم. نمیشه که 200 تا کلاینت هر ثانیه سرور رو بخونن. به سرور فشار میاد.
    من میخوام زمانی که لازمه به کلاینت مورد نظر بگم دیتابیس رو بخون.

  4. #4
    اگه نباشه جاش خالی می مونه MTPROG's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    شهر 3500 ساله
    پست ها
    432

    پيش فرض

    حالا فرض 200 تا کلاینت داریم. نمیشه که 200 تا کلاینت هر ثانیه سرور رو بخونن. به سرور فشار میاد
    من این کار رو برای 20 کلاینت انجام دادم هیچ مشکلی وجود نداشت بالاخره سرور برای این کارهای سنگین طراحی شده در ضمن چون در درخواستها در در حد یک فیلد ساده است زیاد فشار نمیاد

    البته یه راه دیگه هم هست میشه از Socket Programing هم استفاده کرد مثل یک برنامه چت
    با داشتن ای پی یا نام کلاینت میتونید دستورات رو بصورت متن یا فایل به کلاینت بفرستیدو کلاینت اونو بخونه تو این روش دیگه تقاضاها به سرور نمیره و هروقت لازم بود سرور اطلاعاتشو به کلاینتها میفرسته

    کلاینتها میتونن یک خط فرمان داشته باشن و وقتی پیغامی از طرف سرور اومد اونو انجام بدن تازه میشه کلاینتها با هم ارتباط هم داشته باشن این رو ش بصورت لحظه ای انجام میشه یعنی هر وقت نیاز بود سرور دستور میفرسته و هر وقت دستور رسید کلاینت کار انجام میده
    تر کیبی از بانک اطلاعلتی و Socket Programing

    شاید به قول شما این روش حرفه ای تر باشه!
    Last edited by MTPROG; 01-09-2009 at 08:46.

  5. این کاربر از MTPROG بخاطر این مطلب مفید تشکر کرده است


  6. #5
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    چون سوال جالب بود، میخواستم زودتر جواب دهم ولی پیدا کردن لینکها و دستورات مربوطه یک کم حال داشتن میخواهد!

    =====

    برای یک ارتباط دوسویه کامل میتوانید مستقیماً از سوکت ها استفاده کنید.
    حتماً این pdf درپیت من را دیده اید!
    [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]

    =====

    من نمیدانم مورد شما چیست ولی شاید کلاس System.Data.SqlClient.SqlDependency کمکتان کند و بتوانید از سرویس Notifications Service استفاده کنید که با کمک Broker Service کار میکند.

    به عنوان مثال شما میتوانید دستور TSQL-SELECT ای مشخص کنید و سپس در صورتی که در سرور دستوری اجرا شد که نتیجه اش تغییر محتویات دیداری SELECT شما باشد، مطلع شوید و مثلاً نمایه شبه گرایدی برنامه را به روز کنید.

    برای این امر دو کلاس در دات نت داریم که گمانم استفاده از System.Data.SqlClient.SqlDependency ساده تر باشد.

    مرجع MSDN کلاس مذکور:
    msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldependency.aspx

    فعال سازی قابلیت مذکور با بیشترین هماهنگی و کمترین مشکل در آینده در SQLServer و دیتابیس مربوطه:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    (تست نکردم ولی گمانم سرویس مذکور روی express وجود نداشته باشد، اما اگر هم نباشد احتمال زیادی دارد جزء advanced های express دانلود و نصب شود.)

    شرایط دستور TSQL-SELECT (هر SELECT ای مجاز نیست):
    msdn.microsoft.com/en-us/library/ms181122.aspx

    نمونه کد:
    msdn.microsoft.com/en-us/library/a52dhwx7.aspx

    موفق باشید.

  7. 2 کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده اند


  8. #6
    مدیر انجمن برنامه نویسی Payman_62's Avatar
    تاريخ عضويت
    Dec 2005
    محل سكونت
    تهران
    پست ها
    2,445

    پيش فرض

    سلام.
    من این کار رو برای 20 کلاینت انجام دادم هیچ مشکلی وجود نداشت بالاخره سرور برای این کارهای سنگین طراحی شده در ضمن چون در درخواستها در در حد یک فیلد ساده است زیاد فشار نمیاد
    چرا دیگه فشار میاد. هم به کلاینت ها هم به سرور. 200 تا کلاینت یا بیشتر بخوان هر ثانیه سرور رو بخونن. چون بلافاصله بعد تغییر باید خونده شه.


    البته یه راه دیگه هم هست میشه از Socket Programing هم استفاده کرد
    سلام
    برای یک ارتباط دوسویه کامل میتوانید مستقیماً از سوکت ها استفاده کنید.
    بله ابتدا با توجه به آشنایی که به برنامه نویسی شبکه دارم میخواستم از این روش استفاده کنم. ولی باز کردن پورت مشکلات خودش رو داره. فایروال گیر میده و دردسر های بعدش. اینه که ترجیح میدم از سوکت پروگرمینگ استفاده نکنم. یا حداقل راه آخر باشه.


    من نمیدانم مورد شما چیست ولی شاید کلاس System.Data.SqlClient.SqlDependency کمکتان کند و بتوانید از سرویس Notifications Service استفاده کنید که با کمک Broker Service کار میکند.

    به عنوان مثال شما میتوانید دستور TSQL-SELECT ای مشخص کنید و سپس در صورتی که در سرور دستوری اجرا شد که نتیجه اش تغییر محتویات دیداری SELECT شما باشد، مطلع شوید و مثلاً نمایه شبه گرایدی برنامه را به روز کنید.

    برای این امر دو کلاس در دات نت داریم که گمانم استفاده از System.Data.SqlClient.SqlDependency ساده تر باشد.

    مرجع MSDN کلاس مذکور:
    msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldependency.aspx

    فعال سازی قابلیت مذکور با بیشترین هماهنگی و کمترین مشکل در آینده در SQLServer و دیتابیس مربوطه:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    (تست نکردم ولی گمانم سرویس مذکور روی express وجود نداشته باشد، اما اگر هم نباشد احتمال زیادی دارد جزء advanced های express دانلود و نصب شود.)

    شرایط دستور TSQL-SELECT (هر SELECT ای مجاز نیست):
    msdn.microsoft.com/en-us/library/ms181122.aspx

    نمونه کد:
    msdn.microsoft.com/en-us/library/a52dhwx7.aspx

    موفق باشید.
    من میخوام کلاینت از تغییر مطلع بشه. فکر نمیکنم این روشی که شما فرمودین کلاینت رو با خبر کنه.

    ببینید من میخوام بلافاصله بعد از تغییر محتویات یه رکورد مربوط به یکی از کلاینت ها توسط خود سرور, سرور اون کلاینت رو خبر کنه تا اطلاعات جدید رو بخونه و اون اطلاعات تو خود کلاینت هم به روز شه.
    منطقی هم نیست تایمر بذارم و هر ثانیه از سرور Select کنم. ناشیانه ترین راه اینه. راه بهتر سوکت پروگرمینگ هست که باز مشکلات خودش رو داره.
    یه راه دیگه میشه پیشنهاد کرد به این صورت که 2 تا فیلد برای این کار در نظر بگیرم. بعد از اعمال تغییرات توسط سرور فیلد جدید آپدیت بشه ولی فیلد قدیمی محتویات قبلی رو که هنوز رو کلاینت هست رو نگه داره. بعد از این که بعدا کلاینت اطلاعات جدید رو خوند به سرور اطلاع میده و اون فیلد قدیمی هم مقدارش با فیلد جدید یکی میشه. ولی این روش هم یه فیلد اضافی به دیتابیس تحمیل میکنه.

  9. #7
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    ببینید من میخوام بلافاصله بعد از تغییر محتویات یه رکورد مربوط به یکی از کلاینت ها توسط خود سرور, سرور اون کلاینت رو خبر کنه تا اطلاعات جدید رو بخونه و اون اطلاعات تو خود کلاینت هم به روز شه.
    دقیقاً مورد کاربرد همین مثالی زدم را توضیح دادید!
    SQLServer برای مدیریت صنعتی بانک های اطلاعاتی طراحی شده.

    این همه SQLServer بیچاره را هم دست کم نگیرید! تست کنید و کمی از قدرت و امکانات قریب مانده SQLServer لذت ببرید.

  10. این کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده است


  11. #8
    مدیر انجمن برنامه نویسی Payman_62's Avatar
    تاريخ عضويت
    Dec 2005
    محل سكونت
    تهران
    پست ها
    2,445

    پيش فرض

    سلام.
    لینک msdn رو دیدم. جالبه. همون چیزیه که میخوام.
    شما خودت این کلاس رو تست کردی؟ پیغام بلافاصله میرسه؟ نمونه سورس داری از این کار؟

  12. #9
    ناظر انجمن .NET Framework _H2_'s Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    یک جایی بین Framework و نارمک!
    پست ها
    4,746

    پيش فرض

    سلام
    شما خودت این کلاس رو تست کردی؟ پیغام بلافاصله میرسه؟ نمونه سورس داری از این کار؟
    بله تست کردم.

    =====

    من اختلاف زمانی خاصی مشاهده نکردم ...
    ولی بحرحال امکان دارد در یک برنامه شبکه با توجه به تعداد درخواست و تراکنش و ترافیک شبکه تعداد کلاینت منتظر پیام و... اختلاف زمانی رخ دهد، وجود اختلاف زمانی برای شبکه امری منطقی و قابل تصور است ولی نکته ای که وجود دارد ان است که من بعید میدانم اگر این کار را با روش و الگوریتم های دیگری انجام دهید بتوانید به بازدهی و سرعت بیشتری از سرویس آماده مذکور که مخصوص این امر طراحی شده برسید.

    =====

    نمونه سورس کد هم دقیقاً اگر شما سورس های همین صفحه زیر را در یک برنامه کپی کنید، کار خواهد کرد.
    msdn.microsoft.com/en-us/library/a52dhwx7.aspx
    یعنی کد اضافه ای نمیخواهد.

    سمپل فوق گفته یک grid و list و label روی فرم قرار دهید ولی قرار دادن یک listbox هم کافی است.
    اگر sqlserver2008 داشته باشید میتوانم همین کدها را برنامه کنم و برایتان بگذارم.
    (چون mdf های رایانه من در sqlserver2005 بازنخواهد شد.)

    اگر خودتان هم خواستید فقط به محدودیت های SQL دقت کنید:
    msdn.microsoft.com/en-us/library/ms181122.aspx

    مثلاً این SQL با دو بند مفاد فوق مغایر است و مجاز نیست:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    ولی این یکی صحیح است:
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    البته دستور TSQL ای را که دادم را هم فقط یکبار در دیتابیستان اجرا کنید.
    تست کنید اگر مشکلی داشتید میتوان سمپلی هم بگذارم (با شرط ss2008)

  13. این کاربر از _H2_ بخاطر این مطلب مفید تشکر کرده است


  14. #10
    اگه نباشه جاش خالی می مونه MTPROG's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    شهر 3500 ساله
    پست ها
    432

    پيش فرض

    تست کنید اگر مشکلی داشتید میتوان سمپلی هم بگذارم (با شرط ss2008)
    لطفا جهت تکمیل شدن بحث Sample هم بزارید

    ممنون

صفحه 1 از 2 12 آخرآخر

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

برچسب های این موضوع

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •