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

مشكلة في الdataset تحتوي على 3 جداول

بدأه OROBAH في 20 فبراير 2008 · 5 رد · 1,289 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

لدي المشكلة التالية:

استعمل vb.net2003 و sql server2000 و استعمل الوضع المنفصل في الاتصال..

و لدي 3 جداول, وضعت كلا منهم في SqlDataAdapter لوحده , ثم جمعتهم في DataSet واحده لعرض البيانات في data grid واحده , المشكلة تظهر عند عمل بحث, حيث يعرض النتائج لفترة , ثم تظهر لي المسج التالية:

there is already an open DataReader associated with this connection which must be closed first.

, وعند عمل تعديل يظهر المسج:

invalid attemp to read when data is in percent

مع العلم اني لم أغير تصميم الجداول أو خصائص الحقول, وقد حذفت ال SqlDataAdapter والDataSet و ا SqlConnectionو عملتهم مرة اخرى و لكن نفس النتيجة يعمل لفترة ثم تظهر المسج, وكذلك كود البحث و التعديل يعمل في شاشة أخرى مكونه من جدولين بشكل صحيح تماما...أما في هذه الشاشة لا..

أعتقد انا أن المشكلة تتعلق بكون الdatagrid تحتوي على 3 جداول ولكن لا اعرف ما الحل ؟

وهذا هو كود البحث:

 Try
			If Me.cbInstructorID1.Checked = False And Me.cbInstructorName1.Checked = False And Me.cbQualifications1.Checked = False Then
				MsgBox("لم يتم اختيار مفتاح للبحث")
			Else



				Dim SearchInstructorID As Integer
				Dim SearchInstructorName, SearchQualification As String
				SQLstatment = "select * from Instructor "



				If Me.cbInstructorID1.Checked = True Then
					If Val(Me.txtSearchInstructorID1.Text) >= 0 Then
						If SQLstatment = "select * from Instructor " Then
							SQLstatment = SQLstatment + " where Instructor_ID=" + Str(Val(Me.txtSearchInstructorID1.Text))

						Else
							SQLstatment = SQLstatment + " and Instructor_ID=" + Str(Val(Me.txtSearchInstructorID1.Text))

						End If
					End If
				End If


				If Me.cbInstructorName1.Checked = True Then
					If Me.txtSearchInstructorName1.Text <> "" Then
						If SQLstatment = "select * from Instructor " Then
							SQLstatment = SQLstatment + "where Instructor_Name like N'%" + Me.txtSearchInstructorName1.Text + "%'"

						Else
							SQLstatment = SQLstatment + "and Instructor_Name like N'%" + Me.txtSearchInstructorName1.Text + "%'"
						End If
					End If
				End If


				If Me.cbQualifications1.Checked = True Then
					If Me.txtSearchQualifications1.Text <> "" Then
						If SQLstatment = "select * from Instructor " Then
							SQLstatment = SQLstatment + "where Qualifications like N'%" + Me.txtSearchQualifications1.Text + "%'"
						Else
							SQLstatment = SQLstatment + "and Qualifications like N'%" + Me.txtSearchQualifications1.Text + "%'"
						End If
					End If
				End If



				'MsgBox("final SQL statement is :  " + SQLstatment)

				Dim cmdSearch As New SqlCommand
				cmdSearch.CommandText = SQLstatment
				cmdSearch.Connection = MyConn
				MyConn.ConnectionString = "workstation id=local;packet size=4096;integrated security=SSPI;data source='';persist security info=False;initial catalog=TCCNR"

				If MyConn.State = ConnectionState.Closed Then
					MyConn.Open()
				End If

				Dim drSearch As SqlDataReader = cmdSearch.ExecuteReader



				drSearch.Read()
				If drSearch.HasRows = False Then
					MsgBox("لا يوجد سجلات مطابقة !!")
					Me.btnModify1.Enabled = False
					Me.btnEraseDBFields.Enabled = False


				Else
					'---------new---------------------------------------

					Dim cmdMySearch As New SqlCommand
					cmdMySearch.CommandText = SQLstatment
					cmdMySearch.Connection = Me.SqlConnection1

					Dim cmdViewWorkPlace As New SqlCommand
					Dim WorkPlace_SQL_Statement As String
					WorkPlace_SQL_Statement = "select * from Work_Place;"
					cmdViewWorkPlace.CommandText = WorkPlace_SQL_Statement
					cmdViewWorkPlace.Connection = Me.SqlConnection1

					Dim cmdViewNationality As New SqlCommand
					Dim Nationality_SQL_Statement As String
					Nationality_SQL_Statement = "select * from Nationality;"
					cmdViewNationality.CommandText = Nationality_SQL_Statement
					cmdViewNationality.Connection = Me.SqlConnection1



					If SqlConnection1.State = ConnectionState.Closed Then
						SqlConnection1.Open()
					End If

					Me.SqlDataAdapter1.SelectCommand = cmdMySearch
					Me.SqlDataAdapter2.SelectCommand = cmdViewWorkPlace
					Me.SqlDataAdapter3.SelectCommand = cmdViewNationality


					Me.DS_Instructors1.Clear()

					Me.SqlDataAdapter1.Fill(Me.DS_Instructors1)
					Me.SqlDataAdapter2.Fill(Me.DS_Instructors1)
					Me.SqlDataAdapter3.Fill(Me.DS_Instructors1)

					SqlConnection1.Close()

					Me.NDG_Search_Instructor.Enabled = True
					Me.btnModify1.Enabled = True
					Me.btnEraseDBFields.Enabled = True

					Me.NDG_Search_Instructor.Expand(-1)
					'------------------------------------------------------------------
					Me.txtSearchInstructorID1.Text = Val(drSearch.Item("Instructor_ID"))
					Me.txtSearchInstructorName1.Text = drSearch.Item("Instructor_Name")
					Me.txtSearchQualifications1.Text = drSearch.Item("Qualifications")
					Me.btnModify1.Enabled = True

				End If

				drSearch.Close()
				MyConn.Close()

			End If



		Catch ex1 As SqlException
			MsgBox(ex1.Message)
			MyConn.Close()
		Catch ex2 As Exception
			MsgBox(ex2.Message)
			MyConn.Close()

		End Try

