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

إكتشف أسرار الDataSet

مغلق
بدأه ahmedd في 15 أبريل 2007 · 29 رد · 10,608 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

ملحق رقم 1 : إكتشف أسرار الDataSet .

كما وعدتكم من قبل ووعدت اخي العزيز / ياسر الشيخ , بالمشاركة في درس في ADO.NET من الصفر إلى الإحتراف .

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

وأود ان اعتذر للجميع عن تأخري في طرح المشاركات في الفترة السابقة وذلك لإنشغالي الشديد في احد المشاريع التي اقوم بإعدادها واحمد الله قارب على

الإنتهاء وإن شاء الله سوف ادلو بما لدي من معلومات ليستفيد منها الجميع .

مقدمة : الData Set

هذه الأدات العجيبة والمرنة والتي تمكن المبرمج من الوصول الى كل مايريد لدرجة انني اعتبرها اخطبوط التحكم بقاعدة البيانات

حتى انني بدائت اشك بجدوى استخدام BindingSource وال DataView والBindingNavigator والادوات الاخرى وجدوى استخدامها ,

وبما أن 80% من قوعد البيانات التي تعتمد في الوضع المنفصل على الDataset فيجب ان لا يمر موضوعها مرور الكرام , سوف نتناولها بالتفصيل إن شاء الله

التكوين الداخلي لل Data Set :

في الحقيقة تعتبر Dataset مخزن يتم ملأه بعدد من الجداول التي يتم إستدعائها من مصدر البيانات مثل Access وSql Server و Oracl و MySql

وذلك بأستخدام طريقة fill للDataAdapter مثل XXXDataAdapter.Fill(DataSet) و ستنتج من ذلك ان البناء الداخلي لل DataSet

هو عبارة عن مخطط لعدد غير محدود لل Tables ويمكن تفصيل هذه الجدول الى حقول وصفوف كذلك قبول العلاقات بين الجداول

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

كذلك نستطيع حفظ البيانات واستدعائها دون الحاجة الى Access وSql Server و Oracl و MySql .

في هذا الملحق سوف نتناول مثال تفصيلي لبناء قاعدة بيانات تتكون من جدولين والربط بينهما كذلك بناء الصفوف والاعمدة وذلك للتوضيح وفهم المطليوب .

--------------------------------------------------------------------------------------------------------------------------------

بناء الDataset من الصفر :

هنالك طريقتين لبناء الداتا سيت وهي اما سحب اداة الDataset من صندوق الادوات وقذفها على النموذج وهذه الطريقة بالنسبة لي غير محببة خصوصا للمبتدئين

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

الطرقية الثانية هي بناء Dataset عن طريق كود ثم الكود وهي الطريقة التي سوف نعتمد عليها لبناء Dataset فل نبدء .

عند بناء الي داتا سيت جديد يتم التعرفة اولا عن متغير من نوع داتا سيت مثل :

Dim my_Dataset as DataSet()

بعد ذلك يتم إسناد هذا المتغير على انه من نوع داتا سيت جديد مثل :

my_Dataset = new Dataset()

بهذا السطرين نكون قد بنينا داتا سيت جديد عن طريق الكود , سوف تتضح الصورة اكثر إن شاء الله مع الامثلة المقبلة .

بناء الجداول داخل Dataset :

يتم بناء الجداول داخل الداتا سيت باستخدام كائن DataTable ثم يتم بعد ذلك اسناد او زرع كائن DataTable داخل الداتا سيت باستخدام الكود التالي :

my_Dataset.Tables.Add( Data Table Name )

لكي تكون الصورة أكثر وضوحاً فلنتناول هذا المثال التطبيقي لكيفية بناء جدول داخل الداتا سيت :

مثل تطبيقي رقم 1 : لنفرض انه لدينا جدول بسيط لمعلومات الموظفين (emp_info) يحتوى على ( رقم الموظف - الاسم الاول - الاسم الاخير ) ( id , FrirstName , LastName)

	Dim my_dataset As DataSet
	Dim my_emp_table As DataTable

		'buid my dtat set
		my_dataset = New DataSet()
		'buid my emp info table
		my_emp_table = New DataTable("emp_info")

		'buid my table colums 
		my_emp_table.Columns.Add("id", GetType(Integer))
		my_emp_table.Columns.Add("FirstName", GetType(String))
		my_emp_table.Columns.Add("LastName", GetType(String))

		'add my table to my dataset 
		my_dataset.Tables.Add(my_emp_table)

في المثال رقم 1 قمنا ببناء Dataset جديد بعد ثم قمنا بالتعرفة عن كائن DataTable سميناه emp_info ثم قمنا بتكملة بناء الجدول وبناء الحقول

وتحديد كل حقل ونوعة , بعد ذلك قمنا بإدراج الجول الى الDataset باستخدام السطر الاخير من الكود , بذلك نكون قد انتهينا من بناء اول جدول ولكن مازال هذا الجدول

خالياً من اي قيمة ولإدراج القيم داخل الجدول الذي قمنا ببنائه هنالك ثلاث طرق , طرقتين باستخدام المصفومات وطريقة باستخدام كائن DataRow ,

الطريقة الاولى : ( مصفوفة )

		'add new row by arry 1 
		Dim add_new_row_1(2) As String
		add_new_row_1(0) = 1
		add_new_row_1(1) = "Ahmed"
		add_new_row_1(2) = "Al Saeed"
		my_emp_table.Rows.Add(add_new_row_1)

الطريقة الثانية : ( مصفوفة )

		'add new row by arry 2 
		Dim add_new_row_2() As String = {2, "Ali", "Malik"}
		my_emp_table.Rows.Add(add_new_row_2)

الطرقية الثالثة : كائن (DataRow )

		'add new row by DataRow Object
		Dim add_new_row_3 As DataRow
		add_new_row_3 = my_emp_table.NewRow
		add_new_row_3.Item("id") = 3
		add_new_row_3.Item("FirstName") = "Saleh"
		add_new_row_3.Item("LastName") = "Majed"
		my_emp_table.Rows.Add(add_new_row_3)

لنعود الى مثالنا الاول ونضيف الطرق الثلاث الى المثال ونتاكد من عملها :

	Dim my_dataset As DataSet
	Dim my_emp_table As DataTable

		'buid my dtat set
		my_dataset = New DataSet()
		'buid my emp info table
		my_emp_table = New DataTable("emp_info")

		'buid my table colums 
		my_emp_table.Columns.Add("id", GetType(Integer))
		my_emp_table.Columns.Add("FirstName", GetType(String))
		my_emp_table.Columns.Add("LastName", GetType(String))

		'add my table to my dataset 
		my_dataset.Tables.Add(my_emp_table)

		'add new row by arry 1 
		Dim add_new_row_1(2) As String
		add_new_row_1(0) = 1
		add_new_row_1(1) = "Ahmed"
		add_new_row_1(2) = "Al Saeed"
		my_emp_table.Rows.Add(add_new_row_1)

		'add new row by arry 2 
		Dim add_new_row_2() As String = {2, "Ali", "Malik"}
		my_emp_table.Rows.Add(add_new_row_2)

		'add new row by DataRow Object
		Dim add_new_row_3 As DataRow
		add_new_row_3 = my_emp_table.NewRow
		add_new_row_3.Item("id") = 3
		add_new_row_3.Item("FirstName") = "Saleh"
		add_new_row_3.Item("LastName") = "Majed"
		my_emp_table.Rows.Add(add_new_row_3)

		'show data by DataGridviwe
		DG1.DataSource = my_emp_table
		DG2.DataSource = my_dataset.Tables("emp_info")

ولإظهار النتائج على الفورم قمت باضافة اداتين DataGridviwe وهي DG1 DG2 وبينت طريقتين مختلفتين لإستخدامها لعرض النتائج .

قم بتحميل هذا المثال all data set 1 اسفل الصفحة .

حفظ البيانات واستدعائها دون الحاجة الى Access وSql Server و Oracl و MySql :

كما قلنا سابقا بأنه يمكننا تخزين البيانات داخل ملف من نوع Xml ولكن لاتسالني عن حجم الملف وسعتة التخزينية لانني لم اجد جواباَ لهذا السؤال بعد

المهم لحفظ البيانات نقوم باضافة button ونسميه Save Data نكتب الكود التالي :

my_dataset.WriteXml("c:\my_dataset.ds")

قم باضافة سطر جديد داخل DataGridviwe وضغط على زر Save Data سيقوم البرنامج بحفظ هذا السطر الجديد داخل الملف بنجاح ولا كن كيف

نظهر نتائج المخزنة في الملف قم باضافة button وسمه Load Data وكتب الكود التالي :

		my_dataset.Clear()
		my_dataset.ReadXml("c:\my_dataset.ds")

قم بتحميل هذا المثال all data set 2 اسفل الصفحة

في التتمة القادمة سوف نشرح المزيد عن اخطبوط قواعد البيانات DataSet وانشاء اللله يكون الدرس واضحاَ للجميع وبالتوفيق .

تحياتي .

all_data_set_1.rar

all_data_set_2.rar

2
#2

درس جميل ورائع ومفيد بس سبقتنى فيه زادكم الله من علمه وجعلك حريص على نشره

لن تبلغ المجد حتى تلعق الصبرااااااااا

#4

ماشاء الله تبارك الله ، رائع جداً ،،

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

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

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

لا أريد أطيل عليك أو أن أضغط عليك ولكنا ننتظرك بفارغ الصبر وإلى المزيد من الإبداع ..

1 - سقوط الإنسان ليس فشلاً ، ولكن الفشل أن يبقى حيث سقط .

2 - الفاشلون قسمان : قسم فكر ولم يفعل ، وقسم فعل ولم يفكر .

-------------------------------------------------------

درس في ADO.NET 2005, التعامل مع الجداول المترابطة في ado.net 2005

درس في الإجراءات الفرعية ( العامة )

درس في ADO.NET من الصفر إلى الإحتراف .

#5

درس جميل ومفيد

جزاك الله خيرا

بانتظار تكملة الدرس بفارغ الصبر

#6

السلام عليكم ورحمة الله

ما شاء الله اخونا Ahmedd بارك الله فيك وجعله فى ميزان حسناتك وزادك علما وفهما.

والله يا اخى درس رائع ولو انك تأخرت علينا فيه منذ انا اعنلت عنه فى موضوع الاخ ياسر ولكن روعة الدرس تغفر لك تأخرك علينا.

ونحن فى انتظار دروسك الاخرى واعانك الله علينا وجزاك الله عنا بكل الخير.

#7

اخي الفاضل Ahmedd

عندي سؤال محيرني اريد الاجابة عليه

هل الربط بالكود افضل من المعالج ؟؟؟؟؟؟

وشكراً

#8

السلام عليكم ورحمة الله وإن شاء الله تكون احوال الجميع بخير

اول احب اشكركم على تفاعلكم الجميل معي في الدرس السابق واكثر شي اسرني هو النشجيع بعضنا البضع لنشر المعرفة

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

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

بسم الله نبدء

في هذا الدرس إن شاء الله سوف نتحدث عن مجموعة مهم من خواص كائن DataTable و كائن DataRow التي تعتبر دنمو المحرك للDataSet مثل :

1- القيم الخالية Null value

2- الأضافة الوتوماتيكية AutoIncrement

3- البداية الإفتراضية AutoIncrementSeed

4- الزيادة AutoIncrementStep

5- مفتاح الجدول Primary Key .

6- القيمة الفريدة UniqeConstraint

في الدرس السابق قمنا ببناء dataset جديد كذلك قمنا ببناء جدول emp_info واضفناة بداخلة كذلك قمنا ببناء الحقول

ولكن لا يزال هذا الجدول يشوبة كثير من القصور فلو انك قمت اضافة اسم لشخص في حقل FirstName وتركت

كل من الحقلين id , LastName وقمت بالضغط على رز Save Data سوف تلاحظ انه قام بعملية التخزين ولكن

بقي الحقلين الاخرين خاليين من القيم اذا كيف نعالج هذا المشكل هنا ياتي عمل الخاصية Null value الخاصة بكائن DataTable

التي تمنع وجود قيم خالية في الحقول باستخدام الكود :

		DataTable.Columns(" Columns Name ").AllowDBNull = False

فل نعد الى مثالنا السابق ونضيف الكود لنمنع القيم الخالية من الجدول :

		'buid my dtat set
		my_dataset = New DataSet()

		'buid my emp info table
		my_emp_table = New DataTable("emp_info")

		'buid my table colums 
		my_emp_table.Columns.Add("id", GetType(Integer))
		my_emp_table.Columns.Add("FirstName", GetType(String))
		my_emp_table.Columns.Add("LastName", GetType(String))
		'disAllow null value 
		my_emp_table.Columns("id").AllowDBNull = False
		my_emp_table.Columns("FirstName").AllowDBNull = False
		my_emp_table.Columns("LastName").AllowDBNull = False

		'add my table to my dataset 
		my_dataset.Tables.Add(my_emp_table)

هنا انتهينا من اجبار المستخدم على ملء الحقول وعدم تركها فارغة ولكن ينبغي على المبرمج ان ينتبه

الى انه يجب ان تكون هذا الخاصية ( متوافقة ) مع مصدر البيانات التي يستخدمها فليس من المنطقي ان يجعل

حقل id لا يقبل قيم فارغة في قاعدة البيانات وفي البرنامج يكتب الخاصية AllowDBNull = True فمن

الطبيعي حدوث خطاْ عند التشغيل .

الخاصية AutoIncrement : تعمل هذا الخاصية على ملء الحقل او الأضافة اوتوماتيكيا باستخدام الكود :

DataTable.Columns("Columns Name").AutoIncrement = True

الخاصية AutoIncrementSeed : هذا الخاصية يعتمد عليها AutoIncrement وهي تقوم باخبارة بأي قيم إفتراضية يبدء :

DataTable.Columns("Columns Name").AutoIncrementSeed = Value

الخاصية AutoIncrementStep : تقوم هذه الخاصية محل العداد تقوم باضافة عدد بمقدار معيين :

DataTable.Columns("Columns Name").AutoIncrementStep = Value

لكي تكون الصورة اكثر وضوحاً لنعد الى مثالنا الاول وخصوخاً الحقل id فنحن نريد من البرنامج ان يقوم بملء هذا

الحقل اوتوماتيكيا وان يبدء من القيمة الافتراضية رقم 1 وان تكون الزيادة في كل سجل جديد عدد فردي , فنحن لا نريد من

المستخدم ان يقوم بوضع رقم اعشوائي من عندة :

 'buid my dtat set
		my_dataset = New DataSet()

		'buid my emp info table
		my_emp_table = New DataTable("emp_info")

		'buid my table colums 
		my_emp_table.Columns.Add("id", GetType(Integer))
		my_emp_table.Columns.Add("FirstName", GetType(String))
		my_emp_table.Columns.Add("LastName", GetType(String))
		'disAllow null value 
		my_emp_table.Columns("id").AllowDBNull = False
		my_emp_table.Columns("FirstName").AllowDBNull = False
		my_emp_table.Columns("LastName").AllowDBNull = False

		my_emp_table.Columns("id").AutoIncrement = True
		my_emp_table.Columns("id").AutoIncrementSeed = 1
		my_emp_table.Columns("id").AutoIncrementStep = 2

		'add my table to my dataset 
		my_dataset.Tables.Add(my_emp_table)

قم بتحميل مثال رقم all data set 3 اسفل الصفحة وكتب اسم مستخدم جديد داخل DataGridviwe مباشرة لترى النتيجه .

خاصية القيمة الفريدة UniqeConstraint : هذه الخاصية من هم الخواص فهي المسؤله بعدم السماح تكرار القيم فمثلا حقل id

يجب ان يكون فريدا ويجب ان نمنع عملية التكرار , هنالك طريقتين للUniqe وهي اما جعل الحقل id في الجدول Uniqe مباشر مثل :

DataTable.Columns("Columns Name").Unique = True

وفي مثالنا العملي يكون :

my_emp_table.Columns("id").Unique = True

او التعريف عن متغير جديد من نوع UniqueConstraint ويسند الى الحقل المطلوب هذه الطريقة تعتمد على Constraints الخاصة بالكائن DataTable :

		unique = New UniqueConstraint(Data Columns)

		Data Table.Constraints.Add(unique)

حسنن سوف نستخدم الطريقة الثانية في مثالنا لتكون اكثر وضوحا للجميع :

 'bulid unique column for id 
		Dim my_data_col_id As DataColumn
		Dim unique As UniqueConstraint
		my_data_col_id = my_emp_table.Columns("id")
		unique = New UniqueConstraint(my_data_col_id)
		'add my unique column
		my_emp_table.Constraints.Add(unique)

خاصية مفتاح الجدول Primary Key : هذه الخاصية معروفة للجميع هي اعطاء ال Table مفتاح رئيس ولها طريقتين ايضا :)

وكلا الطريقتين تعتمد على المصفوفات وهي كالتالي :

DataTable.PrimaryKey = New DataColumn() {Data.Columns("Columns Name")}

وفي مثالنا يكون الكود :

 my_emp_table.PrimaryKey = New DataColumn() {my_emp_table.Columns("id")}

الطريقة الثانية تعتمد على متغير من نوع مصفوفه مثل :

		Dim primkey(0) As DataColumn
		primkey(0) = DataTable.Columns("Columns Name")
		DataTable.PrimaryKey = primkey

وفي مثالنا يكون كالتالي :

		Dim primkey(0) As DataColumn
		primkey(0) = my_emp_table.Columns("id")
		my_emp_table.PrimaryKey = primkey

حسنن لنعد لمثالنا السابق ونطبق المطلبو :) لا تتذمر من طول الكود فانت مبرمج :

		'buid my dtat set
		my_dataset = New DataSet()

		'buid my emp info table
		my_emp_table = New DataTable("emp_info")

		'buid my table colums 
		my_emp_table.Columns.Add("id", GetType(Integer))
		my_emp_table.Columns.Add("FirstName", GetType(String))
		my_emp_table.Columns.Add("LastName", GetType(String))
		'disAllow null value 
		my_emp_table.Columns("id").AllowDBNull = False
		my_emp_table.Columns("FirstName").AllowDBNull = False
		my_emp_table.Columns("LastName").AllowDBNull = False

		my_emp_table.Columns("id").AutoIncrement = True
		my_emp_table.Columns("id").AutoIncrementSeed = 1
		my_emp_table.Columns("id").AutoIncrementStep = 2

		'bulid unique column for id 
		Dim my_data_col_id As DataColumn
		Dim unique As UniqueConstraint
		my_data_col_id = my_emp_table.Columns("id")
		unique = New UniqueConstraint(my_data_col_id)
		'add my unique column
		my_emp_table.Constraints.Add(unique)

		'add a PrimaryKey to my emp table
		my_emp_table.PrimaryKey = New DataColumn() {my_emp_table.Columns("id")}


		'add my table to my dataset 
		my_dataset.Tables.Add(my_emp_table)



		'add new row by DataRow Object
		Dim add_new_row As DataRow
		add_new_row = my_emp_table.NewRow
		add_new_row.Item("id") = 1
		add_new_row.Item("FirstName") = "Ahmed"
		add_new_row.Item("LastName") = "Al Saeed"
		my_emp_table.Rows.Add(add_new_row)


		'show data by DataGridviwe
		DG1.DataSource = my_dataset.Tables("emp_info")

حمل المثال رقم all data set 4 لترى المثال بالتفصيل .

في التتمة القادمة سوف نشرح المزيد عن اخطبوط قواعد البيانات DataSet وانشاء اللله يكون الدرس واضحاَ للجميع وبالتوفيق .

تحياتي .

all_data_set_3.rar

all_data_set_4.rar

1
#9

اهلا اخي ميدو666 المعالج اسرع في تنفيذ الكود حسب كلام ميكروسوفت والسبب ان الكود المخزن وتم التحقق منه مسبقا

اما كتابة الكود من الصفر فان البرنامج يتحقق منه اولا قبل التنفيذ .

#10

الشكر الجزيل على المجهود الجبار للاخ Ahmedd

واعجبني وصف الداتاست بالأخطبوط .. لانه فعلا متشعب العلاقات

ولكن لدى ملاحظتين أرجو أن تكون مفيده :

1.

اقتباس
حتى انني بدائت اشك بجدوى استخدام BindingSource وال DataView والBindingNavigator والادوات الاخرى وجدوى استخدامها

الداتافيو يستخدم للعرض فقط وليس لجلب البيانات مثل الداتاست

2.كاضافة الى المقال أنوه بأن المصدر للداتاست هو System.data لانه في بعض الاحيان عند تعريف DataSet تحتاج الى اضافة مصدر الObject الى المشروع

3. الداتاست عملت أصلا اعتمادا على XML فهي في الاصل تجلب البيانات وتخزنها على الClient لتسهيل التعامل معها كبيئة منفصلة ..

#11

الله عليك يا أخي انت فعلاً فنان

الله يعطيك ألف عافية ومنتظرين المزيد

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#12

ممكن اسال سوال صغير

الحين وش المرادف لل dataset

يعني انا وش ممكن استخدم غير ال dataset

وتوفي بنفس الغرض؟؟؟؟؟؟؟؟؟؟

تحياتي،،،

هناك شئ ما يدفعني دائما للتقدم

((حبي لوطني))

KSA

#13

لا توجد أداة توفي بنفس الغرض الذي يقوم به الداتا ست لان الداتا ست تأتي بجداول كامله

وعلى النغيض ممكن استخدام الDatareader لجلب صف من جدول أو قيمة مفردة

#14

السلام عليكم

اسف على طول الغياب , اليوم إن شاء الله سوف نكمل الحديث عن خواص ال DataTable التابع للDataSet

حسناً قبل الحديث عن الخواص وحتى لا تتشابك المور على البعض بنيغي علينا ان نطلع على الرسم التالي

dataset.JPG

من الرسم تتضح الصورة اكثر وهو ان الData Set مخزن يندرج تحتة الData Table و ال Data Relation

وال Data Table يندرج تحتة Data Colum والData Row فكلما استطعت التحكم بهذه الكائنات بفاعلية كلما

سيطرت على الData Set من هنا نشاهد ان ADO.net اثبتت قوتها وفاعليتها وفتحت الباب اما المبرمجين للتحكم الدقيق بقواعد البيانات

والدليل على ذلك ان الكائنات التي تندرج تحت ADO.net مثل :

1- كائن الاتصال Data Connection بانواعة oleConnection , sqlConnection ......الخ يعطيك القدرة للتحكم بالاتصال لمصدر البيانات

2- كائن الاوامر Data Commad بانواعة وخصائصة يعطيك القدرة لتمرير اوامر الsql بانواعها على قاعدة البيانات لتنفيذها

3- كائن القراءة Data Reader بانواعة وخصائصة يعطيك القدرة على قراءة البيانات

4- كائن الوصل Data Adapter بانواعة وخصائصة يعطيك القدرة على ملء الData Set والتحديث والحذف والإضافة لمصدر البيانات

5- كائن البيانات Data Set بخواصة وكائناتة يعطيك القدرة الكبيرة للتحكم بالجداول والاعمدة والصفوف وربط الجداول Data Relation .

هذه الخيول الخمسة هي روح ADO.NET فماذ يريد المبرمج اكثر من ذلك للتحكم بقواعد البيانات فهي توصلك لكل ما تريد :)

حسنأً بعد هذه المقدمه لنعد للخيل الخامس الData Set سنتحدث عن بعض الخصائص مثل :

1- DefaultValue و Expression و Max Length التابع للكائن Data Colum .

2- GetXml و GetXmlSchema التابعة للداتا سيت .

3-Delet Row , RemoveAt التابع لل Data Row

4- Find التابعه لل Data Row

4- ملء الDataset بطريقة امنة من مصدر البيانات .

5- توضيح يعض الطرق التي يستخدمها المحترفين للDataset .

بسم الله نبداء

1-في درسنا السابق تحدثنا عن خاصية AutoIncrement و AutoIncrementSeed و AutoIncrementStep التابع لل Data Colum

وفائدها وطريقة استخدامها اليوم لدينا MaxLength هذه الخاصية مسؤوله عن اعطاء الحقل مدى لعدد الارقام او الاحرف بداخله ويجب عدم تخطيها

فمثلا حقل الاسم الاول ("Fname" ) في مثالنا رقم 1 لا نريد من المستخدم ادخال قصه حياتة داخل هذا الحقل فمن الطبيعي ان الاسم الاول لي شخص

لا يتعدا 15 حرفا وفي اسوء الحالات 20 حرف :) اعتقد وضحت الفكرة من المقصود :

 Table Name.Columns(" Column Name  ").MaxLength = 20

مفي مثالنا رقم 1 يكون :

		my_emp_table.Columns("FirstName").MaxLength = 20

	   my_emp_table.Columns("LastName").MaxLength = 20

الخاصية Expression : واحده من اجمل الخصائص التابعه للData Colum ومفيدة جداً وهي المسؤوله عن العمليات الرياضية فمثلا

لو كان لدينا حقل اسمه Salary و من المعروف ان لدينا في المملك العرية السعودية ان الموظف 9% من الراتب الشهري الي مصلحة التقاعد

واردنا ان نخزن نسبة الأقتطاع في حقل اخر مثل Salary_Deduction هنا تاتي فائدتها هذه الخاصية :

	
		Data Table.Columns(Colum Name).Expression = " [salary] * (0.09)"

حسناَ حتى يكون المقصود واضحا لنقم ببناء مثالنا الثاني لجدول لفتراضي لرواتب الموظفين يحتوي على ( 4 ) حقول هو DI و Salary

