تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
الدرس الرابع والستون - ADO.net - الوضع المنفصل
#1
كاتب الموضوع : أحمد جمال

بسم الله الرحمن الرحيم .
السلام عليكم ورحمة الله وبركاته .


في دروسنا السابقة اقتصر حديثنا في تقنية ADO.net عن الوضع المتصل connected layer وهو الذي ينشأ رابطة مباشرة بينك وبين قاعدة البيانات بحيث تؤثر جميع تعديلاتك فيها لحظياً ، الجزء الثاني الذي تقدمه لنا هذه التقنية هي امكانية تطبيق الوضع المنفصل disconnected layer والذي يسمح لك بالتعامل مع قاعدة البيانات في الذاكرة عن طريق مجموعة من الفئات ومن ثم نقل كافة التعديلات مرة واحدة إلى قاعدة البيانات .

يتم ذلك عن طريق عمل DataAdapter يكون وسيط بين قاعدة البيانات وبين البرنامج ، ومن ثم انشاء DataSet يتم العمل عليها ثم ارسالها مرة أخرى إلى قاعدة البيانات .
تحتوي ال DataSet على أي عدد من DataTable تحتوي على كائنات DataRow و DataColumn

بقي ان نذكر بأن هذا الوضع لا يلزم فيه اي نوع من الاتصال مع قاعدة بيانات ، فال DataSet هي نفسها قاعدة بيانات لذا سنواصل دروسنا في البداية دون اي اتصال بقاعدة بيانات فعلية ثم نعود إليها مرة أخرى في نهاية الدروس .
}}}
تم الشكر بواسطة:
#2
ال DataSet :

باختصار شديد ال DataSet هي عبارة عن صورة لنظام قواعد بيانات ولكن في الذاكرة - مؤقت - ، المحتويات الأساسية لهذه الفئة هي :

الفئات الأساسية :
DataTableCollection : الجداول في هذه القاعدة .
DataRelationCollection : العلاقات بين الجداول المختلفة .
PropertyCollection : لاضافة خصائص إلى ال DataSet .


الخصائص الأساسية :
DataSetName : الاسم .
RemotingFormat : تحديد الطريقة التي يتم بها عمل serialize للمحتويات ، مثل binary او XML او غيره .


الدوال الأساسية :
AcceptChanges() : تطبيق التغييرات التي تمت على ال DataSet منذ آخر مرة تم عمل AcceptChanges لها إلى قاعدة البيانات .
RejectChanges() : الغاء جميع التعديلات التي تمت على ال DataSet منذ آخر مرة تم عمل AcceptChanges لها .
Clear() : مسح كافة محتويات ال DataSet .
Clone() : نسخ الهيكل structure لقاعدة البيانات بما فيها الجداول والعلاقات .
Copy() : نسخ الهيكل اضافة إلى جميع البيانات .
GetChanges() : معرفة كافة التغييرات التي حدثت لقاعدة البيانات منذ آخر مرة تم عمل AcceptChanges لها .
HasChanges() : قيمة Boolean تحديد فيما اذا كانت هناك تغييرات قد تمت منذ آخر مرة تم عمل AcceptChanges ام لا .
Merge() : دمج عدة DataSet .
ReadXml() و WriteXml() : الكتابة والقراءة على شكل XML من ال DataSet .


انشاء DataSet :
يمكنك انشاء DataSet عن طريق الكود بابسط طريقة بالشكل التالي :
C#:

كود :
[SIZE=3]DataSet empDataSet = new DataSet("My Employee");[/SIZE][/b][/FONT][/COLOR]

[color=#000000][FONT=arial][b]vb.net:


كود :
[SIZE=3]Dim empDataSet as DataSet = New DataSet("My Employee")[/SIZE][/b][/FONT][/COLOR]


[color=#000000][FONT=arial][b]أو يمكنك انشاءها عن طريق أدوات .net ، من قائمة الأدوات Data ستجد DataSet قم بسحبها وسيظهر لك المعالج مباشرة بالشكل التالي :


}}}
تم الشكر بواسطة:
#3
التعامل مع DataTables :