وكود التعديل:

		Me.SqlDataAdapter1.Update(Me.DS_Instructors1)

		Me.SBInstructors.Text = "تم حفظ البيانات بنجاح "
		'---------------------------------------------------------------
		Dim db As New SqlCommandBuilder(da)

		da.UpdateCommand = db.GetUpdateCommand
		da.DeleteCommand = db.GetDeleteCommand
		da.InsertCommand = db.GetInsertCommand


		da.Update(ds, "Instructor")

أرجو ممن يعرف الحل أن يساعدني , وله مني خالص الدعاء...

#2

يا اخي العزيز هل توجد علاقه بين الجداول او لا

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

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

تحياتي لك

#4
فايز السدله كتب:
يا اخي العزيز هل توجد علاقه بين الجداول او لا

نعم , توجد بالتأكيد علاقة ,...أثنان من الجداول يرتبطان بالجدول الثالث...

فايز السدله كتب:
وانا ارجع ان تستخدم Views فهو افضل طريقه لتعامل مع اكثرمن جدول اعمل view واحد يضم كل الجداول

وريح نفسك من اللفه ذي كلها

أنشئت view , و حاولت عرض البيانات في data grid ولكن ... لا يمكن عرض جميع البيانات من الجدولين الآخرين المرتبطين بالجدول الاساسي(والذي بياناتهما معروضة في combo box)..وإنما يعرض فقط الجزء الذي يخص السطر نفسه فقط...والباقي يقوم بتكرار نفس البيانات...

وضعت صورة كمرفقات لمعرفة المقصود من تكرار البيانات

فايز السدله كتب:
بس في View لازم تكرمز على العلاقه بين الجداول لنها مهمه جداً

لا أدري ماذا تقصد بالترميز؟ هل تقصد الindex؟ وإذا لم يكن؟ كيف أعمل الترميز الذي ذكرت؟ هل قد تكون هذه سبب المشكلة التي شرحتها ؟

أرجو المساعدة

slayer666 كتب:
				drSearch.Read()

انت فتحت الداتا ريدر بس مغلقتها

drSearch.close

اتصور هو هذا سبب الارر

يظهر أنك لم تلحظ إغلاق الdata reader

	  End If

				drSearch.Close()
				MyConn.Close()

			End If

أغلقت الData Reader مع الكونكشن...مع أن إغلاق الكونكشن لوحده يكفي ولكني وضعت الاثنين ..عندم ضقت ذرعا بهذه الرساله التي تظهر لي..

أرجو ممن يعرف سبب الخطا المساعدة...

post-73149-1203753884_thumb.gif

#5
slayer666 كتب:
				drSearch.Read()

انت فتحت الداتا ريدر بس مغلقتها

drSearch.close

اتصور هو هذا سبب الارر

تم إغلاق الdata readerمع الكونكشن في آخر الكود (يبدو انك لم تلحظه لطول الكود..فعذرا)..مع أن اغلاق احدهما يكفي ولكني أضفته عندما ضقت ذرعا بهذا الخطأ الذي يظهر لي...

أرجو التكرم بالمساعدة من الجميع

#6

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

كل من فى الوجود يطلب صيداً :::: غير ان الشباك مختلفات

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