و Salary_Deduction و Total_Salary ونحدد خواصة ومتطلاباتة :)

		 Dim my_dataSet As New DataSet

		Dim my_salary As New DataTable("Salary_Table")

		my_salary.Columns.Add("ID", GetType(Int32))
		my_salary.Columns.Add("Salary", GetType(Decimal))
		my_salary.Columns.Add("Salary_Deduction", GetType(Integer))
		my_salary.Columns.Add("Total_Salary", GetType(Integer))
		'======================================================
		my_salary.Columns("ID").AllowDBNull = False
		my_salary.Columns("ID").Unique = True
		my_salary.Columns("ID").AutoIncrement = True
		my_salary.Columns("ID").AutoIncrementSeed = 1
		my_salary.Columns("ID").AutoIncrementStep = 1

		Dim primkey(0) As DataColumn
		primkey(0) = my_salary.Columns("id")
		my_salary.PrimaryKey = primkey
		'======================================================
		my_salary.Columns("salary").DefaultValue = (0.0)
		my_salary.Columns("Salary_Deduction").Expression = " [salary] * (0.09)"
		my_salary.Columns("Total_Salary").Expression = " [Salary] - [Salary_Deduction]"
		'======================================================

		  my_dataSet.Tables.Add(my_salary)

		'======================================================
		Dim add_to(1) As String
		add_to(1) = 4000
		my_salary.Rows.Add(add_to)
		add_to(1) = 4000
		my_salary.Rows.Add(add_to)
		add_to(1) = 5500
		my_salary.Rows.Add(add_to)

		DG1.DataSource = my_dataSet.Tables("Salary_Table")

حسناَ ويمكن ايضا باستخدام Expression استعمال خواص رياضية اخرى مثل Sum , Max , Min , Avg ....الخ مثل

Data Table.Columns(Colum Name).Expression = " Sum [salary] )"

او

Data Table.Columns(Colum Name).Expression = " Max [salary] )"

هل رايتم جمال هذه الخاصية وفوائدها :) اما عن الخاصية DefaultValue فقد تم شرحها في المثال واعتقد انها واضحة للجميع

قم بتحميل المثال كالملاَ all data set 5 اسف الدرس

2- الخاصية GetXml و GetXmlSchema : تطرق اخي Scoool في مداخلتة السابقة ان Data Set مبنية على Xml وهذا صحيح

قم بوضع Button وسمة GetXmlSchema وكتب بداخلة الكود التالي :

MsgBox(my_dataSet.GetXmlSchema.ToString)

سيظهر لك كيفية ترتيب الحقول والاعمدة والمفاتيح والمتعلاقات الاخرى داخل ال Data Set واذا اردت ان ترى كيف تترتب العناصر داخل ملف Xml

قم بوضع Button وسمة GetXml وكتب الكود التالي :

MsgBox(my_dataSet.GetXml.ToString)

3- خاصية الحذف Delet Row , RemoveAt التابع لل Data Row : تحدثنا فيما سبق عن كيفية إضافة سجل الى Data set الان سوف نتحدث عن

كيفية حذف سجل من الDataset وتتم عن طريق استخدام Delet Row , RemoveAt وفي كلتا الحالتين يجب ان يتم تحديد موقع السجل باستخدام

BindingContext وتمريرة الى Delet Row , RemoveAt لتتم عملية الحذف وهي كالتالي :

		Dim position As Integer = Me.BindingContext(my_dataSet, "Salary_table").Position

	   my_dataSet.Tables("Salary_Table").Rows(position).Delete()

	  my_dataSet.Tables("Salary_Table").Rows.RemoveAt(position)

فلو اردنا ان نحذف مثلا السجل الخامس من الDataset ويجب التنبه الى ان السجل الاول يبدا من القيمة صفر .

my_dataSet.Tables("Salary_Table").Rows(4).Delete()

4- خاصية Find التابعه لل Data Row : هذه الخاصية مسؤوله عن البحث عن قيم سجل وهي تعتمد على Primkey التايع DataColumn

 
		Dim find As DataRow
		find = my_dataSet.Tables("Salary_Table").Rows.Find( Id Number)

ولمثالنا السابق نحدد مفتاح الجدول ونبحث عن السجل رقم 1 في id

		Dim primkey(0) As DataColumn
		primkey(0) = my_salary.Columns("id")
		my_salary.PrimaryKey = primkey

		 Dim find As DataRow	  
		find = my_dataSet.Tables("Salary_Table").Rows.Find( 1)

قم بتحميل المثال كالملاَ all data set 5 اسف الدرس

بهذا نكون قد تحدثنا عن اهم خواص Data Table وما يشملة من Data Colum , Data Row ولمزيد من المعلومات يمكن زيارة MSDN والبحث هناك

5- ملء الDataset بطريقة امنة من مصدر البيانات : حسناَ الان سوف نتحدث عن بعض المفاهيم المهم والمفيدة عن الداتا سيت ومنها طرقة

ملء الداتا سيت بطريقة امنة وذلك عن استخدام طريقة Fill لل Data Adapter تخيل ان لديك جدول العملاء يحتوي عن 20.000 سجل

وقمت باستدعائة من مصدر البيانات له انت متاكد من وصول جميع البيانات من خلال الشبكة الى الDataset من دون مشاكل اذا كيف نهيئ

الDataset استقبال البيانات ونخبرها ابضاَ ان البيانات تم ملئها بسلام , هنا ياتي دور احد خواص الداتا سيت وهي BeginLoadData و EndLoadData

