# Native Code > برنامه نویسی در Delphi > مقالات مرتبط با Delphi/Win32 >  آموزش لایه میانی ( +COM ) در سبک MultiTier

## حرفه ای

دوستان برنامه نویسی که با برنامه نویسی تحت شبکه آشنایی دارند بی شک با سبک Multitier (چند لایه ای ) آشنا هستند و در میان این لایه ها مسلماً لایه میانی ( +Com )  از اهمیت بالایی برخوردار است .
در این تاپیک سعی بر آن دارم تا کمی در مورد   ( +Com )   لایه میانی برنامه نویسی توضیحاتی را خدمت شما ارائه دهم .
بی شک پس از گذشت موج اول انقلاب مکانیزاسیون ( که ما در ایران در اواخر این دوره هستیم ) در کشور های توسعه یافته موج دوم و یا همان حرکت به سوی برنامه های enterprise آغاز گردید .
در موج اول هدف مکانیزه کردن فعالیتهای دستی و حرکت به سوی سیستمهای رایانه ای بود اما سیستمهای enterprise انقلابی در دنیای اطلاعات ایجاد نمود .
اما برنامه های enterprise شامل سه ویژگی کلیدی می باشند .
1-	بزرگ بودن برنامه
2-	توزیع شده بودن آن
3-	بحرانی و حساس بودن آن
برنامه های enterprise به هیچ وجه جدید نیستند . برنامه نویسان در سازمانهای بزرگ مانند بانکها ، دفاتر هواپیمایی ، شرکتهای بیمه و بیمارستانها سالهاست که درگیر نوشتن اینگونه برنامه ها هستند . توسعه برنامه enterprise به طور تاریخی فرایندی طولانی ، پر مشقت و پرهزینه بوده ضمن اینکه همیشه نیز با موفقیت همراه نبوده است .
علت این امر پیچیدگی منطقی تجاری برنامه نبوده بلکه مسئله اساسی این بوده است که توسعه دهندگان برنامه باید تمامی زیرساختهای لازم برای گسترش این منطق تجاری در سطح enterprise  را از صفر می نوشتند برای مثال یک برنامه enterprise نیازمند سطح بالایی از امنیت است که یک برنامه دسکتاپ احتیاج چندانی به آن ندارد .
بدین دلیل +Com پا در عرصه ظهور نهاد .
+‍Com یک بخش یکپارچه از ویندوز 2000 به بعد می باشد و در مقایسه با Com دو پیشرفت اساسی کرده است . نخست اینکه در بردارنده نسخه 3 از سرور تراکنش مایکروسافت یا MTS   (Microsoft Transaction Server ) است که پس از اعمال آخرین تغییرات با بخشهای موجود Com یکپارچه شده است . MTS که برای اولین بار در بهار 1997 میلادی به بازار ارائه شد اولین تلاش مایکروسافت برای ارائه نوعی از زیر ساخت enterprise در قالب یک محصول تجاری بود MTS  در ابتدا به صورت یک لایه پوشاننده ( Wrapper ) بر فراز Com قرار گرفته بود و  سپس گروههای Com و MTS مایکروسافت در پاییز سال 1997 میلادی با هم ادغام شدند و +Com نخستین محصول یکپارچه آنهاست .
مهمترین سرویسهای این محصول عبارت است از :
1-	سرویسهای تراکنش (Transaction Services ) 
2-	سرویسهای امنیتی (Security Services)
3-	سرویسهای هم زمان سازی (Synchronization Services)
4-	اجزای صف بندی شده (Queued Components)
5-	سرویس رویداد (Event Service)
6-	پایگاه داده مقیم در حافظه (In-Memory Database)
7-	موازنه بار (Load Balancing)
در اولین فرصت به بررسی تخصصی هر یک از سرویسها و چگونگی تولید و استفاده آنها  با زبان شیرین دلفی می پردازم .
بی شک دوستانی که با قابلیتهای این سرویس آشناشوند از اینکه تاکنون از سبکهای دیگر برنامه نویسی استفاده کرده اند پشیمان خواهند شد

----------


## حرفه ای

قسمت دوم 
در این قسمت در مورد Com+ توضیح بیشتری می دهم و در قسمت آتی اولین لایه میانی (تجاری) مبتنی بر Com+  را توسط Delphi تولید می کنیم و سپس راجع به چگونگی استفاده از سرویسیهای آن مطالبی را به استحضار شما خواهم رساند .
نوشتن برنامه کاربردی enterprise ما را وادار به حل مسائلی می کند که به کلی با مسائل مربوط به نوشتن برنامه دسکتاپ متفاوت است . در مثال اول فرض کنید می خواهیم یک برنامه برای یکی از بانکها و یا صندوقهای قرض الحسنه بنویسیم که هدف آن افزایش و یا کاهش موجودی یک حساب است . 
برنامه جدید ما یقیناً به مسائل امنیتی اهمیت خواهد داد . در برنامه دسک تاپ ما بحث امنیت را چندان جدی نگرفته بودیم یا به بیان دقیقتر ، مشتریان ما به این موضوع اهمیت زیادی نداده بودند ، چرا که احساس آنها این بوده که با محبوس کردن کامپیوترها در منازلشان ، دیگر کسی امکان ورود به سیستم و سرقت پولهایشان را نخواهد داشت . کاربران خیلی بد بین می توانستند برای PC های خود ، کلمه عبور تعریف کرده و از این طریق کاربران غیر مجاز را از ورود به سیستم منع کنند ولی از این طریق کاربران غیر مجاز را از ورود به سیستم منع کنند . لیکن برنامه Enterprise   ما دهها کاربر خواهد داشت که روی شبکه در حال آمد و رفت خواهند بود ما باید مطمئن باشیم که می توانیم هویت یک مشتری راه دور (remote) را تشخیص داده و به وی اجازه دهیم که فقط از حساب شخصی خود پول برداشت کند . همچنین نیازمند روشی برای شناسائی کاربران مدیریتی (Administrator ) هستیم که باید به حسابهای تمامی مشتریان دسترسی داشته باشد . نهایتاً به مکانیزمی احتیاج داریم که بتوانیم از طریق آن سیستم امنیتی را مدیریت کرده و مشخص نمائیم که چه کسی اجازه انجام کار عملیات را دارند .
مشکل دیگر که در برنامه Enterprise با آن مواجه می شویم ، مسئله همزمان سازی (synchronization) است . با توجه به اینکه به جای یک کاربر دسک تاپ ، ممکن است صدها کاربر در حال انجام عملیات روی برنامه باشند ، احتمال بروز مشکلات مربوط به فراخوانی یک متد واحد به طور همزمان توسط دو کلاینت وجود دارد سیستم عامل به صورت نوبتی (preemptively) و در فواصل زمانی نامعین ، به این دو فراخوان رسیدگی خواهد کرد و این بدان معناست که کار یک کلاینت می تواند عملیات کلاینت دیگر را مختل سازد ، بنابراین نیازمند روشی هستیم که جلوی تداخل عملیات همزمان چند کاربر را بگیرد . انجام این عملیات روی برنامه دسک تاپ دشوار است زیرا اما عملی است زیر Com می تواند از سرویس صف بندی پیغامها (message queueing)  در ویندوز بهره جسته و فراخوان های مختلف را به صورت متوالی زمان بندی کند .
( جهت اطلاع دوستان : در سبک Multitier یک برنامه نویس اغلب اوغات توابع خود را بر روی لایه میانی یا همان +Com قرار می دهد  و هدف قسمت آخر این مثال پشتیبانی +Com از سرویس synchronization می باشد و در مورد بحث امنیت این یک حقیقت تلخ است که 90 درصد برنامه های تولیدی ما فاقد امنیت هستند و یا لایه های امنیتی آن جهت کنترل کاربران آماتور طراحی گردیده است )
حال در ادامه این مثال به بیان نحوه پرداخت چک می پپردازیم :
تصور کنید دو مشتری به طور همزمان به دو باجه مراجعه کرده اند و قصد دارند از حساب یکسان مبلغ یکصد هزار تومان را بردارند در حالی که موجودی حساب تنها یکصد و ده هزار تومان می  باشد حال دو باجه به طور همزمان موجودی را چک کرده و پس از اطمینان از موجودی چکها را پاس می کنند در صورتی که نباید یکی از چکها پاس گردد !
مشکل کجاست ؟ آیا می دانید با استفاده از لایه میانی (+Com) این مشکل را حل کنید .
و یا قصد دارید مبلغی از حسابی بردارید و به حساب دیگر بریزید ، مبلغ از حساب اول کسر شده و قبل از واریز به حساب دوم برق قطع می شود و عملیات ناقص می ماند و یا بلعکس مبلغ به حساب دوم افزوده شده و قبل از کسر از حساب اول برق قطع شده و یا سرور خراب می شود حال در هر صورت یا بانک مغموم می شود و یا مشتری !
راه حل بسیار آسان است با استفاده از سرویس مدیریت تراکنش +Com می توانید بدون نوشتن هیچگونه کدی از بروز چنین مشکلاتی اجتناب نمایید .
در پایان به شعار گروهی که نخستین بار سرور تراکنش مایکروسافت (MTS ) را نوشتند و در گام بعدی موجب تحولی بزرگ در +Com شدند اشاره می کنم :
*بگذارید به پیش رفته و کارها را به Viper واگذار نماییم* .

یکشنبه 24/10/85   ساعت 10:19

----------


## حرفه ای

*دوستان خوبم ! 

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

----------


## حرفه ای

و اما ادامه بحث :
بیاییم امروز اولین لایه میانی مبتنی (+Com ) را توسط دلفی تولید کنیم .
قدم به قدم با هم گام برمی داریم :
قدم اول : طراحی لایه Com+ با استفاده از دلفی 7
1)	در دلفی ابتدا تمامی پروژه های فعال را Close می کنیم .
2)	از منوی File گزینه New و سپس Other را انتخاب می کنیم تا پنجره New Item باز شود .
3)	از سربرگ ActiveX گزینه ActiveX Library را انتخاب کرده و بر روی دکمه OK کلیک می کنیم .
4)	حال می بایست پروژه خود را Save کنیم . در انتخاب نام پروژه دقت کنید . پیشنهاد می شود اگر برای اولین بار این کار را می کنید نام TestServer را انتخاب کنید .
5)	حال مجدداً از منوی File گزینه New و سپس Other را انتخاب می کنیم تا پنجره New Item باز شود .
6)	حال سربرگ Multitier را انتخاب می کنیم دو ابجکت مشاهده می شود : Remote Data Module و Transactional Data Module  که در تاپیک جداگانه ای راجع به آنان و تنظیماتشان بحث و بررسی خواهیم کرد .
7)	حال Remote Data Module را انتخاب کرده و بر روی دکمه OK کلیک می کنیم .
8)	پنجره Remote Data Module Wizard باز می شود در قسمت CoClass Name نام لایه میانی یا همان Com+ را وارد می کنیم . پیشنهاد می شود در این پروژه نام Test را وارد نمایید .با سایر تنظیمات کاری نداشته باشید و بگذارید همان تنظیمات پیش فرض باقی بماند و بر روی دکمه OK کلیک نمایید .
9)	حال مجدداً پروژه خود را save می کنیم .
10)	 حال به منظور رجیستر کردن dll لایه میانی تولیدی از منوی Run گزینه Register ActiveX Server را انتخاب کنید مطمئن باشید پیغام زیر نمایش داده می شود .
Successfully registered ActiveX Server , '… Project Path …'
11)	 حال از همان منوی Run گزینه Install Com+ Objects را انتخاب کرده و در فرم نمایش داده شده تیک جلوی Test در Objects name را کلیک کرده پنجره دیگر باز می شود چون اولین بار است این کار را انجام می دهیم سربرگ دوم Install into new Application را انتخاب کرده و جلوی Application Name همان اسم Com+ یعنی Test را تایپ کرده و بر روی دکمه Ok و OK کلیک می کنیم .
12)	حال مجدداً پروژه را Save می کنیم .
آری شما موفق شدید اولین لایه میانی مبتنی بر com+ را بسازید جهت مشاهده لایه میانی تولید شده توسط شما مسیر زیر را اجرا نمایید 
My Computer – Control Panel - Administrative Tools - Component Servicesدر پنجره Component Services گره Component Services سپس Computer سپس My Computer و به دنبال آن Com+ Application را باز کنید همانطور که می بینید لایه میانی Com+ شما تحت عنوان Test به این مجموعه اضافه شده  است
در مباحث بعدی بیشتر راجع به این لایه و چگونگی استفاده از آن توضیح می دهم .

----------


## حرفه ای

روز چهارم

تنظیمات Remote Data Module 

اصطلاحاً به فن آوری که در مورد آن صحبت می کنیم DataSnap می گوییم که به صورت کلی می توان گفت این فن آوری به برنامه های Client اجازه می دهد تا به صورت غیر مستقیم به Database بر روی سرور وصل شوند .
در نگارش های قبلی دلفی ، DataSnap به نام midas شناخته می شود به دلیل ملاحظات تجاری بین المللی ، نام midas به DataSnap تغییر یافت .
چیزی بیش از سه سال پیش بنده اولین نرم افزار مبتنی بر سبک Multitier را نوشتم اما با یک مشکل بزرگ در زمان نصب برخورد کردم و آن این بود که Setup لایه میانی یا همان +Com پیغام اشکال در نصب یا (Error) می داد و نصب نمی شد و بیش از یکماه با این مشکل دست به گریبان بودم تا فهمیدم می بایست فایلی به نام midas.dll را در مسیر system32 کپی کنم تا لایه +Com من با موفقیت نصب گردد .
تجربه من موید آن است که این سرویس از توابع موجود در midas.dll بهره می برد و این همان فن آوری DataSnap یا midas سابق است .
همانطور که در مثال بالا توضیح دادیم ما از Remote Data Module یا همان ماژول  داده را دور استفاده کردیم اما توضیحاتی راجع به این ماژول ندادیم  . 
همانطور که از نام این ماژول پیداست این ماژول سرویسهای متنوعی در زمینه اتصال یک کاربر از راه دور به برنامه می دهد و عموماً کاربردی ترین ماژول  از فن آوری DataSnap است .در بیشتر مواقع یک ماژول Remote برای سرور برنامه ما کفایت می کند هر چند که می توانید چندین ماژول برای یک سرور ایجاد کنید به زبان ساده تر برای اکثر برنامه های ما یک لایه +Com کفایت می کند مگر آنکه موارد زیر مورد نیاز ما باشد که البته پیشنهاد نمی گردد :
1-	سرور برنامه نیاز به اتصال به چندین Database دارد و شما می خواهید برای هر Database یک لایه +Com ایجاد کنید .
2-	دو نوع کاربر برنامه را اجرا می کنند ( مثلاً یک User و یک Admin ) ممکن است بخواهید دو لایه +Com ایجاد کنید که لایه Admin حاوی جداول و پرس و جوهای اضافی برای داده های حساس باشد .
3-	ممکن است بخواهید یک لایه +Com برای اتصال به Database و یک لایه دیگر برای سرویسهای غیر داده ای از قبیل محاسبات عددی داشته باشیم . این قابلیت را در قسمت ایجاد و استفاده از توابع در لایه +Com توضیح خواهیم داد .
ما در فرم Remote Data Module Wizard کلاس لایه میانی یا CoClass Name را Test قرار دادیم و راجع به سایر تنظیمات توضیحاتی ندادیم 
یکی از موارد تنظیمات Instancing یا نوع نمونه سازی مورد استفاده برای Remote Data Module می باشد این موارد شامل عنواین زیر می باشد :
1-	Internal : این به منزله آن است که Remote Data Module نمی تواند از یک Client خارجی ایجاد شود . Remote Data Module ها در با این تنظیم همیشه از برنامه سرور ایجاد می شود  یا بهتر است بگویم این کاربر نمی تواند به این ماژول کانکت کند مگر از روی سرور .
2-	Single Instance : هر کلاینتی که سعی کند تا به سرور متصل شود . سرور نمونه مجزایی از فایل اجرایی سرور جهت اجرا به وجود خواهد آمد .
3-	Multiple Instance : در این حالت تنها یک کپی از برنامه اجرایی سرور اجرا خواهد شد اما یک Remote Data Module مجزا برای کلاینتی نمونه سازی خواهد شد که به آن متصل می شود در بحثهای آینده به بررسی این خصوصیات می پردازیم .
تنظیم دیگر باقی مانده Threading Model یا همان حالت ریسمان بندی CPU است که به اختصار کمی به بررسی آنها می پردازیم :
1-	Single : Data Module در هر بار درخواست ها را از یک کلاینت دریافت خواهد کرد در نتیجه نیازی به سروکار داشتن با بحث های رشته ای یا همان Thread ها نخواهید داشت .
2-	Apartment : هر نمونه از Data Module تنها یک درخواست را در هر بار سرویس خواهد داد . هر چند سرور ممکن است چندین درخواست را در چندین بحث رشته ای در داده سراسری مدیریت کند .
3-	Free : Data Module می تواند چندین درخواست را از چندین کلاینت در یک زمان دریافت کند . علاوه بر سر و کار داشتن با برخوردهای رشته ای در داده سراسری ، باید داده نمونه را نیز مدیریت کنید .
4-	Both : همانند Free با این استثناء که Callback انجام شده در رابطهای کلاینت ، سریالی است .
5-	Neutral : چندین کلاینت می توانند درخواستهایی را به یک Data Module در یک زمان داشته اما COM اطمینان می دهد که هیچ دو درخواستی با یکدیگر برخورد نخواهند داشت . این بحث جزئی از سرویسهای هم زمان سازی یا (Synchronization Services) می باشد .
اما همانطور که در بحث قبلی نیز بیان کردیم تنظیمات پیش فرض در دلفی بهترین انتخاب یک برنامه نویس می باشد در بحث آینده درباره نحوه کانکت گرفتن به بانک توضیحات بیشتری را خدمت شما عرض خواهم کرد .

----------


## حرفه ای

*روز پنجم*

ارتباط با بانک اطلاعاتی توسط dbExpress
SQL Connection



حال می بایست به بانک اطلاعاتی خود ارتباط برقرار کنیم و یا بقول خودمان Connect بگیریم .
مهمترین Connection ها عبارتند از :
1-	SQL Connection از زیر مجموعه dbExpress
2-	ADO Connection : از زیر مجموعه Ado (Active Database Object)
3-	Database از زیر مجموعه BDE (Borland Database Engine)
4-	IB Database : از زیر مجموعه Inter base
البته بنده برای برنامه نویسی تحت شبکه گزینه یک یا دو را پیشنهاد می کنم .
شاید به جرات می توان گفت dbExpress قویترین و سریعترین ابزارهای ارتباط و کار با بانک اطلاعاتی است زیرا dbExpress یک جستجوگر یکطرفه است و در حالت عادی دستورات DDL و DML را پشتیبانی نمی کند .
نمی توان در حالت عادی جستجوی صورت گرفته توسط dbExpress را در DBGride نمایش داد و یا با دستور Back به رکورد قبلی بازگشت .
شاید خاصیت dbExpress دلفی بود که سبب شده جهت کار با بانکهای اطلاعاتی کمتر به سراغ سایر زبانهای برنامه نویسی روم اما اگر بتوانید از این ابزار استفاده کنید دیگر به سراغ ADO نخواهید رفت .
شاید اشکال آن تنها سخت بودن Connect گرفتن توسط آن است و برخلاف ADO چندان Connect گرفتن توسط آن راحت نیست .
البته در بحث بعدی کمی نیز راجع به ADO توضیح می دهیم .
در حالت کلی می توان گفت ما دو نوع ارتباط جهت Connect گرفتن به بانک اطلاعاتی داریم :
1-	ارتباطات معین (Named Connections)
2-	ارتباطات نامعین (Unnamed Connections)
که با توجه به اینکه می خواهیم برنامه تولیدی ما بر روی چندین کامپیوتر کار کند و در هر کامپیوتر Hostname ، UserName یا Password متفاوت است ما شیوه ارتباطات نامعین یا  (Unnamed Connections) را برمی گزینیم . 
Database انتخابی ما SQL Server 2000 ویرایش Desktop Edition است که می توان آن را بر روی ویندوز XP نصب نمود .
اگر از dbExpress جهت اتصال به SQL Server بهره می برید رعایت یک نکته حیاتی الزامیست که اگر این نکته را رعایت نکنید نمی توانید به SQL Server کانکت بگیرید .
رعایت نکات لازم در SQL Server :=================================================  ===
همانند تصویر زمینه بر روی SQL Server registration راست کلیک کرده و گزینه Properties را انتخاب می کنیم در سربرگ چهارم Security ، Authentication را از روی Windows Only بر روی قسمت SQL Server and Windows قرار  داده و بر روی دکمه OK کلیک کنید .
در قسمت Security سپس Logins بهتر است یک کاربر جدید تعریف کنیم درست است می توانیم از کاربر sa استفاده کنیم اما این یک کاربر عمومی است و به راحتی می توان توسط این کاربر به پایگاه داده نفوذ کرد و اصطلاحاً دیتابیس را هک نمود و ما مواجه به attack DoS می شویم .
حال از منوی Action گزینه New Login را انتخاب می کنیم و در قسمت Name به عنوان مثال TestUser را وارد می کنیم RadioButton گزینهSQL Server Authentication  را انتخاب کرده و در این مثال در قسمت Password گزینه TestPass را وارد می کنیم ( انتخاب نام کاربر و رمز عبور به عهده شماست و شما می توانید هر عنوانی را انتخاب کنید ) 
حال جهت تکمیل مطالب و استفاده این مطالب در مثال پایگاه داده ای به نام Test ایجاد می کنیم .
در قسمت Users پایگاه داده Test راست کلیک کرده و گزینه New database user را انتخاب می کنم از کمبوباکس Login Name عنوان TestUser را انتخاب کرده و بر روی دکمه OK کلیک می کنیم
حال باید جداول یا همان Table ها را ایجاد کنیم برای این منظور در پایگاه داده Test بر روی Tables کلیک می کنیم و از منوی Action گزینه New Table را بر می گزینیم .
و سه فیلد PersonalCode از نوع Int و فیلد  Nameاز نوع VarChar 15 ، FName از نوع VarChar 15 و Telephone از نوع VarChar 11 تعریف نموده و به نام Table1 ذخیره می کنیم .
حال بر روی Table1 دابل کلیک کرده و گزینه Permissions را انتخاب می کنیم و در جلوی کاربر TestUser امکان Select , Insert , Update , Delete ,DRI را می دهیم شما می توانید برای امنیت بیشتر کاربران متنوع تعریف نموده و در هر سطحی Permission مناسب را به آنها بدهید .
==================================================  ====
حال به دلفی باز می گردیم و در لایه +Com تولیدی یعنی  TestServer فرم یا همان Data Module ، Test را انتخاب می کنیم از تب dbExpress یک عددSQLConnection  بر روی فرم گذاشته و خاصیت Login Prompt آنرا False نموده و  بر روی آن دابل کلیک می کنیم .
1-	در قسمت Connection Name  گرینه MSSqlConnection را انتخاب می کنیم .
2-	Host Name خود را در فضای مقابل آن تایپ می کنیم . اگر Host Name کامپیوتر خود را نمی دانید در گوشه سمت راست task bar در کنار ساعت بر روی SQL Server Service Manager دابل کلیک کرده و در قسمت مقابل Server نام Host Name خود را مشاهده می کنید آنرا کپی کرده و در مقابل Host Name ، Paste نمایید .
3-	در مقابل Database نام پایگاه داده خود که در این مثال Test می باشد را تایپ نمایید .
4-	در مقابل User_Name  نام کاربر خود که در این مثال TestUser می باشد را تایپ کنید .
5-	در مقابل Password رمز عبور کاربر پایگاه داده که در این مثال TestPass می باشد را وارد نمایید .
6-	سپس بر روی دکمه OK کلیک نمایید .
7-	حال خاصیت Connected ، SQLConnection   را True کنید .
آری شما به راحتی توانستید توسط dbExpress با SQL Server  ارتباط برقرار کنید اما اگر با اشکال مواجه شدید مراحل بالا را بار دیگر بررسی کنید به احتمال بسیار زیاد قسمتی از مراحل بالا را درست تنظیم ننموده اید .

