PDA

View Full Version : برنامه سه لایه و استفاده از کوئری



حمیدرضاصادقیان
شنبه 12 اردیبهشت 1388, 07:40 صبح
سلام دوستان. در حال طراحی یک برنامه سه لایه با استفاده از دلفی 2009 هستم. یک سوال برام پیش اومده که من دستورات اضافه و اصلاح و حذف رو با استفاده از کوئری بنویسم روی سرور بهتره یا با استفاده از CDS روی کلاینت با دستورات insert,delete اینکارو بکنم و با applyupdate به سرور ارسال کنم. کدوم سرعتش بیشتره و کدوم یکی بهتره.
باتشکر.

vcldeveloper
شنبه 12 اردیبهشت 1388, 11:40 صبح
وقتی کوئری ها را مستقیم با ClientDataset ارسال می کنید، دیگه نوع برنامه "3-لایه" نمیشه، بلکه میشه برنامه برنامه Client\Serverایی که ادای "3-لایه" را در می آورد!

شما باید ببینید هدف تان از سه لایه کردن برنامه چی هست. اگر قرار هست کوئری ها را از کلاینت بوسیله ClientDataset ارسال کنید، و تنها دغدغه شما این هست که کدام حالت سرعت بیشتری داره، پس اصلا سه لایه کردن برنامه بدرد کار شما نمیخوره، و فقط سربار برنامه را افزایش میده، و برنامه را پیچیده تر میکنه، بدون آنکه چیز خاصی از آن بدست بیارید.

حمیدرضاصادقیان
شنبه 12 اردیبهشت 1388, 15:13 عصر
سلام علی جان.ممنون از پاسخت.من منظورم این بود که من کوئری رو در سطح سرور بنویسم و با استفاده از proxy که در سمت کلاینت میسازم بهش پارامتر پاس بدم و اون کوئری در سطح سرور اجرا بشه. یا اینکه من در خود delta CDS اینکارو بکنم بعد با استفاده از applyupdate تمامی تغییرات رو به سمت سرور ارجاع بدم.
ممنون

vcldeveloper
یک شنبه 13 اردیبهشت 1388, 01:02 صبح
منظورم این بود که من کوئری رو در سطح سرور بنویسم و با استفاده از proxy که در سمت کلاینت میسازم بهش پارامتر پاس بدم و اون کوئری در سطح سرور اجرا بشه. یا اینکه من در خود delta CDS اینکارو بکنم بعد با استفاده از applyupdate تمامی تغییرات رو به سمت سرور ارجاع بدم.
در هر دو حالت کوئری در سمت سرور اجرا میشه. حالت دوم موقعی صادق هست که کلاینت نتیجه کوئری را دریافت کرده، و میخواد روی آن ویرایش ان ویرایش انجام بده. اون وقت میشه قبل از ثبت تغییرات در بانک، در لایه دوم، از طریق Dataset provider، مقادیر تغییر داده شده را بررسی کرد.
اینکه از کدام روش استفاده کنید، بیشتر به نوع کارکرد برنامه شما مربوط میشه. در شرایط عادی، استفاده از کلاس های Proxy مزیت بیشتری نسیت به حالت دوم داره، چون کلاینت عملا با ساختار بانک اطلاعاتی یا کوئری درگیر نیست، فقط درخواست های خود را از طریق رابط برنامه نویسی فراهم شده، به سرور ارسال می کند، بدون آنکه بداند سرور داده های مورد نیاز را از چه طریقی و با چه قالبی بدست میاورد، و نتیجه را دریافت می کند. حالت دوم زمانی که داده ها در سمت کلاینت زیاد پردازش می شوند و عملا در مسیر بانک اطلاعاتی تا کلاینت هم پردازش سنگینی روی داده ها در لایه میانی صورت نمی گیرد، می تواند مفید باشد.

البته با استفاده از کلاس های Proxy هم می توانید متدهای سمت سروری داشته باشید که Dataset برگشت می دهند، و آن Dataset را به یک ClientDataset نسبت دهید، و بعد از ویرایش، مجددا، Dataset را بصورت پارامتر به سرور برگشت بدید، یا فقط Delta آن را به سرور برگشت بدید، ولی در این صورت پردازش Delta در سمت سرور باید توسط شما صورت گیرد.

accpascal
سه شنبه 15 اردیبهشت 1388, 12:21 عصر
البته با استفاده از کلاس های Proxy هم می توانید متدهای سمت سروری داشته باشید که Dataset برگشت می دهند، و آن Dataset را به یک ClientDataset نسبت دهید، و بعد از ویرایش، مجددا، Dataset را بصورت پارامتر به سرور برگشت بدید، یا فقط Delta آن را به سرور برگشت بدید، ولی در این صورت پردازش Delta در سمت سرور باید توسط شما صورت گیرد.
جناب کشاورز این بحث شما واقعا فوق العاده است اگر اجازه بدهید سوالی را مطرح کنم
اولا آیا در پروتکل soap هم می توانیم پارامترهای دیتاست داشته باشیم؟(البته در دلفی 7) و اگر آری کدام روش مزیت بیشتری دارد
ثانیا دلیل اینکه ارسال کوئری از طریق CDS ادای برنامه 3 لایه را در می آورد چیست
اصولا من با applyupdate خیلی مشکل دارم و در بدر بدنبال روشهای مناسبتر می گردم!!
ممنون

vcldeveloper
سه شنبه 15 اردیبهشت 1388, 12:38 عصر
اولا آیا در پروتکل soap هم می توانیم پارامترهای دیتاست داشته باشیم؟(البته در دلفی 7) و اگر آری کدام روش مزیت بیشتری دارد
اون بحثی که من مطرح کردم، فقط به دلفی 2009 و DataSnap 2009 مربوط میشه. در دلفی 7 شما همچین امکانی ندارید.


ثانیا دلیل اینکه ارسال کوئری از طریق CDS ادای برنامه 3 لایه را در می آورد چیست
چون شما برنامه را 3 لایه می کنید که کلاینت شما مستقیما با بانک اطلاعاتی درگیر نباشه، یا تغییرات در نوع یا ساختار بانک اطلاعاتی شما تاثیری بر روی کلاینت ها نداشته باشه. وقتی شما مستقیما کوئری های بانک اطلاعاتی را از کلاینت به بانک اطلاعاتی بفرستید، عملا دارید این مسئله را دور می زنید، پس بود و نبود لایه میانی شما تاثیر خاصی بر روند ارسال و دریافت داده بین بانک اطلاعاتی و کلاینت نداره. در واقع ساختار برنامه 3 لایه شده، و تکنیک های استفاده شده همچنان مربوط به Client\Server هست.

حمیدرضاصادقیان
سه شنبه 15 اردیبهشت 1388, 12:40 عصر
سلام.خوب منظور اقای کشاورز اینه که شمار کوئری رو در سمت کلاینت بنویسی و با استفاده از cds اونو پاس بدی به سرور. در اینجا لایه میانی عملا هیچ کاری انجام نمیده.
ولی شما باید کوئری رو در سمت سرور بنویسی و وقتی که یک proxyclass در سمت کلاینت ایجاد میکنی میتونی اون پروسیجر یا تابع رو صدا بزنی و اگر پارامتر هم داره بهش پاس بدی.دیگه کلاینت نحوه پیاده سازی اون و این که شما چطوری خطاهای دیتا رو میخوای کنترل بکنی اطلاعی نداره.

accpascal
پنج شنبه 17 اردیبهشت 1388, 16:07 عصر
ولی شما باید کوئری رو در سمت سرور بنویسی و وقتی که یک proxyclass در سمت کلاینت ایجاد میکنی میتونی اون پروسیجر یا تابع رو صدا بزنی و اگر پارامتر هم داره بهش پاس بدی.دیگه کلاینت نحوه پیاده سازی اون و این که شما چطوری خطاهای دیتا رو میخوای کنترل بکنی اطلاعی نداره.
مشکل من اینه که این کلاس را (proxy)در دلفی 7 ندارم و یا پیدا نمی کنم
از پروتکل soap هم خواستم استفاده کنم مشکلات دیگری پیدا شد
من چگونه و با چه روشی در دلفی 7 می توانم برای ویرایش داده ها از ارسال پارامتر به سرور و ایجاد کوئری در سرور استفاده کنم
ممنون می شوم از جوابتون

vcldeveloper
پنج شنبه 17 اردیبهشت 1388, 16:21 عصر
مشکل من اینه که این کلاس را (proxy)در دلفی 7 ندارم و یا پیدا نمی کنم
این یک اصطلاح هست، نه اینکه یک کلاسی با نام Proxy در دلفی وجود داشته باشه تا این کار را برای شما انجام بده.

accpascal
جمعه 18 اردیبهشت 1388, 00:55 صبح
این یک اصطلاح هست، نه اینکه یک کلاسی با نام Proxy در دلفی وجود داشته باشه تا این کار را برای شما انجام بده.
ممکنه توضیحی در مورد این اصطلاح بفرمایید
ممنون می شوم

vcldeveloper
جمعه 18 اردیبهشت 1388, 07:53 صبح
ممکنه توضیحی در مورد این اصطلاح بفرمایید
بطور ساده یعنی کلاسی که نقش رابط بین کلاینت و متدهای سرور را بازی میکنه. بصورتی که فراخوانی متدهای سرور از طریق کلاینت راحتر و با پیچیدگی کمتر انجام بشه.

به عنوان نمونه ایی از این نوع کلاس ها، می تونید به چگونگی استفاده از WebService توجه کنید؛ وقتی شما یک WSDL را به داخل برنامه Import می کنید، دلفی یک کلاس Proxy از روی آن WSDL برای شما ایجاد می کند که رابطی مشابه رابط سرور فراهم کننده WebService دارد، و جزئیات فراخوانی متدهای WebService را از دید کلاینت مخفی می کند.

accpascal
جمعه 18 اردیبهشت 1388, 23:12 عصر
به عنوان نمونه ایی از این نوع کلاس ها، می تونید به چگونگی استفاده از WebService توجه کنید؛ وقتی شما یک WSDL را به داخل برنامه Import می کنید، دلفی یک کلاس Proxy از روی آن WSDL برای شما ایجاد می کند که رابطی مشابه رابط سرور فراهم کننده WebService دارد، و جزئیات فراخوانی متدهای WebService را از دید کلاینت مخفی می کند.
ممنون
اتفاقا من برنامه ای در دست دارم که درآن از دوحالت برای بازیابی داده ها و ویرایش داده ها استفاده کرده ام ولی هنوز تردید دارم
من یک برنامه سرور با استفاده از سوکت کانکشن برای بازیابی داده ها و یک وب سرویس با استفاده از پروتکل soap برای ویرایش داده ها نوشته ام از وب سرویس به این خاطر استفاده کرده ام زیرا چون قبل از ویرایش داده ها دستورات کنترلی زیادی دارم و با متد applyupdate کارم خیلی پیچیده و سخت می شود
اشکال کار در وب سرویس این است که نمی توانم یک متغیر کوئری سراسری تعریف کنم و برای هر دستور باید ابتدا یک کوئری تعریف و سپس دستور خود را بنویسم
اگر ممکن است نسبت به موارد زیر مرا راهنمایی نمایید
1 - آیا در این نوع وب سرویس می توانم از کوئری سراسری استفاده کنم
2 - اصولا نظر خود را نسبت به روش فوق بیان فرمایید
3 - آیا روش بهتری سراغ دارید
ممنون از توجه شما