الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

لمحترفى ADO.NET

مغلق
بدأه Ahmed Essa في 11 ديسمبر 2003 · 14 رد · 2,291 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

كيف نقوم بوضع محتويات DataReader فى DataTable ?

عندى سؤال اخر

كيف نقوم بملا DataGrid باكثر من حقل لاكثر من جدول ثم كيف نقوم بتحديث هذه الحقول

الموجوده فى اكثر من جدول !!!!!!!!!

#2

للانتقال من سجل الى سجل ضمن DataReader عليكا استخدام Read()

على الشكل التالي

While(myDataReader.Read())
{
//populate your datatable with the contents of the current Row in the way you want

}

للحصول على محتويات السجل الحالي يوجد عدة طرق

أولا

myDataReader.GetValue(index);

والتي تعيد كائنا من النوع object

ثانيا

للحصول على كامل السجل على شكل مصفوفة من الكائنات object[]

myDataReader.GetValues();

وأخيرا ان كنت تعرف نوع القيمة التي تريد الحصول عليها لحقل محدد بيمكنك استخدام

GetBoolean

GetByte

GetBytes

GetChar

GetChars

......... etc

للحصول على DataTable توافق في بنيتها بنية المعلومات التي يعيدها DataReader استخدم

myDataReader.GetSchemaTable();

بالنسبة للسؤال الثاني فأرجو أن توضح أكثر

وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان

بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي

يا زمان يا عشب داشر فوق هالحيطان ضويت ورد الليل عكتابي

برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي

يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو

http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3

#3

الـ DataReader يمكن اعتبارها DataTable حيث يمكنك أن تنفذ عملية Bind الى DataReader تماما كما تفعل مع DataTable..

#4

Of course you can assign DataReader as a DataSouce for your controls ,and actually you can assign any object that impliments IEnumerable interface as a DataSource, but in this case you will not be able to proccess your data offline.

Actually I have never populated a DataTable manually using DataReader, I use usuall Fill method of the DataAdapter

Some classes that impliment IEnumerable:

Array

ArrayList

AttributeCollection

BaseChannelObjectWithProperties

BaseCollection

BindingContext

BitArray

Cache

CaptureCollection

CheckedListBox.CheckedIndexCollection

CheckedListBox.CheckedItemCollection

ClerkMonitor

CodeNamespaceImportCollection

CollectionBase

ComboBox.ObjectCollection

Control.ControlCollection

ControlCollection

CookieCollection

CredentialCache

DataBindingCollection

DataColumnMappingCollection

DataGridColumnCollection

DataGridItemCollection

DataKeyCollection

DataListItemCollection

DataTableMappingCollection

DataView

DataViewManager

DataViewSettingCollection

DesignerCollection

DictionaryBase

DirectoryEntries

EventDescriptorCollection

EventLogEntryCollection

Evidence

GridItemCollection

GroupCollection

Hashtable

HtmlTableCellCollection

HtmlTableRowCollection

HttpSessionState

HttpStaticObjectsCollection

HybridDictionary

ImageList.ImageCollection

InternalDataCollectionBase

KeyInfo

LinkLabel.LinkCollection

ListBox.ObjectCollection

ListBox.SelectedIndexCollection

ListBox.SelectedObjectCollection

ListDictionary

ListItemCollection

ListView.CheckedIndexCollection

ListView.CheckedListViewItemCollection

ListView.ColumnHeaderCollection

ListView.ListViewItemCollection

ListView.SelectedIndexCollection

ListView.SelectedListViewItemCollection

ListViewItem.ListViewSubItemCollection

ManagementObjectCollection

MatchCollection

Menu.MenuItemCollection

MessageQueue

MethodDataCollection

NameObjectCollectionBase

NameObjectCollectionBase.KeysCollection

OdbcDataReader

OdbcErrorCollection

OdbcParameterCollection

OleDbDataReader

OleDbErrorCollection

OleDbParameterCollection

OracleDataReader

OracleParameterCollection

PagedDataSource

PermissionSet

PrinterSettings.PaperSizeCollection

PrinterSettings.PaperSourceCollection

PrinterSettings.PrinterResolutionCollection

PropertyCollection

PropertyDataCollection

PropertyDescriptorCollection

PropertyGrid.PropertyTabCollection

QualifierDataCollection

Queue

ReadOnlyCollectionBase

RepeaterItemCollection

ResourceReader

ResourceSet

ResXResourceReader

SchemaNameCollection

SearchResultCollection

SecurityCallers

SelectedDatesCollection

SharedPropertyGroupManager

SignedInfo

SortedList

SqlCeErrorCollection

SqlCeParameterCollection

SqlDataReader

SqlErrorCollection

SqlParameterCollection

Stack

StateBag

StatusBar.StatusBarPanelCollection

String

StringCollection

StringDictionary

TabControl.TabPageCollection

TableCellCollection

TableRowCollection

TempFileCollection

ToolBar.ToolBarButtonCollection

TraceListenerCollection

TreeNodeCollection

TypeConverter.StandardValuesCollection

ValidatorCollection

XmlNamedNodeMap

XmlNamespaceManager

XmlNode

XmlNodeList

XmlSchemaCollection

(Sorry for writing english but i can't write arabic right now)

وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان

بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي

يا زمان يا عشب داشر فوق هالحيطان ضويت ورد الليل عكتابي

برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي

يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو

http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3

#5

يا اخ BAZRAMIT هل يمكن توضيح كيف يتم الربط DataReader ولو بمثال بسيط

توضيح السؤال الثانى :

لديك جدول المؤلفين و جدول الكتب داخل قاعدة بيانات منشأة بالأكسيس

والذى يوجد بينهما علاقة

نريد عرض حقل رقم المؤلف وحقل إسم المؤلف الموجودان فى جدول المؤلفين مع

حقل إسم الكتاب الموجود فى جدول الكتب داخل Datagrid كيف يتم ذلك ؟

ونريد إضافة زر جديد وزر تعديل وعند الضغط على زر جديد يسمح لنا بإضافة سجل جديد داخل Datagrid وبحيث يتم إضافة هذا السجل فى الجدولين المذكوران وبالمثل زر التعديل

فكيف يتم ذلك ؟

#6

لربط DataReader فورا استخدم الطريقة التالية

myDataGrid.DataSource = myDataReader;

ولكنك عندها لن تستطيع تعديل البيانات فهذه الطريقة تملأ الـ DataGrid لكنها لا تحتفظ باثر لهذه البيانات فأنصحك بالابتعاد عنها.

إن كنت تبحث عن السهولة فاستخدم الطريقة Fill() للـ DataAdapter .

تم تعديل هذه المشاركة بواسطة DotNetExpert في 14 ديسمبر 2003 في 14:56

وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان

بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي

يا زمان يا عشب داشر فوق هالحيطان ضويت ورد الليل عكتابي

برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي

يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو

http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3

#7

بالنسبة لعرض سجلات من عدة قواعد بيانات معا فهناك عدة طرق

اولا

تستطيع ملئ كل من جدول المؤلفين وجدول الكتب في DataTable منفردة ضمن DataSet وذلك باستخدام DataAdapter حصرا وليش عن DataReader وذلك لسهولته.

ومن ثم تعريف علاقة اب-ابن DataRelation بين هذين الجدولين .

حسنات هذه الطريقة أنها تسهل تعديل الجداول وإضافة سجلات جديدة. سيئاتها أن عرض DataGrid تضمن حقول من كلي الجدولين أمر يحتاج الى بعض التعديل اليدوي .

ثانيا

تستطيع استخدام شيفرة SQL لريط الجدولين معا مثلا

SELECT B.BookName , B.AutorID,A.Name  FROM Books b JOIN Authors A ON b.AuthorID = A.ID

على فرض أن AuthorID و ID هما الذان يربطان الجدولين معلا

حسنات هذه الطريقة أنط تستطيع استخدام الجدول الناتج فورا كمصدر DataSource للـ DataGrid.

سيئاتها أن تعديل البينات أو اضافة سجلات جديدة صعب نوعا ما

تم تعديل هذه المشاركة بواسطة DotNetExpert في 14 ديسمبر 2003 في 16:25

وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان

بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي

يا زمان يا عشب داشر فوق هالحيطان ضويت ورد الليل عكتابي

برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي

يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو

http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3

#8

الأن ننتقل للمشكلة الفعلية وهي تعديل البيانات

اولا

اذا كنت تستخدم جداول منفصلة لكل جدول فعلي مقابل في قاعدة البيانات فان تعدل اي سجل هو شي سهل . كل ما عليك هو تعديل القيمة ضمن DataTable وفي النهاية بعد أن تنتهي تعديل كل شي تستدعي الطريقة Update() على كلي DataAdapter

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

فاولا يجب تعديل جدول الكتاب وعند اضافة كل كاتب عليك الحصول على الجدول المفتاح لهذا الكاتب ID . وتعديل قيمة AuthorID في سجل الكتاب المقابل . (لملاحقة السجلات المضافة حديثا الى قاعدة البيانات تستطيع استخدام بعض احداث الـ DataAdapter)

ومن ثم استدعاء Update لجدول الكتب.

ثانيا

في حال اسخدمت وصل الجداول عن طريق شييفرة SQL فعليك تعيد خواص DeleteCommand و InsertCommand و UpdateCommand (بالطيع عليكي أيضا تعديل Select Command الى شيفرة SQL التي ذكرتها في البريد السابق)

في حالة استخدامك لل SQL Server يمكنك استخدام الاستعلامات المتعددة Batch Queries (آسف لهذه التسمية العربية الغبية بعض الشيئ ولكنني أعيش في ألمانيا وأعمل بها ولم أستخدم هذه المصطلحات ابدا باللغة العربية ولقد حاولت كثيرا أن أجد تسمية أفضل لكنني فشلت )

المهم عليك استخدام هذه الاستعلامات وذلك لاضافة كل جزء من السجل الناتج الى قاعدة البيانات المناسبة له. أما في حالة أكسس الذي لا يدعم هذه الاستعلامات فعليكي اضافة جزء منها عن طريق أوامر DataAdapter (أي DeleteCommand و InsertCommand و UpdateCommand ) و من ثم استخدام احداث ال DataAdapter لاضافة الجزء الباقي من السجلات الى قاعدة البيانات الملائمة له (الحدث الذي عليك استخدامه هو OnRowUpdated )

ملاحظة:

ان تعديل السجلات ضمن عدة جداول هو من اكتر الامو تعقيدا في ADO.NET فهنالك الكثير من التفاصيل الدقيقة التي لم اذكرها الآن وذلك للمحافظة على وضوح الفكرة. لذلك أنصحك بقراءة أحد الكتب المهتمة بهذا الموضوع . وفي حال اخترت اخترت أحد الطرق السابقة فانني أستطيع مساعدتك بالتفاصيل

تم تعديل هذه المشاركة بواسطة DotNetExpert في 14 ديسمبر 2003 في 14:11

وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان

بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي

يا زمان يا عشب داشر فوق هالحيطان ضويت ورد الليل عكتابي

برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي

يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو

http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3

#9

شكرا اخ DotNetExpert وبارك الله فيك

اريد توضيح للطريقة الثانية فى حاله الاكسيس

وهل تنصح بكتاب معين فى برمجة ADO.NET ,

لقد اشتريت كتاب mastering vb.net database programming ولم اجد فيه ضالتى ؟

#10

سوف أشرح لك الطريقة الثانية . لكنها مسالة طويلة بعض الشي لذلك لأوزعها على عدة أقسام وأعتقد أنني سأنهيها غدا

بالنسبة للكتب فأنصحك بكتاب Ado.NET ل David Sceppa فهو كتاب قيم بحق.

أيضا كتاب Programming ASP.NET ل Liberty & Hurwitz يعالج هذا الموضوع وان كان ليس بتفصيل الاول.

بالنسبة لبرنامجك سأعتبر أن أن جدول الكتب يحوي على رقم تسلسلي رقم الكاتب واسم الكتاب وجدول الكتاب يحتوي على رقم الكاتب واسمه.

أرفق رسما تخطيطيا لبنية قاعدة البيانات هذه.

post-62-1071523015_thumb.jpg

وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان

بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي

يا زمان يا عشب داشر فوق هالحيطان ضويت ورد الليل عكتابي

برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي

يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو

http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3

#11

الخطوة الثانية تتضمن انشاء DataAdapter جديد و تعين كل كائنات الأوامر له يدويا.

على الشكل التالي.

SelectCommand

اقتباس
SELECT b.ID AS BookID, b.Name AS BookName , a.ID AS AuthorID,a.Name As AuthorName FROM (Books b JOIN Authors a ON b.AuthorID=a.ID)

أعتقد أنو هذه الأقواس ضرورية في أكسس على عكس SQL Server.

InsertCommand

oleDbInsertCommand.CommandText = @"INSERT INTO Authors(Name) VALUES (?)";
oleDbInsertCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("Name", System.Data.OleDb.OleDbType.VarWChar, 0, "AuthorName"));

UpdateCommand

oleDbUpdateCommand.CommandText = @"UPDATE Books SET Name = ? WHERE ID = ?";
oleDbUpdateCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("Name", System.Data.OleDb.OleDbType.VarWChar, 0, "BookName"));

oleDbUpdateCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("ID", System.Data.OleDb.OleDbType.Integer, 0, "BookID"));

DeleteCommand

oleDbDeleteCommand.CommandText = @"DELETE FROM Books  WHERE ID = ?";
oleDbUpdateCommand.Parameters.Add(new System.Data.OleDb.OleDbParameter("ID", System.Data.OleDb.OleDbType.Integer, 0, "BookID"));

والفكرة هنا تتمثل في بناء شيفرة SQL مع بارامترات وربط هذه البرامترات مع الحقول المقابلة لها من الجدول

كما تلاحظ أن اضافة جداول تتم على جدول الكتاب و التعديل والحذف على جدول الكتب . وهذا ما يجب عليك عمله ولذلك لأنه يجي اضافة الكاتب والحصول على الرقم ID الخاص به قبل اضافة رقم له , كما يجي محي سجل الكتاب قبل محي الكاتب لأن بعض قواعد البيانات لا تسمح لك بمحي سجل الأب (في هذه الحالة الكاتب) قبل حذف جميع سجلات الأبناء (في هذه الحالة الكتب ) .

بالنسبة الى التعديلات اللازمة للجدول الاخر (الكتب او الكتاب حسب الحال) فذلك يجي أن يتم عن طريق الاشتراك في الحدث RowUpdated لل DataAdapter .

في حال اردت معرفة البيقية وكيف تتم التعديلات على الجدول الثاني أستطيع أن أكتبها غدا فلآن لا وقت لدي

وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان

بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي

يا زمان يا عشب داشر فوق هالحيطان ضويت ورد الليل عكتابي

برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي

يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو

http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3

#12
DotNetExpert كتب:
بالنسبة الى التعديلات اللازمة للجدول الاخر (الكتب او الكتاب حسب الحال) فذلك يجي أن يتم عن طريق الاشتراك في الحدث RowUpdated لل DataAdapter .

ارجوا توضيح RowUpdated event

#13

عذرا على التأخر

تستطيع الاستفادة من الحدث RowUpdated وذلك للقيام بالباقي من العمل عن طريق

ان اللطريقة التي تعامل هذا الحدث معرفة على الشكل التالي:

Public Delegate Sub OleDbRowUpdatedEventHandler( _
   ByVal sender As Object, _
   ByVal e As OleDbRowUpdatedEventArgs _
)

تستطيع فحص القيمة

e.StatementType

التي تعيد قيمة من النوع

StatementType

عن طريقها تستطيع معرفة نوع الحدث الذي تم على هذا السجل

والذي من الممكن ان يكون

Delete

Insert

Select

Update

عندها تستطيع القيام بالباقي من العمل

للحصول على السجل الذي تم تعديله او اذافة على تستطيع استخدام

e.Row

ملاحظة 1

للحصول على القيمة التي تولدها قاعدة البيانات بشكل تلاقائي في access 2000 فما فوق تستطيع استخدام الشيفرة التالية

SELECT @@IDENTITY

ملاحظة 2

بعد تعديل قاعدة البيانات باليد عليك استدعاء الامر

AcceptChanges()

على الكائن الذي تحصل عليه بعد استدعاء e.Row وذلك حتى لا يحاول DataAdapter حفظ هذه التغيرات مرة ثانية الى قاعدة البيانات

وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان

بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي

يا زمان يا عشب داشر فوق هالحيطان ضويت ورد الليل عكتابي

برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي

يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو

http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3

#14
DotNetExpert كتب:
ملاحظة 1

للحصول على القيمة التي تولدها قاعدة البيانات بشكل تلاقائي في access 2000 فما فوق تستطيع استخدام الشيفرة التالية

SELECT @@IDENTITY

اعتقد انه لا يعمل في access 2000 فما فوق !!

ارجوا يا اخ DotNetExpert اذا كان لديك وقت عمل مثال بسيط يوضح الطريقة كلها

#15

كيف يمكن إسترجاع قيمة الحقل التلقائى من قاعدة بيانات الأكسيس

هذا الموضوع مغلق.

مواضيع مشابهة