فل نقم بعمل مثل لملء الداتاسيت :

	 Imports System.Data.OleDb		

	Public Class Form1	 

	Dim conn As New OleDb.OleDbConnection
	Dim cmd As OleDb.OleDbCommand
	Dim data_adapter1 As OleDb.OleDbDataAdapter
	Dim my_dataset As New DataSet()

	Private Sub Form1_Load
	  'Set Up connection Provider 
		conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|vbtest.mdb"
		'set Up SQl command 
		Dim Sql_cmd As String = "Select * from emp"


		'Set Up my data adapter 
		data_adapter1 = New OleDbDataAdapter(Sql_cmd, conn)

		Dim my_emp As New DataTable("emp")
		my_dataset.Tables.Add(my_emp)

   ' use BeginLoadData and EndLoadData to fill data set
		Try
			my_dataset.Tables(0).BeginLoadData()
			data_adapter1.Fill(my_dataset, "emp")
			my_dataset.Tables(0).EndLoadData()

		Catch ex As DataException
			MsgBox(ex.Message)
		End Try

		DG1.DataSource = my_dataset.Tables("emp")

حسناً لقد قمنا في الثال السابق بتحديد نوع مصدر البيانات وتحديد الاتصال و وقمنا ايضا ببناء جدول فارغ داخل الداتا سيت ثم بعد ذلك

استدعينا fill للداتا ادابتر وبنفس الطريقة يمكن ملء الداتاسيت لاكثر من جدول مثل :

			my_dataset.Tables(0).BeginLoadData()
			data_adapter1.Fill(my_dataset, "emp")
			my_dataset.Tables(0).EndLoadData()

			my_dataset.Tables(1).BeginLoadData()
			data_adapter1.Fill(my_dataset, "Salary_Table")
			my_dataset.Tables(1).EndLoadData()

5- توضيح يعض الطرق التي يستخدمها المحترفين للDataset : مرة اخرى تخيل ان لديك جدول يحتوي على 50.000 سجل وقمت بملء

الداتا سيت به وقمت بعمل احد العملات مثل Add , Delet , Modifi لاحد السجلات فهل من المنطقي ان تستدعي الامر UpDate للData Adapter

لانك قمت بالتعديل على سجل واحد او سجلين وتخيل ايضا ان هذا الجدول يستخدمة 5 موظفين على الشبكة ويستخدمون نفس الطريقة UpDate

هل ادركت المشكلة 5 موظفين * 50.000 سجل باستخدام UpDate يساوي 250.000 سجل يدور في الشبكه يسبب ضغط هائل وعبة على الشبكة

إذا ماهي الطرقة التي يستخدمها المبرمجون المحترفون لتحديث السجلت التي حدث عليها تغيير مثل Add , Delet , Modifi فقط بكل بساطة يستخدمون

احد خواص الDataSet وهي HasChanges حيث تقوم هذه الخاصية بالبحث عن أي سجل حدث له تغييت بعدها يتم اخذ الهذا السجل وزرعه داخل DataSet جديد

ثم يتم استدعاء UpDate بهذ الطريقة يتم تحديث السجلات دون الحاجة لتحديث 50.000 سجل دفعه واحدة . مثل :

Dim Modified_dataset, Add_dataset, Delet_dataset As New DataSet

		If my_dataset.HasChanges(DataRowState.Modified) Then
			Modified_dataset = my_dataset.GetChanges(DataRowState.Modified)

			DG2.DataSource = Modified_dataset.Tables(0)
			If Not (Modified_dataset) Is Nothing Then

				'call Data Adapter_UpDate like DataAdapter.UpDate(Modified_dataset,"emp")
				'or add yor code here

			End If
		End If


		If my_dataset.HasChanges(DataRowState.Added) Then
			Add_dataset = my_dataset.GetChanges(DataRowState.Added)

			DG3.DataSource = Add_dataset.Tables(0)
			If Not (Add_dataset) Is Nothing Then

				'call Data Adapter_UpDate like DataAdapter.UpDate(Add_dataset,"emp")
				'or add yor code here

			End If
		End If

		If my_dataset.HasChanges(DataRowState.Deleted) Then
			Delet_dataset = my_dataset.GetChanges(DataRowState.Deleted)

			DG4.DataSource = Delet_dataset.Tables(0)
			If Not (Delet_dataset) Is Nothing Then

				'call Data Adapter_UpDate like DataAdapter.UpDate(Delet_dataset,"emp")
				'or add yor code here

			End If
		End If

قم بتحميل المثال اسفل الصفحة all dataset 6

في الدرس القادم إن شاء الله سوف نتحدث عن اهم كائنات الData Set وهو ( Data Relation ) المسؤول عن ربط الجداول ببعضها البعض

والتنقل بين جدول الاب وجدول الابن وتمريم العمليات التي تجري بينهما من إضافة وحذف وتحديث وائنشاء الله يكون الدرس ممتع للجميع .

all_data_set_5.rar

all_data_set_6.rar

1
#15

درس اكثر من رائع ..

مع انه فتحت ابوب قديمة علي ولكن ..

بصراحة ماكنت اعرف ان الموضوع بهذه البساطة "بالتعبير" باللغة العربية .

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

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

عالعموم ..

جزاك الله خيراً .

تم تعديل هذه المشاركة بواسطة إبراهيم بخش في 7 مايو 2007 في 03:08

#16

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

اشكرك اخي كثير الشكر على جميع ماتدلي به من معلومات تفيد الجميع ..

ولكن لدي استفسار لو اردنا ان ننشئ DataSet تأخذ بيانات من جدولين مختلفين من انواع ايضاً مختلفه مثلا اكسس و dbase كيف يمكن عمل ذلك

لك كل الشكر

#17

إذا ممكن يا شباب تحويل الأمثلة إلى 2003 و أللللللللللللللففففففففففففففففففففففففففففف شكر

سبحان الذي يغير ولا يتغير

#18

ماشــــاء الله

بارك الله فيك

ومنتظر باقى شرح الموضوع

Oracle Developer

#19

شكرا لك اخي ابراهيم بخش هههههه وماهي الابواب القدية التي فتحت هههههه لابد من الذكريات

اهلا اخي omarnew نعم يمنك ذلك سوف ابحث عنها واتتيك بمثال

اخي oscar_3033 في الحقيقة لا أملك إلا 2005 واكنت اتمنا لو اعرف طريقة لتحويلة ال 2003

اخي A_hamouda جزاك الله خيرا

تم تعديل هذه المشاركة بواسطة ahmedd في 9 مايو 2007 في 15:21

#20

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

والله مجهود تستاهل نقول الله ينور

بالرك الله فيك وجعل هذا العمل في ميزان حسناتك

بالتوفيق ,,,,,

A7med_prof

اقتباس

آسف الدخول متقطع هذه القتره

اقتباس

[يمين]

.[/يمين]

A7med_prof-4-2007.jpg

اخر مواضيعي 2007

االمثال مطبق على موقع بورصه سعودي

.

.

مواضيع مهمه ومطلوبه بكثره VB6

.

بــرامج ومشــاريع عربيه كامــله {HnHn} والمزيد في قسم برامج الاعضاء || ربط قواعد بيانات اكسس مع الفيجوال بيسك, مادة دراسية كاملة {بنت اليمن}|| المرجع الشامل لجمل SQL ا {GENIUS-IT} || كيفية التعامل مع مكتبة الـ DAO, في الوصول إلى قاعدة بيانات {رمضان} || مثال ريط Visaul Basic 6.0 مع SQL SERVER ا || العمليات التي تجرى على قاعدة البيانات, مثال كامل {بنت اليمن} || تصدير البيانات من الاكسل الي الاكسس بالفيجوال بيسك {HnHn} || البحث في قاعدة البيانات {MANSUR} || قواعد البيانات العلائقية وتقنيات الوصول إليها {عبد الله فتحي} || كيفية أظهار بيانات جدولين بواسطة التاريخ ,,,,,,,

.

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

.

</
#21

الأخ الفاضل ... ahmedd

لقد قراءة كل حرف كتبته، بسم الله ما شاء الله ، بارك الله فيك وجعله فى ميزان حسناتك

شرح وأمثلة وتوضيح أكثر من رائع :)

فى أنتظار المزيد من الابداع، والى الأمام إن شاء الله

شكراً جزيلاً ،،،

Eng. Usama El-Mokadem

Nothing is impossible, the word impossible itself says that: I M - Possible

#22

جزاك الله الف خير

بصراحه أبدعت في فكرة الموضوع وطرحك المتميز

انت ما اتدري قد ايه انا استفدت من موضوعك هذا

اتمنى من الله سبحانه وتعالى ان يجعلها في موازين حسناتك

وايضا اتمنى من الله سبحانه وتعالى ان يوفقني وجميع اخواني الاعضاء ان نرتقي

بمثل هذه المواضيع لما يعود علينا بالنفع والفائدة

بارك الله فيك يا أخي

#23

بارك الله فيك على هذا الموضوع المفيد والقيم

يا أيها الناس قولو لا إله إلا الله تفلحوا وتملكوا بها العرب وتذل لكم العجم وإذا آمنتم كنتم ملوكا في الجنة

#24

أشكرك أخي جزيل الشكر وجعله الله في ميزان حسناتك

#25

ماشالله دروس مفيده ..

ولكن لدي سؤال حول الداتا سيت وقراءتها لملفات الا كس ام ال ..

من خلال قرائتي للموضوع تخيلت شكل معين للملف الاكس ام ال كيف ينحفظ في الداتا ست

يعني مثلن لو اخذنها هذا الملف

rss

للمقالات التقنيه للفريق العربي للبرمجه

http://arabteam2000.com/RSS.ASP?SEC=1

كيف راح ينحفظ ..

انا بتكلم كيف بينحفظ مادري هل ماتخيله هو صحيح ام لا ..

ملفات الاكس ام دائما لها اب واحد وتصمم بشكل شجري ..

طبعن الاب هو rss تحته شانل والشانل داخله مجموعه من التاجز ومن ضمنها ايتمز ..

راح يخزن الشنل مع التاجز تبعا اللي هي معلومات عن الشنل في تيبل بلحاله وراح يخزن الايتمز في تيبل اخر .!؟

ماذا لو اردت ان اقوم بقراءه ايتمز معين مثلن الثالث .. فقط ..

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

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