الجدول هو العنصر الاساسي والذي سيحتوي لاحقاً على صفوف وأعمدة ، الخصائص والعناصر الأساسية له هي :

Copy() : نسخ هيكل الجدول .
DataSet : ال DataSet الذي يحتوي على هذا ال Table .
PrimaryKey : ال PrimaryKey لهذا الجدول .
TableName : اسم الجدول .
ParentRelations : العلاقات التي يتحويها هذا الجدول .

انشاء DataTable :
C#:

كود :
[SIZE=3]DataTable EmployeeTable=new DataTable();[/SIZE]
[SIZE=3]EmployeeTable.PrimaryKey = new DataColumn[] { EmployeeTable.Columns[0] };[/SIZE]
vb.net:

كود :
[SIZE=3]Dim EmployeeTable As New DataTable() [/SIZE]
[SIZE=3]EmployeeTable.PrimaryKey = New DataColumn() {EmployeeTable.Columns(0)} [/SIZE]
- اضافة DataTable إلى DataSet :

C#:

كود :
[SIZE=3]empDataSet.Tables.Add(EmployeeTable);[/SIZE]
vb.net:

كود :
[SIZE=3]empDataSet.Tables.Add(EmployeeTable)[/SIZE]
}}}
تم الشكر بواسطة:
#4
التعامل مع DataColumns :

تمثل هذه الفئة عمود واحد في قاعدة البيانات ، وبمعنى آخر فإن مجموعة من ال DataColumns تشكل DataTable يحتوي على هيكل قاعدة البيانات ، المكونات الأساسية لهذه الفئة هي :

AllowDBNull : لتحديد السماح بعدم احتواء بعض القيم في هذا العمود على القيمة Null .
AutoIncrement
AutoIncrementSeed
AutoIncrementStep : تتيح لك هذه الخصائص الثلاث عمل خاصية ترقيم تلقائي كما اوضحناها في بداية دورسنا عن SQL Server ، وتستخدم لتحديد الخاصية وتحديد نقطة البداية ومقدار الزيادة مع كل مرة على الترتيب .

Caption : اسم العمود .
DataType : نوع البيانات .
DefaultValue : القيمة الافتراضية لقيم الحقول في هذا العمود .
Table : تحديد ال DataTable الذي يتبع له هذا العمود .
Unique : تحدد كون هذه القيمة غير قابلة للتكرار Primary key .
هناك مجموعة اضافية من الخصائص تجدها هنا :


انشاء DataColumns :
لنفترض انشاء قاعدة بيانات تحتوي على الرقم الذي هو مفتاح رئيسي وايضاً ترقيم تلقائي ، أما الاسم والعمر فهما لا يحتويان على أي قيم مميزة ، سيكون هذا هو شكل الإعمدة في هذا الجدول :
C#:

كود :
[SIZE=3]DataColumn EmpIDColumn = new DataColumn("ID", typeof(int));
EmpIDColumn.Caption = "Employee ID";
EmpIDColumn.ReadOnly = true;
EmpIDColumn.AllowDBNull = false;
EmpIDColumn.AutoIncrement=true;
EmpIDColumn.AutoIncrementSeed=1;
EmpIDColumn.AutoIncrementStep =1;
EmpIDColumn.Unique = true;[/SIZE]
[SIZE=3]DataColumn EmpNameColumn = new DataColumn("Name", typeof(string));
EmpNameColumn.Caption = "Employee Name";[/SIZE]
[SIZE=3]DataColumn EmpAgeColumn = new DataColumn("Age", typeof(int));
EmpNameColumn.Caption = "Employee Age";[/SIZE]

vb.net:


كود :
[SIZE=3]Dim EmpIDColumn As New DataColumn("ID", GetType(Integer))
EmpIDColumn.Caption = "Employee ID"
EmpIDColumn.[ReadOnly] = True
EmpIDColumn.AllowDBNull = False
EmpIDColumn.AutoIncrement = True
EmpIDColumn.AutoIncrementSeed = 1
EmpIDColumn.AutoIncrementStep = 1
EmpIDColumn.Unique = True [/SIZE]
[SIZE=3]Dim EmpNameColumn As New DataColumn("Name", GetType(String))
EmpNameColumn.Caption = "Employee Name" [/SIZE]
[SIZE=3]Dim EmpAgeColumn As New DataColumn("Age", GetType(Integer))
EmpNameColumn.Caption = "Employee Age" [/SIZE]


ومن ثم نضيفها إلى ال DataTable بالشكل التالي :
C#:

كود :
[SIZE=3]EmployeeTable.Columns.AddRange(new DataColumn[] { EmpIDColumn, EmpNameColumn , EmpAgeColumn });[/SIZE]


vb.net:

كود :
[SIZE=3]EmployeeTable.Columns.AddRange(New DataColumn() {EmpIDColumn, EmpNameColumn, EmpAgeColumn})
[/SIZE]
}}}
تم الشكر بواسطة:
#5
العمل مع DataRows :
تختص هذه الفئة بالتعامل مع الصفوف ، المكونات الرئيسية لهذه الفئة هي :
ItemArray : كافة بيانات هذا الصف على شكل مصفوفة array من ال objects .
Table : الجدول الذي يحتوي على هذا الصف .
AcceptChanges() : تطبيق التغييرات التي تمت على هذا الصف .
RejectChanges() : الغاء التغييرات التي تمت على هذا الصف منذ آخر مرة تم استدعاء AcceptChanges() فيها .
BeginEdit() : بدء عملية التعديل على هذا الصف .
EndEdit() : انهاء عملية التعديل وحفظ التعديلات .
CancelEdit() : الغاء عملية التعديل .
Delete() : حذف هذا الصف عند استدعاء AcceptChanges() .
IsNull() : لمعرفة قيمة عمود ما في هذا الصف وهل هي null ام لا .
RowState : حالة الصف والتي يمكن قراءتها من ال enum المسمى DataRowState والذي يحتوي على القيم التالية :



انشاء DataRows :
لا يمكن انشاء DataRows مباشرة ، مثل هذا السطر سوف ينشأ خطأ :

C#:

كود :
DataRow r = new DataRow();



vb.net:
كود :
DataRow r = new DataRow()




لكن لا بد من انشاء DataRow من نسخة من الجدول ، هذا المثال لانشاء نسخة من DataRow ووضع قيم بعض الصفوف فيها حسب الجدول الذي قمنا بعمله في البداية .
C#:
كود :
[FONT=arial][b]DataRow EmpRow = EmployeeTable.NewRow();[/b][/FONT]
كود :
EmpRow["Name"] = "Ahmed Gamal";
EmpRow["Age"] = 22;
EmployeeTable.Rows.Add(EmpRow);
EmpRow = EmployeeTable.NewRow();
EmpRow[1] = "Ahmed Essawy";
EmpRow[2] = 23;
EmployeeTable.Rows.Add(EmpRow);




vb.net:
كود :
[FONT=arial][b]Dim EmpRow As DataRow = EmployeeTable.NewRow() [/b][/FONT]
كود :
EmpRow("Name") = "Ahmed Gamal"
EmpRow("Age") = 22
EmployeeTable.Rows.Add(EmpRow)
EmpRow = EmployeeTable.NewRow()
EmpRow(1) = "Ahmed Essawy"
EmpRow(2) = 23
[FONT=Tahoma][FONT=arial][b]EmployeeTable.Rows.Add(EmpRow) [/b][/FONT][/FONT]





لو لاحظت اننا لم نضع الحقل ID نظراً لإنه ترقيم تلقائي ، كما ان الحالة الأولى فيها الوصول للحقول بالاسم اما الثانية فبرقم ال Index .
}}}
تم الشكر بواسطة:
#6
- مثال شامل : معرفة كل الجداول في قاعدة البيانات DataSet ومعرفة الصفوف والأعمدة :
C#:


كود :
[SIZE=3]Text1.Text="";
foreach (DataTable dt in empDataSet.Tables)
{
Text1.Text+=dt.TableName + ":\n\r";[/SIZE]
[SIZE=3]for (int curCol = 0; curCol < dt.Columns.Count; curCol++)
{
Text1.Text+= (curCol+1).ToString() + dt.Columns[curCol].ColumnName+"\n\r";
}[/SIZE]
[SIZE=3]Text1.Text="Rows: \n\r";
for (int curRow = 0; curRow < dt.Rows.Count; curRow++)
{
for (int curCol = 0; curCol < dt.Columns.Count; curCol++)
{
Text1.Text+= dt.Rows[curRow][curCol].ToString() + " - ";
}
}
}[/SIZE]

vb.net:
كود :
Text1.Text="";
foreach (DataTable dt in empDataSet.Tables)
{
Text1.Text+=dt.TableName + ":\n\r";
for (int curCol = 0; curCol < dt.Columns.Count; curCol++)
{
Text1.Text+= (curCol+1).ToString() + dt.Columns[curCol].ColumnName+"\n\r";
}
Text1.Text="Rows: \n\r";
for (int curRow = 0; curRow < dt.Rows.Count; curRow++)
{
for (int curCol = 0; curCol < dt.Columns.Count; curCol++)
{
Text1.Text+= dt.Rows[curRow][curCol].ToString() + " - ";
}
}
}

}}}
تم الشكر بواسطة:
#7
استخدام DataTableReader لقراءة البيانات من DataTable :

C#:

كود :
Text1.Text="";
DataTableReader dtReader = dt.CreateDataReader();
while (dtReader.Read())
{
for (int i = 0; i < dtReader.FieldCount; i++)
{
Text1.Text+= dtReader.GetValue(i).ToString();
}
}

vb.net:

كود :
[SIZE=3]Text1.Text = ""
Dim dtReader As DataTableReader = dt.CreateDataReader()
While dtReader.Read()
For i As Integer = 0 To dtReader.FieldCount - 1
Text1.Text += dtReader.GetValue(i).ToString()
Next
End While [/SIZE]
}}}
تم الشكر بواسطة:
#8
عمل Serializing إلى XML :
C#:

كود :
[SIZE=3]EmpDataSet.WriteXml("Employee.xml");[/SIZE]

vb.net:

كود :
[SIZE=3]EmpDataSet.WriteXml("Employee.xml")[/SIZE]

أو العكس :
C#:

كود :
[SIZE=3]EmpDataSet.ReadXml("Employee.xml");[/SIZE]

vb.net:

كود :
[SIZE=3]EmpDataSet.ReadXml("Employee.xml")[/SIZE]

سيكون ناتج الملف Employee.xml بهذا الشكل تقريباً :


كود :
[color=#000080]<?xml version=[COLOR=#0000ff]"1.0"[/color] standalone=[color=#0000ff]"yes"[/color]?>[/COLOR]
[color=#000080]<Employee_XML>[/color]
[color=#000080]<Employee>[/color]
[color=#000080]<ID>[/color]1[color=#000080]</ID>[/color]
[color=#000080]<Name>[/color]Ahmed Gamal[color=#000080]</Name>[/color]
[color=#000080]<Age>[/color]22[color=#000080]</Age>[/color]
[color=#000080]</Employee>[/color]
[color=#000080]<Employee>[/color]
[color=#000080]<ID>[/color]2[color=#000080]</ID>[/color]
[color=#000080]<Name>[/color]Ahmed Essawy[color=#000080]</Name>[/color]
[color=#000080]<Age>[/color]23[color=#000080]</Age>[/color]
[color=#000080]</Employee>[/color]
[color=#000080]</Employee_XML>[/color]


نكتفي بهذا القدر في درسنا لهذا اليوم ، نواصل في دروس لاحقة إن شاء الله .

والله الموفق ...
والسلام عليكم ورحمة الله وبركاته .
}}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم