كيف نقوم بوضع محتويات DataReader فى DataTable ?
عندى سؤال اخر
كيف نقوم بملا DataGrid باكثر من حقل لاكثر من جدول ثم كيف نقوم بتحديث هذه الحقول
الموجوده فى اكثر من جدول !!!!!!!!!
كيف نقوم بوضع محتويات DataReader فى DataTable ?
عندى سؤال اخر
كيف نقوم بملا DataGrid باكثر من حقل لاكثر من جدول ثم كيف نقوم بتحديث هذه الحقول
الموجوده فى اكثر من جدول !!!!!!!!!
للانتقال من سجل الى سجل ضمن 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
الـ DataReader يمكن اعتبارها DataTable حيث يمكنك أن تنفذ عملية Bind الى DataReader تماما كما تفعل مع DataTable..
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
يا اخ BAZRAMIT هل يمكن توضيح كيف يتم الربط DataReader ولو بمثال بسيط
توضيح السؤال الثانى :
لديك جدول المؤلفين و جدول الكتب داخل قاعدة بيانات منشأة بالأكسيس
والذى يوجد بينهما علاقة
نريد عرض حقل رقم المؤلف وحقل إسم المؤلف الموجودان فى جدول المؤلفين مع
حقل إسم الكتاب الموجود فى جدول الكتب داخل Datagrid كيف يتم ذلك ؟
ونريد إضافة زر جديد وزر تعديل وعند الضغط على زر جديد يسمح لنا بإضافة سجل جديد داخل Datagrid وبحيث يتم إضافة هذا السجل فى الجدولين المذكوران وبالمثل زر التعديل
فكيف يتم ذلك ؟
لربط DataReader فورا استخدم الطريقة التالية
myDataGrid.DataSource = myDataReader;
ولكنك عندها لن تستطيع تعديل البيانات فهذه الطريقة تملأ الـ DataGrid لكنها لا تحتفظ باثر لهذه البيانات فأنصحك بالابتعاد عنها.
إن كنت تبحث عن السهولة فاستخدم الطريقة Fill() للـ DataAdapter .
تم تعديل هذه المشاركة بواسطة DotNetExpert في 14 ديسمبر 2003 في 14:56
وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان
بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي
يا زمان يا عشب داشر فوق هالحيطان ضويت ورد الليل عكتابي
برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي
يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو
http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3
بالنسبة لعرض سجلات من عدة قواعد بيانات معا فهناك عدة طرق
اولا
تستطيع ملئ كل من جدول المؤلفين وجدول الكتب في 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
الأن ننتقل للمشكلة الفعلية وهي تعديل البيانات
اولا
اذا كنت تستخدم جداول منفصلة لكل جدول فعلي مقابل في قاعدة البيانات فان تعدل اي سجل هو شي سهل . كل ما عليك هو تعديل القيمة ضمن 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
شكرا اخ DotNetExpert وبارك الله فيك
اريد توضيح للطريقة الثانية فى حاله الاكسيس
وهل تنصح بكتاب معين فى برمجة ADO.NET ,
لقد اشتريت كتاب mastering vb.net database programming ولم اجد فيه ضالتى ؟
سوف أشرح لك الطريقة الثانية . لكنها مسالة طويلة بعض الشي لذلك لأوزعها على عدة أقسام وأعتقد أنني سأنهيها غدا
بالنسبة للكتب فأنصحك بكتاب Ado.NET ل David Sceppa فهو كتاب قيم بحق.
أيضا كتاب Programming ASP.NET ل Liberty & Hurwitz يعالج هذا الموضوع وان كان ليس بتفصيل الاول.
بالنسبة لبرنامجك سأعتبر أن أن جدول الكتب يحوي على رقم تسلسلي رقم الكاتب واسم الكتاب وجدول الكتاب يحتوي على رقم الكاتب واسمه.
أرفق رسما تخطيطيا لبنية قاعدة البيانات هذه.
وحدن بيبقو متل زهر البيلسان وحدهن بيقطفو وراق الزمان
بيسكرو الغابي بيضلهن متل الشتي يدقوا على بوابي على بوابي
يا زمان يا عشب داشر فوق هالحيطان ضويت ورد الليل عكتابي
برج الحمام مسور و عالي هج الحمام بقيت لحالي لحالي
يا ناطرين التلج ما عاد بدكن ترجعو صرخ عليهن بالشتي يا ديب بلكي بيسمعو
http://www.mazikana.com/Songs/F/Fayrouz/mp...uz---Wahdon.mp3
الخطوة الثانية تتضمن انشاء 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
DotNetExpert كتب:بالنسبة الى التعديلات اللازمة للجدول الاخر (الكتب او الكتاب حسب الحال) فذلك يجي أن يتم عن طريق الاشتراك في الحدث RowUpdated لل DataAdapter .
ارجوا توضيح RowUpdated event
عذرا على التأخر
تستطيع الاستفادة من الحدث 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
DotNetExpert كتب:ملاحظة 1للحصول على القيمة التي تولدها قاعدة البيانات بشكل تلاقائي في access 2000 فما فوق تستطيع استخدام الشيفرة التالية
SELECT @@IDENTITY
اعتقد انه لا يعمل في access 2000 فما فوق !!
ارجوا يا اخ DotNetExpert اذا كان لديك وقت عمل مثال بسيط يوضح الطريقة كلها
كيف يمكن إسترجاع قيمة الحقل التلقائى من قاعدة بيانات الأكسيس
هذا الموضوع مغلق.