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

سؤال عن العلاقات بين الجداول في دوت نيت 2005

مغلق
بدأه newahmed في 4 يوليو 2006 · 13 رد · 1,863 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

ارجو توضيح عملية تكوين العلاقات بين الجداول في dataset حيث ان الكود التالي لا يظهر النتائج في datagridview

dim rel as new datarelation("علاقة",dataset.tables("tab1").columns("col1"),dataset.tables("tab2").columns("col2"),false)

dataset.relations.add(rel)

ارجو المساعدة ممن يستطيع .. مع شكري لمن يحاول مساعدتي.

اخوكم احمد

تم تعديل هذه المشاركة بواسطة الغملاسي في 7 يوليو 2006 في 05:24

#2

هل الموضوع صعب لهذه الدرجة؟؟ :^) :^)

#3

السلام عليكم

عزيزي الربط في 2005 يختلف نوعاً ما عن 2003 بحيث نستخدم العنصر bindingSource لربط كل من جدول الاب و جدول الابن.

إليك ذلك.

#Region " Binding Data RelationShip "
	Private Sub BindDataRelation()
		Try
			'Relation Ship Object
			Dim Rel As DataRelation
			Dim ParentColumn As DataColumn
			Dim childColumn As DataColumn
			ParentColumn = DSMain1.Tables("Parents").Columns("ParentID")
			childColumn = DSMain1.Tables("Childs").Columns("ParentID")
			Rel = New DataRelation("FK_ParentsChilds", ParentColumn, childColumn)
			DSMain1.Relations.Add(Rel)
			Me.ParentsBindingSource.DataSource = Me.DSMain1
			Me.ParentsBindingSource.DataMember = "Parents"
			Me.ChildsBindingSource.DataSource = ParentsBindingSource
			Me.ChildsBindingSource.DataMember = "FK_ParentsChilds"
		Catch ex As Exception
			Throw ex
		End Try
	End Sub
#End Region

الخطوة الاولى : قم بإضافة العنصر BindingSource لجدول الاب , كمصدر للخاصية DataSource للـ BindingSource لجدول الابن

ثانياً قم بإسناد اسم العلاقة في الخاصية DataMember للـ BindingSource الابن .

بالتوفيق إن شاء الله.

تم تعديل هذه المشاركة بواسطة الغملاسي في 4 يوليو 2006 في 14:35

في المثال يتضح المقال

#4

شكرا للأخ الغملاسي على هذه الملاحظة المهمة.. جعلها الله في ميزان حسانتك.

#5

جزاك الله :^)

جزاك الله :^)

1.GIF
#6

أستاذنا الغملاسي ..

بعد تطبيق الإجراء المذكور في BindDataRelation تم الربط بنجاح لذلك أريد أن أشكرك ، ولكن حينما أريد أن أقوم بتحديث البيانات من خلال الكود التالي ..

		Dim ParentsChildsCB As New OleDbCommandBuilder(MyDA)
		Me.ParentsBindingSource.EndEdit()
		Me.MyDA.Update(Me.MyDS, "Parents")
		Me.ChildsBindingSource.EndEdit()
		Me.MyDA.Update(Me.MyDS, "Childs")
		MsgBox("Update Successfully...")

يعرض رسالة تنذر عن وجود الخطاء ..

Missing the DataColumn 'Note' in the DataTable 'Information' for the SourceColumn 'Note'.

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

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

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

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

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

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

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

#7

السلام عليكم

وعيدكم مبارك .

اقتباس
Missing the DataColumn 'Note' in the DataTable 'Information' for the SourceColumn 'Note'.
كما هو واضح ان المشكلة في حقل الـ Note ربما انه متطلب ولم تسند له قيمة أو انه من نوع لم تسند له قيمة مناسب لذلك النوع.

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

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

فهذه ليست لها علاقة بالربط إطلاقًا كونها مشكلة مستقلة بذاتها.

لكن بشكل عام عند الاضافة و التعديل و التحديث تطبق على جدول الاب أولاً ثم جدول الابن, ماعدا الحذف

فإنه معكوس , بحيث يتطبق على الابن ثم الاب.

