السبت، 14 ديسمبر 2013

التخاطب بين الخوادم وطريقة توفير بيئات ملائمة للمشاريع



قاعدة بيانات  على خادم ومستخدمين موزعين على الشبكة :
نستخدم مثل هذه الحالة دائما في حال اردنا ان نكون تطبيق سطح مكتب (windows application)  لمستخدمين موزعين على شبكة يشتركون بقاعدة بيانات واحدة .بمعنى في شركة ما لدينا موضفين موزعين على مستوى العالم او بلد او على شبكة محلية واحدة يشتركون بقاعدة بيانات واحدة أي تحديث لأي موضف على قاعدة البيانات يظهر عن البقية فمثلا لدينا موضف اجازات فيوسط البلد يدخل كل اجازات الموضفين وموضف اخر في شرق البلد يحتاج ان يعرف اجازة أي موضف .فنحل هذه المسئلة بوضع قاعدة بيانات المستخدمين على خادم وكل المستخدمين  يتصلون بقاعدة البيانات هذه عن طريق Connection String الخاصة بها  .قاعدة البيانات هنا قد تكون  SqL server , oracle ونفعل بها خاصية الوصول عن بعد .

لماذا نستخدم تطبيق سطح مكتب  وقاعدة بيانات موزعة لماذا لانستخدم  تطبيق ويب  WEB application ؟
السبب هو بعض الشركات  او المؤسسات لا تريد ان يكون تطبيقاها بشكل ويب  كل شخص يستطيع الوصول اليه عن طريق متصفح الانترنت تريد فقط من لديه تطبيق الشركة  يستطيع الوصول الى بياناتها
والسبب الثاني الأهم هم في الشبكات المحلية لا يفضل استخدام تطبيقات الويب في التطبيقات الموزعة لان تتسبب تأخر في نقل البيانات بين الخادم والمستخدم تخيل تطبيق وندوز Windows ينقل عبر الشبكة فقط البيانات Data المضافة او المحدثة بينه وبين  قاعدة البيانات لان التطبيق عند المستخدم والقاعدة البيانات عند الخادم . اما في تطبيقات الويب التطبيق وقاعدة البيانات عند الخادم ففي كل طلب للخادم من قيل المستخدم  Request يرسل الخادم صفحة بشكل HTML  ويحدث عليها المستخدم ويعيد ارسال الصفحة الى الخادم لان كما نعلم لغة التخاطب بيننا وبين الخوادم هي HTML



قاعدة بيانات  وتطبيق ويب على خادم وخادم احتياطي  ومستخدمين موزعين على الشبكة :
نستخدم مثل هذه الحالة دائما في حال اردنا ان تكون لنا دائمة نسخة احتياطية من البيانات التي على الخادم بشكل دائم وتلقائي يعني أي مستخدم يحدث على الخادم ينتقل نسخة من تحديثة على الخادم الأحتياطي تلقائيا بدون أي كود فيحتوي الخادم الاحتياطي نسخة مطابقة لبيانات الخادم المستخدم ففي حالة أي عطل في الخادم ينقل المستخدمون  الذبن بعملون على الخادم الأساسي الى الخادم الاحتياطي ويجدون كل بياناتهم مطابقة ولا يوجد أي بيانات مفقودة  . تتم هذه العملية عن طريق  Sql server Agent من خلال اعدادات  الخوادم نجعل خادم النسخة الاحتياطية  Agent للخادم الأول ونعمل  Replication بين الخوادم .اذن العملية كلها مجرد ضبط اعدادات الخادمين من خلال  Sql server لكل خادم لاتوجد أي برمجة .




مخاطبة بين الخوادم :
نستخدم مثل هذه الحالة  في اردنا عمل مخاطة بين خادم واخر مثلا شركة ياهو Yahoo توفر خادم يخص الطقس  فليس الحاجة ان اردنا ان نكون مشروع يحتاج الى الطقس الحالي في حساباته ان نبرمج  وضع اجهزة حساب الطقس نستطيع استخدام الخادم الخاص بشركة ياهو   Yahoo  اذن هي مخاطبة بين خادمنا وخادم شركة ياهو Yahoo . وكذالك لو صممنا قاعدة بيانات تابعة لمؤسسة ما ومؤسسة اخرى ارادة وصول جزئي للبيانات الخاصة بألمؤسسة الأولى على سبيك المثال في المؤسسة الأول يدخلون معلومات مواطنين وموضفين في قاعدة بياناتهم والمؤسسة الثانية تحتاج فقط الى بيانات الموضفين المدخلة بشكل دائم اذن هنا ايضا مخاطبة بين خادمين .للعلم البيانات تنتقل بين الخوادم بشكل  XML لذالك يجب مراعاته الامر في برمجة  Class
 لحل هذه المشكلة نستخدم Web Service لعمل هذه الخاطبة ففي حالة الطقس شركة ياهو  Yahoo توفر هذه Web Service فقط نحن نستدعيها ونستخدمها وفي الحالة الثانية المؤسسة الأولى تستدعي Web Service وهذه Web Service تضيف في قاعدة البيانات المؤسسة الثانية . ممكن ان نضع Web Service على خادم رقم (2) او على خادم اخر .

استخدام  Web Service

نفتح مشروع جديد من نوع Web ونضيف له  Web service




بعد ان نفتح Web service  سوف يضهر لنا الشكل كما في الأسف للعلم Web service   هو  مشروع حاله حال أي مشروع نستطيع اضافة Class لها ودوال و أي امر نحتاجه .ففي صفحة Web service نستطيع ان نكون Web service من خلال كتابة Web Method ونكتب الخدمة Web service بشكل دالة Function ,Sub حسب ستخدامنا لها


هنا هوا ضاف Web service بأسم  HelloWord وتعيد رسالة نصية الان نقوم بأستدعاء هذه Web service

الان لأستخدام هذه الخدمة Web service في أي مشروع من داخل المشروع نختار Add ومنه نختار Refrence Add Web
ومن  Address نختار عنوان الخادم واسم صفحة الخدمة على الخادم كما في الشكل ستضهر لنا كل الخدمات الموجودة ضمن هذه Web service . ونعطي اسم للخدمة داخل المشروع Web refrence name وبعده نختار Add Refrence ستضاف الخدمة الى المشروع

هذه شكل الخدمة بعد اضافتها للمشروع
نستدعي الدالة HellWord في الخدمة بشكل التالي سوف يعرض لنا رسالة ترحيبة الموجودة في الخدمة

Dim serviceNew As New localhost.WebService1
        MsgBox(serviceNew.HelloWorld())



لكي  نقوم برفع web service على خادم ,نقوم بالتالي نشتري عنوان عام    Public  IP  وليكن (169.254.243.53) بحاسبتنا ونفتح IIS Manager ونختار Add web  ونضيف مشروع Web service اليه بالشكل التالي . نختار  مكان خزن المشروع الخاص بنا ونحدد له منفذ خاص به وليكن (80) ونختار العنوان العام Public  IP الخاص به ونعمل اضافة




اي عنوان الخدمة على الانترنت بشكل التالي (169.254.243.53:80)
الان لكي نضيف هذه web service  الى اي مشروع خاص  بنا نختار Add web refrence و   فقط التغير في URL نكتبه بشكل التالي
URL:  http:\169.254.243.53:80\webservice1.asmx


 



الأربعاء، 20 نوفمبر 2013

ما هي ملفات ذات امتداد XSD وكيف يستفاد منها

ماهي ملفات XSD ؟
هي ملفات تساعدنا في استعراض التقارير او ارسال واستلام بيانات من  والى  Stored procedure الموجودة بداخل قاعدة البيانات بطريقة سهلة وواضحة  .
اي التقرير في بيئة الفجوال ستوديو لا يمكن استخدامه عن طريق الاتصال المنفصل او عن طريق الكود بصورة عامة لأنه يحتاج الى ملف ذو امتداد .XSD يحدد  له الحقول التي سيعرض بها البيانات التي نملئها من قاعدة البيانات  . اي تكون العملية بشكل التالي
اي البيانات تأتي من قاعدة البيانات الى ملف XSD الذي نحن نحمله بالبيانات ومنه تعرض داخل التقرير هذه البيانات  والتقرير يعرض داخل مستعرض تقارير  Report Viewer  او تستخدم مباشرة من بدون تقارير

لأدراج ملف .XSD من داخل المشروع نختار اضافة كائن جديد ومن قائمة Data نختار DataSet



شكل الملف بعد ادراجه داخل المشروع يعرض لنا في ToolBox اداوات جديدة نستخدمها في هذه الملفات وسوف نشرحها بلتفصيل




كما نعلم التقرير يحتاج لأعمدة تعرض فيه اي حقول لذالك ندرج DataTable لتكوين اعمدة  المطلوبة للتقرير ونوع كل عمود  يحدد من خصائصه وكذالك بقية الخصائص الخاص بكل عمود او حقل. 

وكيف نملئى هذه الاعمدة بالبيانات  ؟
نملئها عن طريق TableAdapter ايضا ندرجه في اسفل  DataTable الذي كوناه لكي ننفذ عمليات على TableAdapter  وهو يملئ  الجدول  DataTable بالبيانات  .




وهذا  Query الموجودة داخل TableAdapter نكونها عن طريق سحب  Query من Toolbox وبعد سحب والقائه على  TableAdapter سيعرض لنا الشاشة التالية


توجد به ثلاث خيارات
1.     Use SQL statements هنا نحن نكتب جملة SQL ونحدد البيانات التي نريدها ان تعرض وكيف
2.     Create new stored procedures هنا ننشئ بروسيجر جديدة ونضيفه في قاعدة البيانات
3.     Use existing stored procedures  هنا نستخدم مباشرة بروسيجر موجودة في قاعدة البيانات

في حال اخترنا الخيار الأول ستضهر لنا هذه الشاشة ونكتب به Sql  التي نود ان تنفذ


في هذا SQL جعلنا يبحث عن اسم معين

توضيح محتويات الصفحة .... 

