Data Source=PC100-042295F4E;Initial Catalog=client;Integrated Security=SSPI;
ومن الافضل استخدام IP السيرفر كالتالي :
Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog=client;
Data Source=PC100-042295F4E;Initial Catalog=client;Integrated Security=SSPI;
ومن الافضل استخدام IP السيرفر كالتالي :
Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog=client;
omran555 كتب:عزيزي cdcase *-)السلام عليكم
بعد إذن استاذي ياسر الشيخ
إن جهاز السيرفر يتم فتحه من قبل السوبر فايزر المكلف به والذي يتطلب منه كلمة السر واسم المشغل أما الأجهزة المترابطة معه فبمجرد فتح جهازك والدخول باسم المشغل الخاص بك وكلمة السر فان ذلك يسمحلك بالدخول إلى الأجهزة المترابطة مع الخادم ورؤية الملفات والمجلدات التي لها خاصية الشير وبالتالي فإن الاتصال بقاعدة البيانات لا يحتاج إلا إلى كلمة السر الخاصة بقاعدة البيانات فقط حتى يمكنك الولوج إليها والتعامل مع سجلاتها هذا طبعا ما أظنه واعلمه والله أعلم منا جميعا وخير دليل للتأكد من ذلك التجربة التي لن تكلفك شئيا سوى بعض الوقت والجهد وأرجو من الله ان تنجح
مرحبا
أشكرك يا أخى على ردك
فعلا كلامك صحيح ولكن فى حالة الدومين فقط
ولكنى أبحث لها عن كود برمجى وخاصة ان قاعدة البيانات على وورك جروب
عموما ده حل مؤقت انا ممشي بيه نفسي الى ان اصل الى الكود البرمجى
ولك منى افضل تحياتى
السلام عليكم
قال رسول الله صلى الله عليه وسلم
يكبر بن أدام ويكبر معه شيئان كثرة المال وطول العمر
صدق رسول الله صلى الله عليه وسلم
قال عمر بن الخطاب رضي الله عنه
نحن قوم أعزنا الله بالإسلام فإذا إبتغينا العزة فى غيره أذلنا الله
جزاكم الله خيراً يا Ahmedd ,abetry وبارك الله فيكم . .... تم بنجاح
بسم الله الرحمن الرحيم
وبه أبدا وأستعين ، وأختم بالصلاة والسلام على خاتم الأنبياء والمرسلين نبينا محمد وعلى آله وصحبه أجمعين ، أما بعد ..
أحب أن أعتذر للجميع على التأخير الذي حصل ، علماً أنه خارج عن إرادتي ، لذلك أرجو التحلي بالصبر ...
* الاتصال المنفصل ( Connectionless Oriented ) :
يعد الوضع المنفصل هو الأمثل للتعامل مع قواعد البيانات ، وذلك نظراً للإمكانات والكائنات المتنوعة التي تمكن المستخدم من أخذ نسخة من الجداول المخزنة في قاعدة البيانات ، وقراءة البيانات المخزنة فيها ، وتعديلها و عرضها وتصفيتها ومعالجتها أو إنشاء علاقات فيما بينها ، وذلك لفترات طويلة ، دون أن تستهلك الكثير من موارد النظام ، ويترتب على ذلك عمل التطبيقات بكفاءة عاليه . ولأن معظم مصادر البيانات تدعم عدداً محدوداً من الاتصالات المفتوحة ، فإن الوضع المنفصل استطاع أن يتجاوز هذه المشكلة ، لاسيّما حين نستخدم تطبيقات متصلة بقواعد البيانات عبر شبكة الإنترنت ...
وتتلخص فكرته في أن نقوم بإجراء اتصال بقاعدة البيانات ، وذلك بواسطة كائن الاتصال Connection كما ذكرنا في الدروس السابقة ، وبعد قبول الاتصال نقوم بأخذ نسخة من البيانات المخزنة في مصدر البيانات "Data Sources" ( مصدر البيانات هنا هو ملف قاعدة البيانات بالنسبة لـ Microsoft Office Access أو السيرفر بالنسبة لـ SQL Server ) ، ثم نقوم بتخزينها في الذاكرة ، وذلك من خلال كائن يكون بمثابة مستودع للبيانات ويسمى DataSet ( مجموعة البيانات ) ، ولكي تتم هذه العملية يحتاج هذا الكائن إلى كائن أخر يسمى DataAdapter ( موفّق البيانات ) يكون بمثابة وسيط بين مجموعة البيانات "DataSet " ومصادر البيانات "Data Sources" ، حيث يقوم DataAdapter بعملية فتح الاتصال بقاعدة البيانات و استيراد وتصدير البيانات من و إلى مصدرها الأساسي ، وبعد تخزين البيانات في DataSet ، فإنها تصبح منفصلة عن مصدر البيانات ، لان الكائن DataAdapter يقوم بشكل تلقائي أيضاً بقطع الاتصال بقاعدة البيانات ، وهذا الانفصال والاستقلال هو السبب في تسمية هذه الطريقة بالاتصال المنفصل أو الوضع المنفصل ، وهو السر في تفوقه على الوضع المتصل ، لأنه يتغلب على جمع عيوبه ومشاكله .
ومن ذلك نستطيع أن نقول أن الكائنات الأساسية في الوضع المنفصل هي : Connection ، DataSet ، DataAdapter .
وهناك أيضاً كائنات أخرى ليست فرعية ولكنها خدمية إن صح التعبير ،على سبيل المثال " DataTable ، DataRow ، DataColumn ، DataRelation ، OleDbCommandBuilder ، BindingManagerBase ، CurrencyManager ، BindingSource " ،
ويأتي دورها في الغالب بعد وصول البيانات ( الجداول ) القادمة من مصادر البيانات إلى DataSet ( مجموعة البيانات ) . وسنُناقش بعضها ( أو كلها إذا وجدنا الوقت الكافي لذلك ) وما يهمنا منها بإيجاز غير مخل إن شاء الله ..
ملاحظة : لسنا مجبرين على استخدام كل الأدوات والخصائص التي سوف ترد في الشرح ، ولكن ما يلزمنا منها فقط ، وسوف تتضح لنا الكثير من الأمور حين نصل إلى الجزء العملي من الدرس .
- - - - - - - - - - - - - - - - - - - - - - -
1 - الكائن Connection :-
لقد تحدثنا عنه في الدروس السابقة بما فيه الكفاية .
2 – DataSet :-
يمكن تعرف مجموعة البيانات Dataset بأنها مستودع أو ذاكرة وسيطة لتخزين البيانات التي تم إحضارها من مصادر البيانات ، ويريد أن يستعملها التطبيق .
من كان قد برمج قواعد البيانات باستخدام الإصدار السابق من ADO في VisualBasic6 فهو يعرف تماماً الكائن Recordset حيث يعتبر نقطة التفاعل الرئيسية لبرنامج ما مع قاعدة البيانات ، ويعالج هذا الكائن السجلات في جدول واحد أو السجلات المختارة بواسطة استفسار ( جملة استعلام بنيوية ) واحد . بينما نجد أن الكائن DataSet في الإصدار الجديد من ADO.NET يمكنه تمثيل النتائج المتولدة عن عدة جداول و تتبع العلاقات بين هذه الجداول ، أو تمثيل النتائج المتولدة عن استفسارات عديدة . وبذلك نستطيع أن نقول أنه إذا كان Recordset يشكل جدول قاعدة بيانات ، فإن DataSet يشكل قاعدة بيانات كاملة تجلس في الذاكرة . ولعل ما في هذه النبذة ، ما يعطي القارئ تصور عام عن الكائن DataSet ، و يزيل الجدل حول Recordset و DataSet وأيهما أفضل .
وألان سون نتطرق لبعض خصائص DataSet :
* الخاصية Clear :
تزيل هذه الخاصية كل البيانات من جميع جداول DataSet ، بينما تبقي تعريفات الجداول وأي تقييدات معرفه من قبل DataSet ...
MyDs.Clear
فإذا أردنا إزالة الجداول والتقييدات ، نقوم بإعادة إنشاء DataSet كما في الكود التالي ..
MyDs = New DataSet
الخاصية HasChanges :
إن DataSet يتتبع فيما إذا كان هناك أي تغييرات قد أجريت على بياناته ، ويمكن استدعاؤها بكل بساطه من خلال الكود التالي ..
MyDs.HasChanges
وتعيد هذه الخاصية القيمة true إذا كانت البيانات قد حدثت إما لتغيير أو إضافة أو حذف ، فإذا حمل برنامج ما بشكل أولي بيانات إلى DataSet ، فإن البيانات لم تغيّر بعد وستعيد هذه الخاصية عندئذ القيمة False وعندما يُحَدِّث المستخدم أي بيانات للجداول فإن هذه الخاصية سوف تعيد القيمة true . وإذا قام المستخدم بحفظ بياناته المحدثة ، فإنها تعيد القيمة False من جديد ..
فلنتأمل هذا الكود ..
If MyDS.HasChanges = True Then ' نقوم بكتابة أي إجراء في حالة إذا كان هناك أي تغييرات قد أجريت على الـ DataSet . Else ' نقوم بكتابة أي إجراء في حالة إذا لم يكن هناك أي تغييرات قد أجريت على الـ DataSet . End If
ويمكن أن تأخذ هذه الخاصية وسيط اختياري يسمى DataRowState ، يشير إلى نوع التغييرات التي قد حدثت ، حيث يمكن استخدام هذه الطريقة لرؤية فيما إذا كانت هناك سجلات قد أضيفت ، أو عدلت ، أو حذفت ، أو لم يقع عليها أي تغيير ، وذلك من خلال القيم التي يحملها هذا الوسيط وهي على النحو التالي ..
- Added : ويشير إلى الصفوف التي أضيفت إلى الـ DataSet .
- Deleted : ويشير إلى الصفوف التي قد حذفت من الـ DataSet .
- Modified : ويشير إلى الصفوف التي قد غيرت قيم بياناتها من الـ DataSet .
- Unchanged : ويشير إلى أن الصفوف لم تتغير من الـ DataSet .
ولكي يتضح الشرح نتأمل هذا الكود ...
If MyDataSet.HasChanges(DataRowState.Added) Then ' نقوم بكتابة أي إجراء في حالة إذا كان هناك صفوف جديدة قد أضيفت. ElseIf MyDataSet.HasChanges(DataRowState.Deleted) Then ' نقوم بكتابة أي إجراء في حالة إذا كان هناك صفوف قد حذفت . ElseIf MyDataSet.HasChanges(DataRowState.Modified) Then ' نقوم بكتابة أي إجراء في حالة إذا كان هناك صفوف قد تغيرت قيمها ElseIf MyDataSet.HasChanges(DataRowState.Unchanged) Then ' نقوم بكتابة أي إجراء في حالة إذا لم يحدث أي تغيير على الصفوف . End If
الخاصية AcceptChanges :
تقوم هذه الخاصية بإعادة وضع الـ DataSet الذي تم التعديل لبياناته ، ليشير إلى أن البيانات لم تعدل . جاعلاً الاستدعاءات المستقبلية للخاصية HasChanges تعيد القيمة False . إنه من الهام جداً إدراك أن AcceptChanges لا تقوم بالواقع بتحديث قاعدة البيانات ، إنها فقط تعيد وضع الـ DataSet المعدل . وبشكل نموذجي فإن أي برنامج سيقوم بتخزين أية تغييرات إلى قاعدة البيانات ، ومن ثم يستدعي AcceptChanges بعد ذلك مباشرة .
' كود تصدير البيانات المحدثة من مجموعة البيانات إلى مصدر البيانات باستخدام موفّق البيانات MyDs.AcceptChanges
الخاصية RejectChanges :
تقوم هذه الخاصية بإلغاء أية تغييرات قد أجريت على البيانات في الـ DataSet منذ تحميلها ، أو منذ أخر استدعاء لها ، بمعنى أنها تلغي أية أسطر مضافة حديثاً ، وتستعيد أسطراً حذفت أيضاً حديثاً ، وتعيد وضع الأسطر المعدلة إلى قيمتها السابقة ، كما أنها تقوم بإعادة وضع الـ DataSet الذي تم التعديل لبياناته ، ليشير إلى أن البيانات لم تعدل . جاعلاً الاستدعاءات المستقبلية للخاصية HasChanges تعيد القيمة False .
MyDs.RejectChanges
ملاحظة :
تقوم الخاصية AcceptChanges بإزالة المعلومات حول الحالة السابقة للبيانات ، وبالتالي لا يمكن استخدام RejectChanges لاستعادة آخر قيم للبيانات ، هذا يعني أن RejectChanges سيؤدي إلى استعادة البيانات بالحالة التي كانت عليها بعد آخر استدعاء للخاصية AcceptChanges .
الخاصية GetChanges :
تساعدنا هذه الخاصية في إنشاء كائن DataSet جديد بنفس بنية الكائن الأصلي ، ولكنه يحتوي فقط على سجلات تمثل التغييرات التي حدثت للبيانات ، وله أيضاً وسيط إختياري DataRowState ( الذي تحدثنا عنه في الخاصية HasChanges ) يخبر GetChanges فيما إذا يتوجب عليها إحضار السجلات التي أضيفت أو عدلت أو حذفت أو تركت دون تغيير . وبالإمكان جمع قيم DataRowState لاختيار أكثر من نوع واحد من التغييرات التي حدثت للبيانات داخل الكائن DataSet .
ولها استخدامات كثيرة منها :
1- قلنا سابقاً ، نحن في الوضع المنفصل نستخدم الكائن DataAdapter لإعادة تخزين التغييرات الموجودة في DataSet إلى مصدر قاعدة البيانات . وذلك يتم من خلال الخاصية Update التابعة للكائن DataAdapter الذي سوف نتحدث عنه فيما بعد ، ما يهمنا هنا هو أن هذه الخاصية تبحث خلال DataSet عن تغييرات وتخزنها واحداً تلو الآخر . ويكون تخزين التغييرات أسرع إذا جُمعت في مجموعات حسب نوعها ، وبكلمات أخرى فإن الخاصية Update ستعطي إنجازاً أفضل ، إذا حفظت كل التعديلات أولاً ، ثم بعد ذلك كل الإضافات وأخيراً كل المحذوفات .
2- أحياناً يحتاج برنامج ما تخزين تغييرات في ترتيب معين ، ليفي بمتطلبات التقييدات العلائقية لجداول قاعدة البيانات .
ولكي نفهم طريقة هذه الخاصية ، فلنتابع سوياً هذه الأمثلة ..
مثال 1 : ( إخبار المستخدم عن عدد السجلات الجديدة )
في هذا المثال نقوم بالتصريح عن كائن DataSet جديد ، ثم نختبر فيما إذا كان الكائن الأصلي يحتوي على أي تغييرات عليه ، وفي حالة وجود أي تغيير نستخدم الخاصية GetChanges لتأهيل الكائن الجديد بنفس بنية الكائن الأصلي ، ويحتوي فقط على السجلات التي أضيفت ، وقبل أن نخبر المستخدم عن عدد السجلات الجديدة نختبر الكائن الجديد لنتأكد من احتوائه على بيانات ، وفي حالة وجود بيانات نخبر المستخدم بذلك ..
Dim ds_added As New DataSet If MyDS.HasChanges Then ds_added = MyDS.GetChanges(DataRowState.Added) If (Not (ds_added) Is Nothing) Then MsgBox(ds_added.Tables(0).Rows.Count & " Records Added ") End If End If
ويمكن قياس هذا المثال على باقي القيم (Deleted ، Modified ، Unchanged )
مثال 2 : (جمع قيم DataRowState لاختيار أكثر من نوع واحد من التغييرات التي حدثت للبيانات داخل الكائن DataSet )
في هذا المثال نقوم بالتصريح عن كائن DataSet جديد ، ثم نختبر فيما إذا كان الكائن الأصلي يحتوي على أي تغييرات عليه ، وفي حالة وجود أي تغيير نستخدم الخاصية GetChanges لتأهيل الكائن الجديد بنفس بنية الكائن الأصلي ، ويحتوي فقط على السجلات التي أضيفت أو حذفت ، وقبل أن نخبر المستخدم عن عدد السجلات الجديدة أو المحذوفة ، نختبر الكائن الجديد لنتأكد من احتوائه على بيانات ، وفي حالة وجود بيانات نخبر المستخدم بذلك ..
Dim ds_AddedOrDeleted As New DataSet If MyDS.HasChanges Then ds_AddedOrDeleted = MyDS.GetChanges(DataRowState.Added Or DataRowState.Deleted) If (Not (ds_AddedOrDeleted) Is Nothing) Then MsgBox(ds_AddedOrDeleted.Tables(0).Rows.Count & " Records Added or Deleted ") End If End If
مثال 3 : ( تحديث التغييرات حسب نوعها ، لتخزين البيانات بشكل أسرع )
ملاحظة : نرجو التركيز على الجزء الخاص بـ GetChanges حتى تتضح الصورة الكاملة في أذهاننا من خلا متابعة باقي الدروس ، بعدها يمكننا فهم باقي تفاصيل الكود الغامضة في هذا الوقت .
في هذا المثال نقوم بالتصريح عن كائنين DataSet جديدين ، وكائن أخر يسمى باني الأوامر CommandBuilder .
ملاحظة : الكائن CommandBuilder يقوم ببناء الأوامر الخاصة بتحديث البيانات من تعديل وإضافة وحذف ، والتي يحتاجها الكائن DataAdapter في عملية التحديث .
وخلال ذلك التصريح نقوم بربط كائن CommandBuilder بـالكائن DataAdapter ، ثم نقوم بإيقاف التحديث للبيانات الموجودة في الـ DataSet وقبول التحديثات الحالية من أجل حفظها ونقلها من الـ DataSet إلى مصدر البيانات ، ثم نختبر فيما إذا كان الكائن Dataset الأصلي يحتوي على أي تغييرات عليه ، وفي حالة وجود أي تغيير نستخدم الخاصية GetChanges لتأهيل الكائن الجديد ds_Changes بنفس بنية الكائن الأصلي ، و نستخدم أيضاً الخاصية GetChanges لتأهيل الكائن الجديد ds_subset بنفس بنية الكائن ds_Changes ، وجعله يحتوي فقط على السجلات التي عدلت ، وقبل حفظ البيانات ونقلها من الـ DataSet إلى مصدر البيانات باستخدام الخاصية Update التابعة للكائن MyDataAdapter ، نختبر الكائن الجديد ds_subset لنتأكد من احتوائه على بيانات ، وفي حالة وجود بيانات نقوم بعملية النقل . ثم نكرر الجزء الأخير من الشرح بالنسبة لكل من الإضافة والحذف ، وفي الأخير نستدعي الخاصية AcceptChanges لإعادة وضع الـ DataSet الذي تم التعديل لبياناته ، جاعلاً الاستدعاءات المستقبلية للخاصية HasChanges تعيد القيمة False..
Dim ds_Changes As New DataSet Dim ds_subset As New DataSet Dim MyCB As New OleDbCommandBuilder(MyDataAdapter) Me.BindingContext(MyDS, "Information").EndCurrentEdit() If MyDS.HasChanges Then ds_Changes = MyDS.GetChanges ds_subset = ds_Changes.GetChanges(DataRowState.Modified) If (Not (ds_subset) Is Nothing) Then MyDataAdapter.Update(ds_subset.Tables(0)) ds_subset = ds_Changes.GetChanges(DataRowState.Added) If (Not (ds_subset) Is Nothing) Then MyDataAdapter.Update(ds_subset.Tables(0)) ds_subset = ds_Changes.GetChanges(DataRowState.Deleted) If (Not (ds_subset) Is Nothing) Then MyDataAdapter.Update(ds_subset.Tables(0)) MyDS.AcceptChanges() End If
الخاصية HasErrors :
نفرض أن مستخدماً أدخل القيمة " ADO " في حقل من النوع Integer عندئذ يمكن للبرنامج أن يُعلِّم هذا الحقل في هذا السجل بالذات برسالة خطأ . لاحقاً وقبل أن يقوم البرنامج بتحديث قاعدة البيانات ، فإنه يمكن استخدام خاصية HasErrors الخاصة بـ DataSet لتحديد فيما إذا كانت البيانات تملك أخطاء يتوجب على المستخدم إصلاحها .
ربما يرى البعض أنه من الأفضل أن يخبر البرنامج المستخدم عن وجود أخطاء في البيانات المدخلة مباشرة ، مثل استخدام الأداة ErrorProvider ، ولكن أحياناً يكون من المفيد تأجيل معالجة الأخطاء . كمثال : ربما كانت قيمة أحد الحقول تعتمد على قيمة حقل آخر لم تدخل بعد ، في هذه الحالة فإن البرنامج يجب عليه الانتظار حتى تدخل كلا القيمتين ، قبل أن يقرر فيما إذا كانت هناك مشكلة ما .
وتعيد هذه الخاصية القيمة true إذا كانت البيانات تملك أخطاء يتوجب على المستخدم إصلاحها ، وبالمقابل القيمة False إذا لم توجد أخطاء في البيانات .
مثال :
If MyDataSet.HasErrors = True Then ' أدخل الكود الخاص بتصحيح الخطأ Else ' أدخل الكود الخاص بحفظ البيانات المدخلة End If
الخاصية Tables :
نصل من خلال هذه الخاصية إلى الجداول المخزنة في DataSet ومنها إلى الصفوف والأعمدة الموجودة في هذه الجداول ، بل و إلى القيم المخزنة في أي خلية من الخلايا الموجودة في الجدول .
ويتم تحديد اسم الجدول الذي نريد أن نتعامل معه بواسطة هذه الخاصية بطريقتين ، أولاهما هي أن نكتب اسم الجدول ( وهي الأفضل للمزيد من الوضوح ) كما في المثال التالي ..
MyDS.Tables("Information")والطريقة الثانية هي أن نرمز للجدول من خلال رقمه داخل الكائن DataSet علماً أن رقم أول جدول داخل الكائن DataSet هو الرقم 0 ، كما في المثال التالي ..
MyDS.Tables(0)
ويمكن أيضاً التحكم في صفوف الجدول المحدد من خلال الخاصية Rows التابعة له ، والخاصية Item التابعة لها ، وكل ذلك يتم بشكل مباشر بدون كائنات خدمية .
وسوف أقوم بطرح مجموعة من الأمثلة ، لعلها تعين على الاستيعاب بشكل أفضل ..
ملاحظة : ما سوف يتم شرحه في السطور التالية من باب العلم بالشيء ، وإلا فإن الكائنات الخدمية (BindingManagerBase أو CurrencyManager أو BindingSource ) تغنينا عن ذلك وبشكل مختصر جداً وجميل .
لمعرفة عدد سجلات أحد الجداول نقوم بكتابة ما يلي ..
MyDS.Tables("Information").Rows.Countلمعرفة القيمة المخزنة في الخلية الموجودة في الصف الأول والعمود الأول ، وعرضها في مربع رسالة ، نقوم بكتابة ما يلي ..
MsgBox(MyDS.Tables("Information").Rows(0).Item(0))كما نستطيع أعادة كتابة الكود السابق ، بحيث نحدد فيه عمود محدد ، بكتابة ما يلي ..
MsgBox(MyDS.Tables("Information").Rows(0).Item("Name"))لتغير قيمة الخلية الموجودة في الصف الأول والعمود المسمى Name ، نقوم بكتابة ما يلي ..
MyDS.Tables("Information").Rows(0).Item("Name")="Yaser"لحذف السجل ( الصف ) الأول من الجدول ، نقوم بكتابة ما يلي ..
MyDS.Tables("Information").Rows(0).Delete()للتراجع عن التغيرات التي قمنا بها من تعديل وحذف ، نقوم بكتابة ما يلي ..
MyDS.Tables("Information").Rows(0).RejectChanges()لإضافة سجل جديد ، نخزن البيانات التي نريدها في مصفوفة ، ونسندها للخاصية Add كما في الكود التالي ..
Dim MyData() As String = {"Yaser", "32", "Gizan"}
MyDS.Tables("Information").Rows.Add(MyData)ويمكن تطوير الكود السابق باستخدام الكائن DataRow ، وتأهيله بصف جديد في الجدول المحدد ، وإدخال القيم فيه من خلال الخاصية Item ، ثم نسند الكائن DataRow إلى للخاصية Add التابعة لصفوف الجدول ، كما في الكود التالي ..
Dim MyDR As DataRow = MyDS.Tables("Information").NewRow
MyDR.Item("name") = "yaser mohamed"
MyDR.Item("age") = "32"
MyDR.Item("City") = "Gizan"
MyDS.Tables("Information").Rows.Add(mydr)سنكتفي بذلك القدر ، وننتقل إلى التنقل بين السجلات ..
لمعرفة رقم موقع السجل الحالي وعرضه في مربع رسالة ، نكتب ما يلي ..
MsgBox(Me.BindingContext(MyDS, "Information").Position)
ولمعرفة عدد السجلات الموجودة في الجدول الحالي وعرضها في مربع رسالة ، نكتب ما يلي ..
MsgBox(Me.BindingContext(MyDS, "Information").Count)
وللانتقال للسجل الأول في الجدول نكتب ما يلي ..
Me.BindingContext(MyDS, "Information").Position = 0
وللانتقال للسجل الأخير في الجدول نكتب ما يلي ..
Me.BindingContext(MyDS, "Information").Position = Me.BindingContext(MyDS, "Information").Count -1
وللانتقال للسجل التالي في الجدول نكتب ما يلي ..
Dim MyPosition As Integer = Me.BindingContext(MyDS, "Information").Position Me.BindingContext(MyDS, "Information").Position = MyPosition +1
وللانتقال للسجل السابق في الجدول نكتب ما يلي ..
Dim MyPosition As Integer = Me.BindingContext(MyDS, "Information").Position Me.BindingContext(MyDS, "Information").Position = MyPosition -1
** هنا ينتهي حديثنا اليوم ، فما أصبنا من صواب فمن الله وتوفيقه ، وما أصبنا من خطأ فمن أنفسنا والشيطان ، لذلك من وجد أي أخطاء فليصححها لنا مشكوراً ..
ولنأخذ قسطاً من الراحة ، لكي نستوعب هذه الجرعة من المعلومات ونصحح أخطائها إن وجدت ، ونعلق على الغير مفهوم منها ، و نكمل فيما بعد شرح ما تبقى من الدرس ، علماً أن موضوع درسنا القادم إن شاء الله هو الكائن DataAdapter ..
((سبحانك اللهم وبحمدك، أشهد أن لا إله إلا أنت، أستغفرك وأتوب إليك ))
تم تعديل هذه المشاركة بواسطة yaseralshikh في 12 فبراير 2007 في 09:21
1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .
2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .
-------------------------------------------------------
درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005
اخي الكريم / yaseralshikh جزاك الله خيرا وزاد الله في علمك ونفع به كل من قراء درسك
واسئل الله ان يكون كل حرف كتبتة وكل دقيقة قضيتها في كتابة هذا الدرس حسنة في ميزان حسناتك .
استاذي الكريم yaseralshikh لدي ثلاث أسئلة :
1- ماهي اقصى حجم لقاعدة البيانات التي يتم تخزينها في Dataset له تقبل مثلا جدول يحتوي على 100,000 سجل واكثر .
2- اين يتم تخزين Dataset في الذاكرة .
3- كيف يتم التحقق من ان Dataset and DataAdepter قد تم ملأهما بالبيانات .
تحياتي لك بالتوفيق .
تم تعديل هذه المشاركة بواسطة ahmedd في 13 فبراير 2007 في 03:43
بسم الله الرحمن الرحيم
أخي ahmedd بارك الله فيك ، وجعلني جار لك في الجنة ( ... قول أمين ... ) .
جوابي على سؤالك الأول هو " لا أعلم " لا أعلم ماهو اقصى حجم لقاعدة البيانات التي يتم تخزينها في الـ Dataset ، ولكني أقتبس لك جزء من إحدى مشاركات مشرفنا الغالي الغملاسي ، وفيها جواب الجزء الأخير من السؤال ..
اقتباسبالنسبةِ لي جربت الوضع المنفصل على قاعدة بيانات SQL تحتوي على 100000 صورة تتراوح أحجامها بين 100 كيلو بايت و 400 كيلو بايتوتقريباً قاعدة البيانات 7 GB وهذا نادر ما تجدة في المشاريع العربية و حتى الحكومية , مع ذلك البرنامج أسرع من البرق ...
جوابي على السؤال الثني هو " لا أعلم " لا أعلم اين يتم تخزين Dataset في الذاكرة ، ولكني أعتقد أن معرفة ذلك لا يشكل فارقاً ، وبعبارة أخرى لن يفيدنا بشيء . ورغم ذلك أجد لك جواب كان أخي الغملاسي قد تطرق إليه في إحدى مشاركاته ( اللهم زد وبارك ) ..
اقتباسDataSet وهي عبارة عن قاعدة البيانات الاصلية Database بشكل مصغر مكانها ذاكرة الجهاز ولها ملف من نوع XMLيحمل الامتداد XSD File للتعامل معها اثناء التطوير, هذا الملف يعرف بـ meta data وهو بيانات البيانات , ويحمل مواصفات قاعدة البيانات.
جوابي على السؤال الثالث " كيف يتم التحقق من ان Dataset and DataAdepter قد تم ملأهما بالبيانات " هو : يجب أن تعيد قراءة الجزء الأخير من الدرس وبالذات ما يلي ..
اقتباسوتتلخص فكرته في أن نقوم بإجراء اتصال بقاعدة البيانات ، وذلك بواسطة كائن الاتصال Connection كما ذكرنا في الدروس السابقة ، وبعد قبول الاتصال نقوم بأخذ نسخة من البيانات المخزنة في مصدر البيانات "Data Sources" ( مصدر البيانات هنا هو ملف قاعدة البيانات بالنسبة لـ Microsoft Office Access أو السيرفر بالنسبة لـ SQL Server ) ، ثم نقوم بتخزينها في الذاكرة ، وذلك من خلال كائن يكون بمثابة مستودع للبيانات ويسمى DataSet ( مجموعة البيانات ) ، ولكي تتم هذه العملية يحتاج هذا الكائن إلى كائن أخر يسمى DataAdapter ( موفّق البيانات ) يكون بمثابة وسيط بين مجموعة البيانات "DataSet " ومصادر البيانات "Data Sources" ، حيث يقوم DataAdapter بعملية فتح الاتصال بقاعدة البيانات و استيراد وتصدير البيانات من و إلى مصدرها الأساسي ، وبعد تخزين البيانات في DataSet ، فإنها تصبح منفصلة عن مصدر البيانات ، لان الكائن DataAdapter يقوم بشكل تلقائي أيضاً بقطع الاتصال بقاعدة البيانات ...
لان كما يبدو من السؤال ، هناك خلط بين وضيفة كلاً من Dataset و DataAdepter .
إذا كانت خطواتنا سليمه ، ولم تواجهنا أخطاء فإن ذلك كافي للتحقق من أن الـ Dataset قد إمتلأت بالبيانات ، غير ذلك سوف تكتشف ذلك عند ربط البيانات بالأدوات من أجل عرضها ومعالجتها ..
أرجو أن تعذرني فيما لم أجبك عليه ، وأن تكون الإجابات مرضية ..
تم تعديل هذه المشاركة بواسطة yaseralshikh في 13 فبراير 2007 في 05:13
1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .
2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .
-------------------------------------------------------
درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005
شكرا على ردك اخوي yaseralshikh عندي مشكلة انا كتبت الكود التالي بس يعطيني رسالة no data جسب الشرط المكتوب
MessageBox.Show("no data")
اي ان myreader.Read لم يستطع قراءة البيانات من القاعدة او خالي احد _ وش السبب
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
objconn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\vbnetsbs\vbtest.mdb"
Dim strsql As String
strsql = "select emp_name , emp_computer_num from emp_info where emp_name=? and emp_computer_num =? "
Dim objcommand As New OleDb.OleDbCommand(strsql, objconn)
objcommand.Parameters.Add("?", OleDbType.Char)
objcommand.Parameters.Add("?", OleDbType.Integer)
objcommand.Parameters(0).Value = "جسي"
objcommand.Parameters(1).Value = 1400264
objconn.Open()
'كود خاص للتاكد من فتح الاتصال
MessageBox.Show(objconn.State.ToString())
myreader = objcommand.ExecuteReader()
myreader.Read()
If myreader.Read Then
TextBox1.Text = myreader.Item("emp_computer_num")
TextBox2.Text = myreader.Item("emp_name")
Else
MessageBox.Show("no data")
End If
myreader.Close()
objconn.Close()
End Subتم تعديل هذه المشاركة بواسطة ahmedd في 14 فبراير 2007 في 04:08
في إعتقادي مشكلتك تكمن في كود التعريف عن البارامترات التي تم وضعها في جملة الإستعلام . ولكي يعمل لديك الكود بشكل صحيح عليك التعديل على الكود كي يصبح كما يلي ..
objcommand.Parameters.Clear()
objcommand.Parameters.AddWithValue("?", "جسي")
objcommand.Parameters.AddWithValue("?", "1400264")جرب وإن شاء الله سوف تنجح ..
تم تعديل هذه المشاركة بواسطة yaseralshikh في 14 فبراير 2007 في 04:45
1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .
2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .
-------------------------------------------------------
درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005
للاسف استاذي / yaseralshikh ماضبط
اعذرني بكلف عليك الله لا يهينك انا ارفقت مثال المشروع ارجو ان تطلع علية لانه بالنسبة لي يمثل هذا المثال انطلاقة لممشروعي .
ahmedd كتب:شكرا على ردك اخوي yaseralshikh عندي مشكلة انا كتبت الكود التالي بس يعطيني رسالة no data جسب الشرط المكتوبMessageBox.Show("no data")
اي ان myreader.Read لم يستطع قراءة البيانات من القاعدة او خالي احد _ وش السبب
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load objconn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\vbnetsbs\vbtest.mdb" Dim strsql As String strsql = "select emp_name , emp_computer_num from emp_info where emp_name=? and emp_computer_num =? " Dim objcommand As New OleDb.OleDbCommand(strsql, objconn) objcommand.Parameters.Add("?", OleDbType.Char) objcommand.Parameters.Add("?", OleDbType.Integer) objcommand.Parameters(0).Value = "جسي" objcommand.Parameters(1).Value = 1400264 objconn.Open() 'كود خاص للتاكد من فتح الاتصال MessageBox.Show(objconn.State.ToString()) myreader = objcommand.ExecuteReader() myreader.Read() If myreader.Read Then TextBox1.Text = myreader.Item("emp_computer_num") TextBox2.Text = myreader.Item("emp_name") Else MessageBox.Show("no data") End If myreader.Close() objconn.Close() End Sub
تريد الحل أعد النظر على الكود و تخلص من السطر التالي ..
myreader.Read()
ومشكلتك هذه المرة محلولة بإذن الله ..
1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .
2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .
-------------------------------------------------------
درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005
الللللللللللللللللللللللللللله يجزاك خيييييييييييييييييييييييييييير وما قصرت
تم تعديل هذه المشاركة بواسطة ahmedd في 15 فبراير 2007 في 07:13
شكرا لك اخي العزيز على الدرس الأخير وبإنتظار المزيد منك ، اسلوبك رائع جدا وممتاز في الشرح وما يعجبني فيه انك تأتي بكل شيء تقريبا وهذا ما ينقص الشروحات في اي مكان على الشبكة ،
لك تحياتي الخالصه ،
[/وسط]
السلام عليكم اخى ياسر
مشكور اخى على هذا الشرح وجزاك الله عنا خير
وجعل هذا الشرح فة ميزان حسناتك
أستاذي الكريم وصديقي العزيز الأستاذ ياسر
السلام عليكم ورحمة الله وبركاته وجزاك الله خيرا لما تفعله من نشر العلم والمعرفة بين أبناء أمتك ورزقك الله بكل حرف ألف حسنة "آمين"
إن شرحك مفيد ومفصل ومفهوم جدا ولكن لي ملاحظات وأسئلة فأرجو أن يتسع صدرك لي
أولا الملاحظات :
خلقنا الله بني الانسان موسومين بالعجل والاستعجال "خلقة الله" ودروسك يشهد لها العام والخاص بسلاستها وأهميتها وسهولة تعلمها مما يجعلنا مشدودين لها ومتابعين لكل جديد منها وأنت أستاذي العزيز تصب لنا من مناهل علمك بالتقطير خوفا علينا من التخمة والضياع في متاهات هذا العلم المترامي الأطراف وعندما نقرأ موضوع بنهم جشع للعلم نتوقف مغصوب علينا لإنتهاء الدرس ونحن لم نستطع تحريك ساكنا لفهم المزيد إلى أن يطل علينا الموضوع التالي وأنا أرى (هذا من وجهة نظري فقط)أن أهم ما في العمل بقاعدة البيانات هو النقاط التالية : إدخال سجل جديد - تعديل بيانات سجل موجود سلفاً - حذف سجل موجود - البحث عن سجل بمعرفة معلومة حقل من حقوله - ربط وحدات التحكم ببيانات قاعدة البيانات . على أن يتم تنفيذ هذه النقاط في كلتا الوضعيتين ( وضعية الاتصال المباشر ووضعية الاتصال المنفصل ) وعندما تعطينا الطرق أو طريقة واحدة تحبذها أنت نقوم نحن بتنفيذها وتجربتها ونفرحوا ونبتهج بالنتيجة عندما نلمس نتائج النقاط المذكورة أعلاه في تجميعة البيانات ونتأكد من تخزينها في جدول قاعدة البيانات الأساسية ونفرح فرحا يدفعنا لتعلم الاضافات "التي تشبه البهارات على الأكل" لتحسين ما تعلمناه وتكون نفوسنا وعقولنا مستعدة لفهمها لأننا عرفنا كيف نعمل الأصل.
ثانيا : السؤال
ورد أستاذي العزيز في الدرس الأخير ذكر باني الأوامر CommandBuilder الذي يختص كما عرفت بحفظ البيانات التي تم تغييرها في مجمع البيانات DataSet وحفظها في مصدر البيانات الأساسي Source DataBase ولكن في المثال الذي وضعته لم تتطرق لهذا الأمر إلا في التعريف فقط Dim MyCB As New OleDbCommandBuilder(MyDataAdapter) أرجو التوضيح :unsure:
أخواني ،،
والله إن مشاركاتكم تسعدني ، وجزاكم الله عني كل خير ، مشاعركم نحوي وصلت إلي ، وهي عندي في منزلة عالية من التقدير والاحترام ..
أخي وصديقي omran555 ..
وعليكم السلام ورحمة الله وبركاته
ماذا أقول بعد قولك ؟
جزاك الله الف خير ، و ما يهمني بعد الثواب الذي انتظره عند لقاء ربي ، هو أن أصادق أمثالك ممن يقدرون ويعرفون معنى المحبة في الله ..
وأما ما يخص ملاحظاتك وسؤالك ، وددت لو أني أستطيع أن اقدم سلسلة الدروس بشكل أسرع مما هو عليه الحال ، ولكني أبدل قصار جهدي رغم ضيق الوقت وكثرة الإنشغال .
عندما قررت أن أبدأ هذه السلسلة من الدروس ، احترت في الأسلوب الي سوف اتبعه في الشرح ، وكنت أفكر في طرح مشروع واقوم بكتابة الكود اللازم له ومن ثم أشرح الكود . ولكني وجدت أنه من الأفضل أن ألقي الضوء على الفكره البرمجية في الأساسيات ، ثم أنتقل إلى شرح الكائنات الأساسية والتعرف على أهم خصائصها مع ذكر بعض الأمثلة الصغيرة ، وبعد ذلك أنتقل إلى شرح الكائنات الخدمية و بعد كل ذلك نطرح مشروع ونطبق فيه كل ما تعلمناه فيما سبق . وفي الأخير سوف نتطرق إلى أعداد التقارير ومناقشة بعض الأفكار التي قد تستجد علينا ..
لذلك لم أتحدث عن CommandBuilder كثيراً وأذكر أن قلت حينها ...
اقتباسملاحظة : نرجو التركيز على الجزء الخاص بـ GetChanges حتى تتضح الصورة الكاملة في أذهاننا من خلا متابعة باقي الدروس ، بعدها يمكننا فهم باقي تفاصيل الكود الغامضة في هذا الوقت .
وأرجو مناصحتي فيما إذا كان هناك أسلوب أفضل من ذلك في الشرح ،،،
والله الموفق .
تم تعديل هذه المشاركة بواسطة yaseralshikh في 19 فبراير 2007 في 11:57
1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .
2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .
-------------------------------------------------------
درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005
الأخ الكريم ياسر
جزاك الله خيرا على هذه الدروس القيمة .. لقد ذكرت طريقة حذف السجل الاول من الشبكة .
عندي سؤال : كيف يمكنني حذف سجل محدد من datagrid ؟
تحياتي
الاخت ريم الصحاري ، سؤالك يحتاج إلى الكثير من التوضيح ، لان المعلومات التي ذكرتها غير كافية ، كما ننصح بإرفاق مثال توضحين فيه المشكلة أو المطلوب .. والله الموفق .
1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .
2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .
-------------------------------------------------------
درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005
بسم الله الرحمن الرحيم
وبه أبدا وأستعين ، وأختم بالصلاة والسلام على خاتم الأنبياء والمرسلين نبينا محمد وعلى آله وصحبه أجمعين ، أما بعد ..
قبل الخوض في الدرس القادم ( إن شاء الله ) ، أحب أن أضيف بعض المعلومات الإلحاقية بالدرس السابق ، وهي تتبع لخصائص الكائن DataSet ..
الخاصية Merge ( الدمج ) :
تقوم هذه الخاصية بدمج أو إضافة البيانات إلى الكائن DataSet من كائنات أخرى يمكن أن تكون مجمعة البيانات DataSet أو جدول DataTable أو مصفوفة البيانات DataRow ، ويملك الكائن المُدمَج عادةً بنية مشابهة للكائن DataSet الأصلية ، كمثال : إذا كان الكائن الجديد هو عبارة عن DataSet أخرى ، فإنه من الممكن أن يملك الجداول نفسها التي في DataSet الأولى ( الأصلية ) .
وطريقة استخدامها هي كالتالي :
1- عبارة عن دمج DataSet فرعية داخل DataSet أصلية ، ومثال ذلك ..
Dim MyDS As DataSet Dim SubSet_DS As DataSet MyDS.Merge(dataSet)
2- عبارة عن دمج DataTable داخل DataSet أصلية ، ومثال ذلك ..
Dim MyDS As DataSet Dim MyTable As DataTable MyDS.Merge(MyTable)
3- عبارة عن دمج DataRow داخل DataSet أصلية ، ومثال ذلك ..
Dim MyDS As DataSet Dim Rows As DataRow() MyDS.Merge(Rows)
ومن المعلوم أن الكائن DataSet المولَّدة بواسطة الخاصية GetChange متوافقة مع DataSet الأصلية ( لاحتوائها على نفس التكوين و البنية ) . حيث يمكن للبرنامج على سبيل المثال استخدام الخاصية GetChange للحصول على كائن DataSet فرعي والمحتوي فقط على التغييرات ( أو الإضافات أو المحذوفات كما ذكرنا في الدروس السابقة ) ، ويمكنه بعد ذلك تثبيت التغييرات مع إمكانية تعديل بعض قيم البيانات ، ثم يحفظ التغييرات في قاعدة البيانات . وبعد انتهاء البرنامج من تحديث قاعدة البيانات ، فإن البرنامج يمكنه من خلال الخاصية Merge دمج التغييرات معيداً إياها إلى DataSet الأصلية ، وبالتالي فإنها ستكون متزامنة مع قاعدة البيانات . ويفرض علينا ذلك طبيعة البرنامج الذي نتعامل معه ، وخصوصاً في حالة احتوائه على تقيدات علائقية أو تقيدات أمنية معينه يحتاجها المبرمج ، ولكي تتضح الصورة فلنتأمل المثال التالي ( يحتاج هذا المثال إلى قراءة و فهم الدروس السابقة ) ..
Dim ds_Changes As New DataSet
Dim ds_subset As New DataSet
Dim MyCB As New OleDbCommandBuilder(MyDataAdapter)
Me.BindingContext(MyDS, "Information").EndCurrentEdit()
If MyDS.HasChanges Then
ds_Changes = MyDS.GetChanges
ds_subset = ds_Changes.GetChanges(DataRowState.Modified)
If (Not (ds_subset) Is Nothing) Then
MyDA.Update(ds_subset.Tables("Information"))
MyDS.Merge(ds_subset)
End If
ds_subset = ds_Changes.GetChanges(DataRowState.Added)
If (Not (ds_subset) Is Nothing) Then
MyDA.Update(ds_subset.Tables("Information"))
MyDS.Merge(ds_subset)
End If
ds_subset = ds_Changes.GetChanges(DataRowState.Deleted)
If (Not (ds_subset) Is Nothing) Then
MyDA.Update(ds_subset.Tables("Information"))
MyDS.Merge(ds_subset)
End If
MyDS.AcceptChanges()
End Ifو من باب العلم بالشيء ، الخاصية Merge تأخذ وسيطين اختياريين غير إلزاميين ، يخبرانها بكيفية الدمج ، الوسيط الأول هو قيمة منطقية ( Boolean ) وتحمل إما القيمة True أو القيمة False ، وتخبر الخاصية Merge فيما إذا يجب أن تُحافظ على التغييرات في DataSet الأصلي وذلك من خلال اختيار القيمة True ، أم لا وذلك من خلال اختيار القيمة False . الوسيط الثاني ويحمل أربع قيم ، من خلالها يخبر الخاصية Merge ماذا يتوجب عليها فعله عند فقدان جدول أو عمود ما في الـ DataSet الفرعية أو في الـ DataSet الأصلية ، حيث أنه عند استدعاء الخاصية Merge تقوم بالمقارنة بين مخططين الـ DataSet الأصلي والفرعي ، وذلك بسبب أنه من المحتمل أن ذلك المخططين قد يختلفان بسبب فقدان جدول أو عمود ما كما أسلفنا .
و ملخص هذه القيم ، مع طريقة استخدامها :-
1- القيمة MissingSchemaAction.Add :
تجعل الخاصية Merge تضيف الجدول أو العمود الجديد .
MyDS.Merge(ds_subset, False, MissingSchemaAction.Add)
2- القيمة MissingSchemaAction.AddWithKey :
تجعل الخصية Merge تضيف أعمدة جديدة ومعلومات عن المفتاح الرئيسي عند الضرورة .
MyDS.Merge(ds_subset, False, MissingSchemaAction.AddWithKey)
3- القيمة MissingSchemaAction.Error :
تجعل الخاصية Merge تعلن عن أخطاء ، إذا لم تجد مطابقة البيانات الواردة مع بنية الـ DataSet الأصلية .
MyDS.Merge(ds_subset, False, MissingSchemaAction.Error)
4- القيمة MissingSchemaAction.Ignore :
تجعل الخاصية Merge تتجاهل البيانات الجديدة إذا لم تتطابق مع الـ DataSet الأصلية .
MyDS.Merge(ds_subset, False, MissingSchemaAction.Ignore)
الخاصية Clone :
تنسخ هذه الخاصية نفس بنية الـ DataSet الأصلية إلى الـ DataSet الجديدة ، بحيث تمتلك نفس الجداول والتقيدات ، وطريقة استخدامها ..
Dim MyDS As New DataSet Dim ds_subset As New DataSet ds_subset = MyDS.Clone
الخاصية Copy :
تنسخ هذه الخاصية نفس بنية و بيانات الـ DataSet الأصلية إلى الـ DataSet الجديدة ، بحيث تمتلك نفس الجداول والتقيدات والبيانات أيضاً ، وبالتالي فإن Copy مشابهة لـ Clone ولكنها تتضمن البيانات ، وطريقة استخدامها ..
Dim MyDS As New DataSet Dim ds_subset As New DataSet ds_subset = MyDS.Copy
((سبحانك اللهم وبحمدك، أشهد أن لا إله إلا أنت، أستغفرك وأتوب إليك ))
1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .
2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .
-------------------------------------------------------
درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005
الأخ ياسر
سأوضح سؤالي أكثر
لقد ذكرت في الدرس السابق طريقة حذف السجل الأول من الجدول كما يلي :
لحذف السجل ( الصف ) الأول من الجدول ، نقوم بكتابة ما يلي ..
MyDS.Tables("Information").Rows(0).Delete()
أنا أريد حذف أي سجل أريده من الجدول بتحديده بواسطة الفأرة والنقر على زر حذف ويتم حذف السجل المحدد .
أتمنى إني وضحت السؤال كما يجب
وشكرا لك
جواب السؤال :
كيف يمكنني حذف سجل محدد من datagrid ؟
هو الكود البرمجي التالي ...
MyDS.Tables("Information").Rows(Me.DataGridView.CurrentRow.Index).Delete()1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .
2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .
-------------------------------------------------------
درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005
اشكرك جزيل الشكر اخي ياسر
يا ليت تضع كود الاتصال بطريقة الاتصال المنفصل
علشان نقدر نستفيد من خصائص هذة الطريقة
واذا كنت شرحتخا وعدت علي
ارجو منك العذر وارجو اعلامي بالمشاركة التي تطرقت لذلك
وشكرا
تم تعديل هذه المشاركة بواسطة ابوطلال في 23 فبراير 2007 في 20:01
أخي أبوطلال ..
كود الاتصال بطريقة الوضع المنفصل ، هو نفس كود الاتصال بالوضع المتصل ، والإختلاف يأتي بعد ذلك ..
1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .
2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .
-------------------------------------------------------
درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005
اخي ياسر
بالنسبة للتعامل مع الاداة التي تاتي مع الفيجوال بادراجها على الفورم
كيف يتم التحكم بجملة الاستعلام بالكود وهل هناك شرح وافي يتطرق لها و جميع خصائصها
وشكرا
تم تعديل هذه المشاركة بواسطة ابوطلال في 24 فبراير 2007 في 15:06
شكرا اخىالعزيز على هذا الدرس الجميل
أخي أبو طلال ، ممكن توضح أكثر ..
أخي بودا مان ، لا شكر على واجب ..
1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .
2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .
-------------------------------------------------------
درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005