والله أعلم.

في المثال يتضح المقال

#8

اريد أن أوضح لك أكثر ..

أنا عندي جدول اسمه Parents مثلاً وفيه حقلين ( حقل ID وله خاصية الترقيم التلقائي ، وحقل Name وله خاصية كونه نص ) والجدول الثاني Childs مثلاً وفيه حقلين ( حقل ID ولع خاصية كونه رقم ، وحقل Note وله خاصية كونه نص ) .

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

		txtId.DataBindings.Add(New Binding("TEXT", ParentsBindingSource, "ID", True))
		txtName.DataBindings.Add(New Binding("TEXT", ParentsBindingSource, "Name", True))
		txtNote.DataBindings.Add(New Binding("TEXT", ChildsBindingSource, "Note", True))

وعندما أردت الحفظ جربت كتابة الكود التالي ولم يجدي نفعاً ..

		Dim ParentCB As New OleDbCommandBuilder(ParentDA)
		Dim ChildCB As New OleDbCommandBuilder(ChildDA)
		Me.ParentsBindingSource.EndEdit()
		Me.ChildsBindingSource.EndEdit()
		Me.ParentDA.Update(Me.MyDS, "Parents")
		Me.ChildDA.Update(Me.MyDS, "Childs")

ولكن هذا الكود يحدث الجودل Parents فقط ، ولا يحدث الجدول Childs . هل ترشدني للطريقة الصحيحة التي أحدث بها كلا الجدولين ...

وللمعاينة و التدقيق أرفق لك المثال ..

MyNote.zip

تم تعديل هذه المشاركة بواسطة yaseralshikh في 31 ديسمبر 2006 في 16:10

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

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

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

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

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

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

#9

السلام عليكم

اخي الكريم الخطأ ليس فقط في عدم معرفة الربط , وانما الخط في منطق التصميم قبل كل شيء

لماذا فصلت الملاحظات عن الجدول الرئيسي , مادمت تعرض منه قيمة واحدة فقط في كل صف؟

كان يفترض ان يركن جدول الابن في DataGridView أو ListBox او ListView او اي

شيئ اخر يحمل قيم متعددة لا احادية.

ثانياً وهذا ذكرناه مراراً الـ Command Builder لا يدعم الجداول المرتبطة,

لذلك اما ان تكتب الكود بشكل يدوي أو ان تعفي نفسك عن هدر مزيد من الوقت

بإنشاء تلك العناصر بالخطوات Wizard

وكذلك للإستزادة راجع الرابط التالي

بالتوفيق إن شاء الله.

في المثال يتضح المقال

#10

دائماً متألق أخي ، ودائماً نثقل عليك ، ولطالما كنت صبوراً ومعطائاً ، أشكرك على ذلك من كل قلبي ..

عذراً المثال المرفق ، ما هو إلا مثال ، من خلاله نتعلم وليس مشروع حقيقي .. وليس من الطبيعي أن نعتمد إضافة جدول الابن في DataGridView أو ListBox او ListView او اي شيئ اخر يحمل قيم متعددة لا احادية ، لن برامجنا تحتم علينا سلوك أمور قد لا نحتاج فيها أي من هذه الأدوات . كما أن الـ Wizard لا يلبي بكل احتياجاتنا التي من الغريب أنها دائما تتجه نحو الإتجاه المعاكس للمنطق السليم ، ولكن رغم ذلك نريدها كما هي . ولكن إذا كان Wizard يقوم بتحديث الجدول الابن مع الجدول الاب ، لماذا لا نستطيع ذلك بالكود .

إنه لمن المؤسف أن لا نستطيح تحديث الجدول الابن بطريقة الجدول الأب الرائعة والمختصرة ...

تم تعديل هذه المشاركة بواسطة yaseralshikh في 7 يناير 2007 في 10:12

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

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

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

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

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

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

#11

السلام عليكم