Query Builder : هي لتنفيذ جملة Sql والتاكد من صحتها
Advanced Options : هي تحديد امكانية اضافة وحذف وتعديل مباشرة على الجدول اي يضيف Query الخاص بلحذف والتعديل  مباشرة. وهذه الخاصية ل اتفعل اذا اذا كان احد حقول الجدول يحتوي على مفتاح رئيسي تستطيع اضافته


بعد اكمال العمل نضغط next  ستضهر هذه الشاشة

يوجد به اسمين للبروسيجر او الفاكشن  التي كتبناها وكيف سيتم استدعاها
1.     Fill A DataTable هي اسم الدالة التي نريد استدعائها عن ملئى حقول الجدول DataTabel بالبيانات
2.     Return a DataTabel هي اسم الدالة  SelectMethod التي سنستدعيها في التقارير لتمرير البيانات لها

بعد اضافة  query وتفعيل الاضافة والحذف والتعديل تلقائيا تكتب عبارة Sql  الخاصة بكل من الاضافة والحذف والتعديل والاختيار الخاصة بالجدول
بشكل اجرائات (insert,delete,update, select) نستطيع استدعائها وتمرير البرامترات لها . ونستطيع تغيرها  ومعرفتها بضغط  tableAdapter الخاص بجدول والتحكم بالخصائص







العلاقات بين الجداول Relation تستخدم لعمل علاقة بين اكثر من جدول لجلب بيانات من اكثر من جدول الى تقرير او الى المشروع للتعامل معها وهي عملية معروفة جدول رئيسي وثانوي ومفتاح رئيسي وثانوي يربط الجدولين


هناك طريقة مباشرة لتكوين Data table  و TableAdapter مباشرة بدون تصميم حقل حقل وهو عن طريق الاتصال ببروسيجر موجود بقاعدة البيانات فيه كل مدخلات ومخرجات التقرير فقط نسحب TableAdapter وندرجه ونختار

Use existing stored procdures   ونختار البروسيجر من قاعدة البيانات وهو تلقائيا سيكون لنا الجدول الخاص به بكل سهولة وكذالك Query الخاصة به


كيف نستدعي الدوال الموجودة داخل ملفات XSD من البرنامج  ؟

لعمل نسخة من جدول معين نكون كائن جديد  من Dataset.xsd وبعدها اسم الجدول المطلوب  نكتب التالي
VB.net Code
Dim dsCopy As New DataSet1.AdminsManageDataTable


C# Code
DataSet1.AdminsManageDataTable dsCopy = new DataSet1.AdminsManageDataTable();




لتنفيد  Query موجودة ضمن TableAdapter  نكون كائن جديد من ذالك TableAdapter ونستدعي اي دالة موجودة ضمنه ونرسل لها الجدول المراد ملئه بالبيانات الذي كوناه قبل قليل  والبرامترات الخاصة بالجدول
VB.net Code
Dim TabelAdapb As New DataSet1TableAdapters.AdminsManageTableAdapter
   TabelAdapb.Fill(dsCopy, "h%")  



C# Code
DataSet1TableAdapters.AdminsManageTableAdapter TabelAdapb = new DataSet1TableAdapters.AdminsManageTableAdapter();
TabelAdapb.Fill(dsCopy, "h");



الأن لكي نعرض هذه البيانات داخل   GridView1 ويكون الكود كامل
VB.net Code
Dim dsCopy As New DataSet1.AdminsManageDataTable
Dim TabelAdapb As New DataSet1TableAdapters.AdminsManageTableAdapter
TabelAdapb.Fill(dsCopy, "h")
GridView1.DataSource = dsCopy


C# Code
DataSet1.AdminsManageDataTable dsCopy = new DataSet1.AdminsManageDataTable();
DataSet1TableAdapters.AdminsManageTableAdapter TabelAdapb = new DataSet1TableAdapters.AdminsManageTableAdapter();
TabelAdapb.Fill(dsCopy, "h");



وفي التقارير تستدعى بشكل التالي نرسل اسم الدالة والبرامترات هنا اتحدث عن ASP.net تقارير اما تقاير تطبيقات الوندوز يكون نفس الطريقة السابقة
VB.net Code
  ObjectDataSource1.SelectMethod = "GetData"
            ObjectDataSource1.SelectParameters.Clear()
            ObjectDataSource1.SelectParameters.Add("AdminFullName", DbType.String)
            ObjectDataSource1.SelectParameters("AdminFullName").DefaultValue = "h"
  Me.ReportViewer1.LocalReport.Refresh()



C# Code
ObjectDataSource1.SelectMethod = "GetData";
ObjectDataSource1.SelectParameters.Clear();
ObjectDataSource1.SelectParameters.Add("AdminFullName", DbType.String);
ObjectDataSource1.SelectParameters("AdminFullName").DefaultValue = "h";
this.ReportViewer1.LocalReport.Refresh();



الان لنعود الى صفحة تسمية الدالة عند الاستدعاء
1.     Fill a DataTable  كان اسمها fill  وهو ما فعلنا في استعائها كدالة في ملئ grid View
2.     Return a DataTabel  كان اسمها GetData واستدعينها في التقرير
الان عرفنا الفرق في استخدام هذين الاسمين