----------


## حرفه ای

*روز ششم* 

توضیح راجع به ارتباط با بانک اطلاعاتی توسط ADO 
ADO Connection

شاید برقراری ارتباط با بانک اطلاعاتی یا همان اصطلاح  Connect گرفتن به بانک توسط dbexpress کمی دشوار باشد لیکن برای آن دسته از دوستانی که قادر به ارتباط با بانک اطلاعاتی توسط dbexpress نمی باشند در مورد ADO توضیح می دهیم که بحث ارتباط با بانک اطلاعاتی به اتمام رسیده و به ادامه بحث اصلی بپردازیم :
در لایه +Com تولیدی یعنی  TestServer فرم یا همان Data Module ، Test را انتخاب می کنیم و از سربرگ ADO گزینه ADO Connection را انتخاب کرده و به Data Module اضافه می کنیم .
حال مراحل زیر گام به گام با هم طی می کنیم .
1)	بر روی ADO Connection دابل کلیک می کنیم
2)	بر روی دکمه Build کلیک می کنیم اگر این دکمه برای شما غیر فعال است Radio button گزینه Use Connection String را انتخاب می کنیم تا دکمه فوق فعال یا Enable شود .
3)	از لیست OLE DB Provider(s) گزینه Microsoft OLE DB Provider for SQL SERVER را انتخاب کرده و بر روی دکمه Next کلیک می کنیم .
4)	حال در قسمت User name مقدار sa با پسورد خالی و یا در قسمت User name مقدار TestUser و در قسمت پسورد مقدار TestPass را وارد نمایید 
البته یک راه راحت تر آن است که Security را در قسمت Use Windows NT Integrated Security تنظیم کنیم و از کاربر ویندوز جهت اتصال به SQL Server بهره ببرید اما به دلایل امنیتی به شما پیشنهاد نمی گردد .
البته فراموش نکنید تیک Allow saving password را بزنید .
5)	و در قسمت سوم فرم مذکور یعنی Select the database on the server و از Combo box اول پایگاه داده Test را انتخاب می کنیم .
6)	حال جهت اطمینان از تنظیم صحیح بر روی Test Connection کلیک نمایید اگر با پیغام Test Connection succeeded مواجه شدید تنظمیات را درست انجام  داده اید در غیر اینصورت اگر با پیغام خطای Test connection failed of an error in initializing provider ,… مواجه شدید تنظیمات را درست انجام نداده اید و یکبار دیگر مطالب بالا را بررسی کنید .
7)	حال بر روی گزینه OK و مجدداً OK کلیک می کنیم .
8)	می بایست Connection String  شما مطابق ذیل باشد :

Provider=SQLOLEDB.1;Password=TestPass;Persist Security Info=True;User ID=TestUser;Initial Catalog=Test

9)	در ADO Connection  خاصیت Login prompt را معادل False قرار می دهیم .
10)	 حال خاصیت Connected را معادل True قرار می دهیم .
درست است شما توانستید به راحتی توسط ADO به پایگاه داده کانکت کنید . اما اگر می خواهید در سطح بالاتری از امنیت ، سرعت و توانمندی را داشته باشید من dbExpress را پیشنهاد می کنم .
در بحث بعدی به بیان ادامه مطالب یعنی SQLDataSet جهت اجرای فرامین SQL در لایه میانی و اجرای StoredProcedure ها پرداخته و از خاصیت table آن صحبتی به میان خواهیم آورد .

----------


## حرفه ای

توضیح راجع به SQLDataSet

یک توضیح کوچولوی دیگر راجع به dbExpress ( خواندن این چند خط ضرر ندارد ) در ادامه به نحوه کار و استفاده از SqlDataSet می پردازیم :
مهمترین نکته ای که در مورد مجموعه dbExpress باید بدانید این است که آن ها یک جهته هستند .
در ابتدا ممکن است این امر یک عیب بزرگ به نظر برسد اما در مباحث آتی در می یابیم که چگونه معماری dbExpress روشی سبک ، قابل انعطاف و قدرتمند را جهت دسترسی ، Update اطلاعات فراهم می کند .
از آن جایی که مجموعه داده dbExpress یک جهته هستند . تنها حرکتی که می توانید بر روی رکوردهای موجود در آن انجام دهید حرکت از ابتدا رکوردها تا انتهای آنها به صورت هر رکورد یک بار می باشد .
لیکن مجموعه داده dbExpress فقط خواندنی و یک جهته است در نتیجه این اشیاء بسیار سبک می باشند . هیچگونه وظایف سرباری مانند پشتیبانی از Cursor های دوجهته ، بافرکردن رکوردها و مانند اینها در اینجا وجود ندارد .
اگر با موتور بانک اطلاعاتی بورلند (BDE) آشنا باشید ، می دانیم که BDE دارای قابلیتهای کامل ویرایش اطلاعات ، حرکت به عقب و جلو بر روی مجموعه داده و درایورهای بانک های اطلاعاتی مختلف می باشد . به هر حال برای نصب BDE تقریباً به 10MB فضا بر روی دیسک نظر دارید ، علاوه بر این BDE به شدت وابسطه به حافظه است (memory-intensive) . در صورتی که dbExpress فقط از 2 dll تشکیل شده است که جمعاً 400 KB فضا اشغال می کند . با توجه به اینکه dbExpress توابع بیشتری را نسبت به BDE در اختیار شما قرار می دهد .
دسترسی از طریق Query
حال که ما با پایگاه داده خود ارتباط برقرار کردیم نیازمند آبجکتی هستیم که توسط آن دستور SQL خود را اجرا کرده و نتایج را در آن مشاهده کینم یا به عبارت دیگر اجازه دسترسی به Table ها ، Stored Procedure ها و ... را به صورت یکسان به ما بدهد . 
1- ابتدا از SQLDataSet از سربرگ dbExpress انتخاب کرده و بر روی Data Module خود یعنی Test اضافه می کنیم .
2- حال می بایست 1SQLDataSet را به SQLConnection مرتبط سازیم بدین منظور در قسمت Properties آبجکت SQLConnection1 گزینه SQLConnection را انتخاب نموده و از کمبوباکس مقابل گزینه SQLConnection1 را انتخاب می نماییم .
3- SQLDataSet سه نوع مجوعه داده را پشتیبانی می کند ( جداول ، پرس و جوها و روالهای ذخیره شده ) برای تنظیم این قسمت در Command Type گزینه ctQuery را انتخاب می کنیم .
شما با توجه به نیاز خود می توانید از (ctQuery ، ctStoredProc و ctTable ) بهره ببرید که در آینده از آنها استفاده خواهیم کرد .
4- حال در قسمت Command Text دستور SQL ذیل را تایپ می کنیم :
SELECT * FROM Table1
5- حال خاصیت Active SQLConnection1 را معادل True قرار می دهیم .
دسترسی از طریق جدول 
1- قسمت Command Type آبجکت 1SQLDataSet را معادل ctTable قرار می دهیم .
2- در قسمت Command Text نام جدول یعنی Table1 را تایپ نموده .
3- حال خاصیت Active آبجکت SQLConnection1 را معادل True قرار می دهیم .
دسترسی به Stored Procedure 
ما در مثال بانک اطلاعاتی Stored Procedure را تولید نکردیم اما برای استفاده از Stored Procedure ها مثالی با Stored Procedure فرضی بیان می کنیم که امید است مورد استفاده شما قرار بگیرد .
1- قسمت Command Typeدر آبجکت 1SQLDataSet را معادل ctStoredProc قرار می دهیم .
2- در قسمت Command Text نام Stored Procedure را وارد می کنیم . مثال : MyStoreProc
3- حال خاصیت Active آبجکت SQLConnection1 را معادل True قرار می دهیم .
البته در مورد پرس و جوهای پارامتریک توضیح بیشتری را در مباحث بعد خواهیم داد .

----------


## حرفه ای

DataSetProvider 

بحث امروز بسیار کم اما بسیار مفید و با اهمیت است . با تکمیل این قسمت دیگر نیاز ما به آبجکتهای لایه میانی تکمیل گردیده و در مباحث بعدی به دنبال Application می رویم .
1-	از سربرگ Data Access گزینه DataSetProvider را انتخاب می کنیم و بر روی دیتاماجور خود اضافه می کنیم .
2-	خاصیت Data Set آن را معادل SQLDataSet1 قرار می دهیم .
3-	در قسمت Options گزینه poAllowCommandText را معادل True قرار دهید .
این امر سبب می گردد که اگر در قسمت Application اگر دستور SQL را فراخواندیم دستور ما اجرا گردد
4-	از منوی Run گزینه Register ActiveX Server را انتخاب کنید مطمئن باشید پیغام زیر نمایش داده می شود .
Successfully registered ActiveX Server , '… Project Path …'
5-	 حال از همان منوی Run گزینه Install Com+ Objects را انتخاب کرده و بر روی دکمه OK کلیک کنید .
شما موفق شدید به طور به طور کامل لایه میانی (+Com) را تولید کنید .

----------


## حرفه ای

*آموزش برنامه نویسی لایه کلاینت*
خوب امروز به سراغ کلاینت می رویم و سعی می کنیم خیلی مختصر و کلی به بررسی لایه کلاینت بپردازیم :
سه روش کلی برای کانکت گرفتن به لایه میانی (+Com) وجود دارد که امروز درباره SocketConnection یا همان ارتباط از طریق پورتها می پردازیم .
مراحل زیر را گام به گام با هم طی می کنم .
1-	در پوشه ای که دلفی را نصب کرده ایم پوشه Bin را باز نموده و فایل scktsrvr.exe را اجرا می کنیم.
به عنوان مثال مسیر پوشه دلفی در سیستم بنده عبارت است از :
C:\Program Files\Borland\Delphi7\Bin
این برنامه فقط بر روی سرور شما قرار می گیرد و در صورتی که تحت این سبک برنامه می نویسید باید آن را در Start up ویندوز اجرا کنید . Source این برنامه نیز در پوشه دلفی وجود دارد در صورت صلاحدید می توانید آن را تغییر دهید .
2-	حال دلفی را اجرا می کنیم از منوی File گزینه New و سپس Application را اجرا می کنیم 
( در این مرحله قصد ما ایجاد یک پروژه خالی ایجاد می باشد )
3-	حال از سربرگ DataSnap گزینه SocketConnection را بر روی فرم خود اضافه می کنیم .
4-	در قسمت خاصیت Address سوکت کانکشن IP سرور را وارد نمایید . شما عدد 127.0.0.1 را وارد کنید  این IP کانکت کردن کامپیوتر به خود آن کامپیوتر است چون در این مثال سرور و کلاینت ما بر روی یک سیستم قرار دارد .
البته می توانید در قسمت Host نام سرور را نیز را وارد نمایید . اما زیاد پیشنهاد نمی شود 
5-	حال در Server Name کمبوباکس فوق را باز نموده و گزینه TestServer.Test را انتخاب کنید.
با انتخاب این گزینه ServerGUID شما نیز به طور خودکار مقدار دهی می شود از تغییر آن خودداری کنید
6-	در این مثال شماره پورت 211 را تغییر ندهید در صورت تغییر باید پورت را در برنامه سوکت سرور باز کنید 
7-	حال خاصیت connected را معادل True قرار دهید .
شما به راحتی توانستید به سرور کانکت بگیرید اگر سوکت کانکشن شما True نشد در لایه سرور تنظیمات را درست انجام نداده اید یکبار دیگر بررسی کنید 
8-	 حال از سربرگ Data Access گزینه ClientDataSet را انتخاب نموده و بر روی فرم خود اضافه کنید .
9-	خاصیت Remote Server آبجکت ClientDataSet را معادل SocketConnection1 قرار دهید.
10-	حال در خاصیت Provider Name همان آبجکت ClientDataSet از کمبو باکس فوق گزینه DataSetProvider1 را انتخاب کنید .
11-	در قسمت Command Text دستور SQL خود را می نویسیم :
به عنوان مثال : Select * From Table1
12-	حال خاصیت Active آبجکت ClientDataSet1 را True قرار دهید .
اگر با پیغام خطای زیر مواجه شدید :
SQLDataSet1 : Cannot perform this operation on an open dataset
مشکل شما آن است که در لایه +Com در آبجکت SQLDataSet1 خاصیت Active آن True است خاصیت Active آن را False نموده و یک بار دیگر از منوی Run گزینه Register ActiveX Server را انتخاب کنید و از همان منوی Run گزینه Install Com+ Objects را انتخاب کرده و بر روی دکمه OK کلیک کنید . به پیغام خطای آن توجه نکنید و لایه سرور را ذخیره کنید . این عمل را رجیستر کردن لایه میانی می نامیم .
اگر در زمان Register ActiveX Server با پیغام خطای Could not create output file 'TestServer.dll' مشکل آن است که لایه +Com شما در حال اجرا است . جهت رفع اشکال مسیر زیر را طی کنید 
My Computer – Control Panel - Administrative Tools - Component Services
در پنجره Component Services گره Component Services سپس Computer سپس My Computer و به دنبال آن Com+ Application را باز کنید حال بر روی لایه +Com شما یعنی Test راست کلیک کرده و گزینه Shut down را انتخاب کنید تا لایه میانی شما از فعالیت بازایستد
اگر با پیغام خطای Command Text Changes are not allowed مواجه شدید مشکل شما آن است در Option خاصیت Allow Command Text شما False است آن را True کنید و لایه میانی را رجیستر کنید 
13-	حال از سربرگ Data Access یک عدد DataSource بر روی فرم اضافه کرده و خاصیت DataSet  آن را معادل ClientDataSet1 قرار می دهیم .
14-	از سربرگ data control یک عدد dbgrid انتخاب نموده و بر روی فرم اضافه می کنیم و خاصیت DataSource آن ر ا معادل DataSource1 قرار می دهیم .

لایه Client را با موفقیت تولید کردیم در مباحث آتی به بحثهای کاربردی و تخصصی دیگر مانند انواع اتصال به لایه میانی ، نوشتن دستورات و توابع در لایه +Com و اجرای آن در لایه کلاینت و ... می پردازیم .

موفق و پیروز باشید

----------


## حرفه ای

بررسی DCOM Connection و Web Connection 
در بحث قبلی از Socket Connection برای اتصال به لایه میانی یا همان +Com استفاده کردیم در این قسمت به بررسی دو ابزار دیگر یعنی DCOM Connection و Web Connection  می پردازیم :
جهت اتصال به لایه میانی از طریق DCOM Connection در لایه کلاینت ابتدا از سربرگ Data Snap گزینه DCOM Connection را انتخاب و به فرم خود می افزاییم 
در قسمت Computer Name نام سرور خود را وارد می نماییم . در این مثال چون سرور و کلاینت را در یک کامپیوتر تولید کردیم من عبارت LocalHost را تایپ می کنم
از قسمت  Server Name گزینه TestServer.Test را انتخاب می کنیم با انتخاب آن مقابل عبارت Server GUID نیز مقدار GUID نقش می بندد
حال خاصیت Connected را معادل True  قرار می دهیم به راحتی ما با سرور ارتباط برقرار کردیم .
DCOM Connection بر اساس نام کامپیوتر و یا اصطلاحاً Net Bios سرور را پیدا می کند به این دلیل سرعت آن عموماً کم است و گاهی اوغات به دلایل نامعلومی مشکل ساز می شود . استفاده از این کانکشن بسیار ساده است اما به شما پیشنهاد نمی گردد .
اما Web Connection بر اساس پروتکلهای اینترنت یا همان http عمل می کند خاصیت بزرگ این کانکشن امکان استفاده در اینترنت است .
برای استفاده از این کانکشن مراحل زیر را گام به گام طی می کنیم .
1-	از قسمت Control Panel گزینه Add / Remove Program را انتخاب می کنیم 
2-	گزینه add or remove windows component را کلیک می کنیم .
3-	تیک گزینه Internet information service را می زنیم ( دقت کنید تمامی گزینه های زیر مجموعه آن تیک خورده باشد خصوصاً Script virtual directory در قسمت  Word by web service تیک خورده باشد )
4-	گزینه OK و Next را کلیک می کنیم تا IIS بر روی سیستم ما نصب گردد .
5-	حال به سراغ پوشه bin دلفی خود رفته و فایل httpsrvr.dll را کپی می کنیم .
6-	در درایو ویندوز پوشه ای به نام Inetpub اضافه گردیده است پوشه فوق را باز نموده و فایل مذکور را در قسمت Scripts ، Paste می کنیم .
7-	حال به سراغ دلفی رفته و از سربرگ Data snap گزینه Web Connection را انتخاب کرده و به فرم خود اضافه می کنیم 
8-	در قسمت url آن مسیر httpsrvr.dll  را قرار می دهیم من عبارت http://localhost/scripts/httpsrvr.dll را تایپ نموده ام
9-	از قسمت  Server Name گزینه TestServer.Test را انتخاب می کنیم
10-	حال خاصیت Connected را معادل True قرار می دهیم .
البته شما می توانید از ObjectBroker هم استفاده کنید اما زمانی پیشنهاد می شود که شما چند سرور داشته باشید

----------


## حرفه ای

یک تذکر عالی از دوست خوبم جناب آقای کشاورز که ضمن تشکر صمیمانه از رهنمایی ایشان مطلب ارسالی ایشان را در این پست قرار می دهم :




> سلام،
> از مقاله ایی که در زمینه استفاده از DataSnap در سایت قرار دادید خیلی ممنون هستم. 
> اما لطفا به یک نکته کوچیک توجه کنید: عنوان مقاله شما  	"آموزش لایه میانی ( +COM ) در سبک MultiTier"  هست، در حالی که از سه نوع Connection پشتیبانی شده توسط DataSnap، فقط DComConnection کاملا از COM استفاده میکنه. SocketConnection در لایه های زیرین خودش از Indy استفاده می کنه و از COM فقط برای رجیستر کردن برخی چیزها استفاده میکنه، و WebConnection هم کاملا مستقل از COM عمل میکنه. لطفا همه اینها را تحت نام +COM معرفی نکنید.
> 
> با تشکر،
> کشاورز



و یک سوال خوب از دوست خوبم




> یه سوال دیگه در بارهء مقالهء شما :
> آیا  *تولید اولین لایه میانی مبتنی (+ Com ) ( چهارمین پست تاپیک ) برای هر پروژه برنامه نویسی چند لایه لازم است ؟
> 
> و اینکه چرا این پروژه را توی یک ActiveX Library باید ساخت؟
> 
> با تشکر
> *


دوست خوبم :قلب:  
خیر شما نیازی به تولید چندین لایه میانی برای هر پروژه ندارید بلکه می توانید تنها از یک لایه بهره ببرید و در مواقعی که برنامه شما enterprise است شما از یک لایه میانی برای چندین application جدا می توانید بهره ببرید .
در ادامه مقاله راجع به این نوع برنامه نویسی و کد نویسی در لایه میانی توضیحات بیشتری را خدمت شما عرض خواهم کرد .
و در مورد قسمت دوم محصول تولیدی لایه میانی تنها یک فایل dll با حجم بسیار کم است که برای رجیستر کردن آن در سیستم عامل می بایست آن را در داخل یک ActiveX Library  قرار دهیم .

----------