اقتباس
ما هو إلا مثال ، من خلاله نتعلم وليس مشروع حقيقي
حتى المثال يا أخي الكريم لابد أن يكون وفقاً للمعايير و المنطق سواءً بسواء.
اقتباس
وليس من الطبيعي أن نعتمد إضافة جدول الابن في DataGridView أو ListBox او ListView او اي شيئ اخر يحمل قيم متعددة لا احادية
هذا شذوذ عن المنطق, انه من غير الطبيعي عمل ذلك. إلا اذا كانت العلاقة one to one relationship . فقط.
اقتباس
كما أن الـ Wizard لا يلبي بكل احتياجاتنا التي من الغريب أنها دائما تتجه نحو الإتجاه المعاكس للمنطق السليم
الآية مقلوبة تماماً,

هو أفضل مما تتصور, فهو يوفر عليك الوقت و الجهد, كما انه يتحقق من اسماء المفاتيج قبل تكملة الخطوات, ولهُ ميزات عديدة جداً لا يسعني ذكرها جميعاً.

بل الاتجاه المعاكس ان نستخدم التحديث بشكل يدوي, فلا غنى عن المعالج السحري Wizard , قد تستغرب هذا الكلام, ولكن هذه حقيقة مُسلْم بها.

اقتباس
ولكن إذا كان Wizard يقوم بتحديث الجدول الابن مع الجدول الاب ، لماذا لا نستطيع ذلك بالكود .
عزيزي ما قلنا لا نستطيع

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

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

لا يستطيع تحديث الابن إذا لم يحتضنه عنصر متعدد.

في الاخير أقول ( القلم و القرطاس , قبل الكيبورد و الماوس ) ويعني تخطيط المشروع و تحليلة قبل البث في تطويره.

بالتوفيق إن شاء الله.

في المثال يتضح المقال

#12

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

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

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

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

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

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

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

#13

السلام عليكم

نعم يمكن ذلك لكن هنالك شروط منها جلب اخر رقم ID للجدول الاب و الابن الذي لم يكن ضمن مثالك.

ربما مثل هذا الكود الذي كتبته على النسخة 2002 أو اكثر.

		Try

			'Refresh Data Grides
			DGAddCourse.Refresh()


			'Declare Counter with length of the DsShcdule DataSet
			' means  count the hole length of the dataset table schudle 
			' -1 mean it will start from 0   the total number is 5 if we write 0 it will   start  from 1  the total number is 4 
			Dim Counter As Integer = Me.DsShcdule1.Tables("Scheul").Rows.Count - 1
			MessageBox.Show(Counter.ToString)
			'Declare Iterate Variable i for Loop
			Dim i As Integer = 0

			'Clear any New Registation if Exist
			'by Drop them from New Registration
			Dim TSQL As String = _
			"DELETE FROM NewRegistration WHERE StudentID ='" & Me.txtID.Text & "'"
			Dim cmd As OleDbCommand
			cmd = New OleDbCommand(TSQL, cnn)
			cnn.Open()
			'do insert values  mean addd courses in the datagrid -->cmd.ExecuteNonQuery()
			'ExecuteNonQuery() mean apply insert update , delete 
			cmd.ExecuteNonQuery()
			cnn.Close()


			'Then Add Courses
			While (i <= Counter)
				Dim r As DataRow = Me.DsShcdule1.Tables("Scheul").Rows(i)
				'Insert Command
				DANRegUpdate.InsertCommand = New OleDb.OleDbCommand( _
				"INSERT INTO NewRegistration " & _
				"(Indexer,RegistrationDate,StudentID,FirstName,  " & _
				"MiddelName,MaidenName,LastName,Major,AcadimicYears,Semester, " & _
				"ST,CourseDescriptions,InstructorsName,Dayes,Times,Buildings, " & _
				"Rooms,Midterm,FinalExam,FinalExamTime,PrerequestCode, " & _
				 "CreditHoures,Types,Ceiling,GPA,Warrning) " & _
				"VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", cnn)
				' we used (?) which is mean parameter  
				'Specify Parameters for Insert Command
				With DANRegUpdate.InsertCommand.Parameters
					.Add("@Indexer", _
				   OleDb.OleDbType.Integer, 0, "Indexer")
					.Add("@RegistrationDate", _
					 OleDb.OleDbType.VarChar, 50, "RegistrationDate").Value = Now.Date().ToShortDateString()
					.Add("@StudentID", _
					  OleDb.OleDbType.VarChar, 50, "StudentID").Value = Me.txtID.Text
					.Add("@FirstName", _
					 OleDb.OleDbType.VarChar, 50, "FirstName").Value = Me.txtFName.Text
					.Add("@MiddelName", _
				   OleDb.OleDbType.VarChar, 50, "MiddelName").Value = Me.txtMiddelName.Text
					.Add("@MaidenName", _
					 OleDb.OleDbType.VarChar, 50, "MaidenName").Value = Me.txtMaidenName.Text
					.Add("@LastName", _
				   OleDb.OleDbType.VarChar, 50, "LastName").Value = Me.txtLName.Text
					.Add("@Major", _
					 OleDb.OleDbType.VarChar, 5, "Major").Value = Me.txtMajor.Text
					.Add("@AcadimicYears", _
					 OleDb.OleDbType.VarChar, 50, "AcadimicYears").Value = Me.CBoxYear.SelectedItem
					.Add("@Semester", _
				   OleDb.OleDbType.VarChar, 50, "Semester").Value = CheckedRB
					.Add("@ST", _
					OleDb.OleDbType.Integer, 0, "ST").Value = r("ST")
					.Add("@CourseDescriptions", _
				   OleDb.OleDbType.VarChar, 50, "CourseDescriptions").Value = Me.CBoxCourse.SelectedItem
					.Add("@InstructorsName", _
					OleDb.OleDbType.VarChar, 50, "InstructorsName").Value = r("InstructorsName")
					.Add("@Dayes", _
					  OleDb.OleDbType.VarChar, 50, "Dayes").Value = r("Dayes")
					.Add("@Times", _
				   OleDb.OleDbType.VarChar, 50, "Times").Value = r("Times")
					.Add("@Bulidings", _
					OleDb.OleDbType.VarChar, 50, "Buildings").Value = r("Buildings")
					.Add("@Rooms", _
					OleDb.OleDbType.Integer, 0, "Rooms").Value = r("Rooms")
					.Add("@Midterm", _
				   OleDb.OleDbType.VarChar, 50, "Midterm").Value = r("Midterm")
					.Add("@FinalExam", _
				   OleDb.OleDbType.VarChar, 50, "FinalExam").Value = r("FinalExam")
					.Add("@FinalExamTime", _
				 OleDb.OleDbType.VarChar, 50, "FinalExamTime").Value = r("FinalExamTime")
					.Add("@PrerequestCode", _
				 OleDb.OleDbType.VarChar, 50, "PrerequestCode").Value = r("PrerequestCode")
					.Add("@CreditHoures", _
				  OleDb.OleDbType.VarChar, 50, "CreditHoures").Value = r("CreditHourse")
					.Add("@Types", _
				 OleDb.OleDbType.VarChar, 50, "Types").Value = r("Types")
					.Add("@Ceiling", _
				 OleDb.OleDbType.Integer, 0, "Ceiling").Value = r("Ceiling")
					.Add("@GPA", _
				 OleDb.OleDbType.Integer, 0, "GPA").Value = GPASender	 'Comes from GPA Validation
					.Add("@Warrning", _
				 OleDb.OleDbType.Integer, 0, "Warrning").Value = WarrningSender 'Comes from GPA Validation
				End With

				'Declare A Data Row that Hold Data to New Registration Table
				Dim dr As DataRow = _
				DsnRegUpdate1.Tables("NewRegistration").NewRow()
				dr("Indexer") = r("Indexer")
				dr("RegistrationDate") = Now.Date()
				dr("StudentID") = Me.txtID.Text
				dr("FirstName") = Me.txtFName.Text
				dr("MiddelName") = Me.txtMiddelName.Text
				dr("MaidenName") = Me.txtMaidenName.Text
				dr("LastName") = Me.txtLName.Text
				dr("Major") = Me.txtMajor.Text
				dr("AcadimicYears") = r("AcadimicYears")
				dr("Semester") = CheckedRB
				dr("ST") = r("ST")
				dr("CourseDescriptions") = r("CourseDescription")
				dr("InstructorsName") = r("InstructorsName")
				dr("Dayes") = r("Dayes")
				dr("Times") = r("Times")
				dr("Buildings") = r("Buildings")
				dr("Rooms") = r("Rooms")
				dr("Midterm") = r("Midterm")
				dr("FinalExam") = r("FinalExam")
				dr("FinalExamTime") = r("FinalExamTime")
				dr("PrerequestCode") = r("PrerequestCode")
				dr("CreditHoures") = r("CreditHourse")
				dr("Types") = r("Types")
				dr("Ceiling") = r("Ceiling")
				dr("GPA") = GPASender
				dr("Warrning") = WarrningSender
				DsnRegUpdate1.Tables("NewRegistration").Rows.Add(dr)
				DANRegUpdate.Update(DsnRegUpdate1)




				'''''''''''''''''''''''''''''''''''''
				''''''''''''''''''''''''''''''''''
				'''''''''''''''''''''''''''''''
				''''''''''''''''''''''''''''
				'Insert Command for Details Registration
				DARegDetails.InsertCommand = New OleDb.OleDbCommand( _
				"INSERT INTO DetailsRegistration " & _
				"(RegistrationDate,StudentID,FirstName,  " & _
				"MiddelName,MaidenName,LastName,Major,AcadimicYears,Semester, " & _
				"CourseDescriptions ) " & _
				"VALUES (?,?,?,?,?,?,?,?,?,?)", cnn)
				'Specify Parameters for Insert Command
				With DARegDetails.InsertCommand.Parameters
					.Add("@RegistrationDate", _
					OleDb.OleDbType.VarChar, 50, "RegistrationDate")
					.Add("@StudentID", _
					OleDb.OleDbType.VarChar, 50, "StudentID")
					.Add("@FirstName", _
					 OleDb.OleDbType.VarChar, 50, "FirstName")
					.Add("@MiddelName", _
					OleDb.OleDbType.VarChar, 50, "MiddelName")
					.Add("@MaidenName", _
					 OleDb.OleDbType.VarChar, 50, "MaidenName")
					.Add("@LastName", _
					OleDb.OleDbType.VarChar, 50, "LastName")
					.Add("@Major", _
					 OleDb.OleDbType.VarChar, 5, "Major")
					.Add("@AcadimicYears", _
					 OleDb.OleDbType.VarChar, 50, "AcadimicYears")
					.Add("@Semester", _
					OleDb.OleDbType.VarChar, 50, "Semester")
					.Add("@CourseDescriptions", _
					OleDb.OleDbType.VarChar, 50, "CourseDescriptions")
				End With
				'Declare A Data Row that Hold Data to New Registration Table
				Dim drow As DataRow = _
				DsRegDetails1.Tables("DetailsRegistration").NewRow()
				drow("RegistrationDate") = Now.Date()
				drow("StudentID") = Me.txtID.Text
				drow("FirstName") = Me.txtFName.Text
				drow("MiddelName") = Me.txtMiddelName.Text
				drow("MaidenName") = Me.txtMaidenName.Text
				drow("LastName") = Me.txtLName.Text
				drow("Major") = Me.txtMajor.Text
				drow("AcadimicYears") = r("AcadimicYears")
				drow("Semester") = r("Semester")
				drow("CourseDescriptions") = r("CourseDescription")
				DsRegDetails1.Tables("DetailsRegistration").Rows.Add(drow)
				DARegDetails.Update(DsRegDetails1)
				i += 1 'If there more than One Course Should ADDED
			End While


			MessageBox.Show(i.ToString() & " Courses Added Successfully...")
		Catch ex As Exception
			MessageBox.Show(ex.Message & " " & ex.Source.ToString())
		End Try

وربما لا يخلو من الاخطاء. والله المستعان.

في المثال يتضح المقال

#14

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

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

لا ادري عندي احساس ( مجرد إحساس ) بأن هناك طرقة سهلة لتحديث الجدول الابن ومشابهه لطريقة تحديث الجدول الاب .. أسأل الله أن يهدينا إليها ..

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

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

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

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

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

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

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

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

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…