الكل يعرف أهمية خدمة الويب Webservice ولكن لم استطع ان أعمل طريقة method ترجع لي DataTable فقط تمكنت من ارجاع DataSet فهل أحد من المبدعين بهذا الموقع لديه الحل او رابط اجنبي للحل وشكرا للجميع.
خدمة الويب Webservice
أخي فراس ارغب في موقع محدد ومميز كتميزك وهذا الموقع يرجع DataTable لا يهم أن كان Webservice او Remoting
تم تعديل هذه المشاركة بواسطة r122 في 25 ديسمبر 2003 في 18:23
من غير الممكن اعادة DataTable فهي غير مدعومة في خدمة الويب. عليك اعادتها ضمن DataSet
وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان
بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي
يا زمان يا عشب داشر فوق هالحيطان ضويت ورد الليل عكتابي
برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي
يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو
http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3
DotNetExpert،
طالما أن DataTable تدعم الـinterface ISerializable يمكنك أن ترجعها من webservice دون أدنى مشكلة حسب اعتقادي، نفس الكلام ينطبق طبعا على الـDataset وكقاعدة عامة، أي class يطبق ISerializable يمكنك استخدامه بدون مشاكل.. وان حدثت أي مشكلة (لم يتم نقل البيانات بصورة صحيحة) فهذا يدل على أن هناك خطأ ما في تطبيق الـinterface المذكور، وعليه ستضطر لعمل class أخرى موروثة من الـclass المنكوبة، وستضطر اسفا لتطبيق الـISerializable وهو أمر غاية في البساطة والتعقيد في ان واحد.
صحيح أن DataTable تدعم ISerializable لكن الأمر في خدمة الويب متخلف بعض الشي.
أن DataSet هو ال كائن الوحيد م الذي تستطيع اعادة عن طريق خدمة من الويب من جمع الكائنات التي تخزن البيانات. وتستطيع ان تجرب ذلك بنفسك.
لقد سبب هذا الشي الكثير من المشاكل بل والاحباط للمبرمجين , ولقد بحثت كثيرا عن تعليل للموضوع الا انني لم اجد شيئا موثقا. إنني *أعتقد* اعرف السبب لكنه مجرد اعتقاد من الممكن ان يكون صحيحا ومن الممكن ان يكون خاطئا .
السبب برايي هو كالتالي
ان السمة المميزة لخدمة الويب هي استقلالها عن منصة التشغيل اي ان المفروض هو انك عندما تعيد DataTable يجي على اي زبون لخدمك يعمل على اي منصة ان يستطيع فهم البيانات المعادة على شكل نص . ذلك يتم ايضا عن طريق XML Schema المسماة WSDL (وهي من اختراع مايكرسوفت و IBM وهي مدعومة من قبل w3 )
دوت نت يقوم بتوليد هذه الشيفرة تلقائيا من اجل خدمة الويب تستطيع مثلا تجريب
myWebservice.asmx?WSDL
DataSet كائن غريب بعض الشي فبينتيه يتمكن ان تتنوع بشكل كبير من عدد الجدوال وبنيه كل منها والعلاقات بين الجداول الى ما هنالك. أي انه من غير الممكن تحديد البنية لها عن طريق WSDL مسبقا , فما الحل اذا ؟
الحل لها بنقسم الى قسمين
أولا في حالة Typed DataSet فان هذه على الرغم من انها تنحدر من ال DataSet (في أغلب الأحيان على الأقل !) الا انها تختلف عنها بان لها بنية ثابتة لا تتغير (بالطبع ان عدد الصفوف لا يدخل ضمن هذه الثوابت) ولذلك فلا مشكلة بتشكيل ملف ال WSDL لها. ( في الحقيقة ان visual studio وبشكل افتراضي سواءا اكان ذلك ضمن خدمة ويب او لا يقوم بتمثيل ال Typed DataSet على شكل Xml ضمن ملف XSD تجده ضمن ملفات مشروعك )
أما في حالة DataSet العادية فان الحل هو اقرب منه للخدعة.
كما ذكرت سابقا فانه من المفترض أنو تعيد WSDL بنية البيانات التي تعيدها خدمة الويب. أما في حالة DataSet فانك لن تجد اي تعريف لبينة هذه البينات. كل ما ستجده هو السطر التالي (بالطبع لا أقصد أن وثيقة WSDL ستكون سطرا واحدا, انما أقصد أن هذا السطر يقوم مقام البنية التي يتوجب على WSDL اعادتها من اجل تحديد النوع المعاد)
<s:element ref="s:schema" />
أن هذا السطر يخبر الزبون أن بنية البيانات سوف تعاد مع البيانات نفسها .
وبالفعل فان وثيقة ال Xml التي تعيدها خدمة الويب سو تتالف من قسمين القسم الأول يبدا بالشكل التالي
<xsd:schema .......>
من الواضح أن هذا الجزء هو وثيقة xsd مشابهة للملف الذي يولده Visual basic
والقسم الثاني من وثيقة xml التي تعيدها خدمة الويب هو البيانات الفعلية
اما في حالة DataTable فالمشكلة (برايي ) هي أن ال DataTable وجميع الكائنات المشابهة عدا ال DataSet لا توفر طريقة للحصول على بنيتها Schema على شكل Xml بشكل منفصل عن DataSet ولذلك لا يتم دعمها في خدمة الويب
كما قلت سابقا ان هذا هو رايي الشخصي والذي - مع اقتناعي به - لا اضمن ابدا ان يكون صحيحا
وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان
بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي
يا زمان يا عشب داشر فوق هالحيطان ضويت ورد الليل عكتابي
برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي
يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو
http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3
أولا اسف، لأنني وقعت في خطأ، وجيد أنك صححته لي..
اتضح لي بالفعل أن كلامك صحيح بالنسبة للـDatatable..
السبب هو يبدولي بالفعل كما ذكرت، ولكن ربما لدي صياغة أخرى وهي أنه وكما يبدو أن الـwebservices تستخدم XmlSerializer أي أن الـDatatable يجب أن تدعم IXmlSerializer حتى يمكن لأي خدمة ويب أن تتلقفها.. وبما أن Dataset تدعم IXmlSerializer فلا مشكلة معها..
أنا في الحقيقة لم أعثر على أي معلومة موثقة تؤكد ذلك، ولكن معلوماتي السابقة كانت أن الـwebservices تستخدم طريقة الـserialization المعتادة وتقوم بالتحويل لـXML وهو أمر أتصور أنه في غاية البساطة..
ولكن أعود وأقول أنه ربما كان هناك خطأ ما في عملية serialization datatable ولكن حتى أتأكد يجب أن أقوم بعمل تجربة وأشاهد كود الـildasm..
(y)
هذا الموضوع مغلق.