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

درس في ADO.NET 2005

مثبّترائج
بدأه yaseralshikh في 31 يوليو 2006 · 202 رد · 80,577 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#27

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

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

عل حد علمي نحتاج إلى Module نقوم فيه بالتصريح عن المتغيرات وكتابة الاجرائات المشتركه التي يحتاجها كل فورم في المشروع . وستطيع اضافة Module من خلال النقر على القسم Solution Explorer أنقر على اسم المشروع بالزر الأيمن ثم اختر >> Add ثم >> Module ثم اعطيه اي اسم وليكون ModuleConnectionAndDeclarevariables ( الاسم طويل أليس كذلك يمكنك كتابة ما يناسبك من الأسماء ) .

ونقوم بكتابة جملة الإتصال التي تناسبنا والمتغيرات التي نحتاجها ..

في مقدمة Module نكتب ..

Imports System.Data
Imports System.Data.OleDb

وأسفل Module ModuleConnectionAndDeclarevariables نكتب مثلاً ..

	Friend strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\InformationBank.mdb;User Id=admin;Password=;"
	Public cn As New OleDbConnection(strConn)
	Public daTheBankAndData As OleDbDataAdapter '(strSQL, cn)
	Public MyDS As DataSet
	Public MyDataView As DataView
	Public WithEvents MyCurrencyManager As CurrencyManager
	Private _MySql As String
	Public Property MySql() As String
		Get
			Return _MySql
		End Get
		Set(ByVal value As String)
			_MySql = value
		End Set
	End Property

ونحتاج الى كتابة اجرائات تعبئة dataSet وربط ال DataView بها ، وربط CurrencyManager بـ DataView وذلك بجعل جملة ال SQL مفتوحة بحيث نعدلها على حسب الإستخدام في كل فورم ... لذا يجب كتابة الكود التالي في Module ..

	Public Sub Fill_DataSetAndDataView(ByVal StrSQL As String, ByVal TableName As String) ' As DataSet
		Try
			'=================================================================
			' تعبئة البيانات من قاعدة البيانات الى البرنامج في داتا سيت
			'=================================================================
			cn.Open()
			If cn.State = ConnectionState.Open Then
				' Initialize a new instance of the DataSet object...
				MyDS = New DataSet()
				MyDS.Clear()
				daTheBankAndData = New OleDb.OleDbDataAdapter(StrSQL, cn)
				' Fill the DataSet object with TheBankAndData...
				daTheBankAndData.Fill(MyDS, TableName)
				' Set the DataView object to the DataSet object...
				MyDataView = New DataView(MyDS.Tables(TableName))
				' Set our CurrencyManager object to the DataView object...
				MyCurrencyManager = CType(Form1.BindingContext(MyDataView), CurrencyManager)
				cn.Close()
			End If
			' Return MyDS
		Catch oExcept As Exception
			MessageBox.Show(oExcept.Message)
		End Try
	End Sub

ومن خلال الفورم وعند رغبتنا في تعبئة ال dataset نكتب ..

		MySql = "SELECT TheBank.id, TheBank.AskNumber, data.ask, data.answer FROM TheBank INNER JOIN data ON TheBank.ID = data.ID ORDER BY TheBank.AskNumber;"
		Call Fill_DataSetAndDataView(MySql, "TheBankAndData")

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

	Public Function ShowPosition() As String
		' Display the current position and the number of records
		Dim MyPosition As String
		MyPosition = MyCurrencyManager.Position + 1 & _
	   " of " & MyCurrencyManager.Count()
		Return MyPosition
	End Function

ومن خلال الفورم وفي كل مره نحتاج إلى ذلك نكتب ..

		lblPosition.Text = ShowPosition()

هذه مجرد أفكار ربما فيها نقص أو يوجد أفضل منها لذا شاركوني بأفكاركم ...

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

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

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

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

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

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

#28

شكرا جزيلا يا أخي

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

أرجو الرد .... وشكرا

#29

اخي اخبرنا المزيد عن مشكلتك كي نستطيع المساعده .. بمعنى

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

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

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

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

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

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

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

#30

بسم الله الرحمن الرحيم

اخواني قبل كل شيئ أريد أن اقدم إعتذار لكل من شاهد وشارك في هذا الدرس والسبب أني بعد مراجعتي للكود وجدت بعض الاخطاء التي كان من المفروض الإنتباه لها قبل نشر الدرس على المنتدى ، وبعد قبول اعتذاري أقدم لكم تصحيح هذه الاخطاء ولو أستطعت أن اعدلها في الكود السابق لفعلت ولكن المنتدى لا يتيح لي التعديل ( أتمنى من الأخوان القائمين على المنتدى أن يجعلو لنا امكانية تعديل المشاركات على الدوام ) ..

الأخطاء توجد في كود اضافة بيانات جديده وحفظها ، كما اني قمت بتحديث باقي الأكواد بحيث تبدو بشكل أفضل وأكثر عملية وفاعلية ..

* التصحيح لكود اضافة بيانات جديده وحفظها ..

	Private Sub btnAdd_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAdd.Click
		' Clear the teh Text Box fields...
		Call CLEARDATA()
		txtnumber.Focus()
		intOption = True
		If MyCurrencyManager.Count = 0 Then
			BackPosition = 0
		Else
			BackPosition = MyCurrencyManager.Position
		End If
		ToolStripStatusLabel1.Text = "Ready To Add New Record"
	End Sub

* التصحيح لكود حفظ البيانات الجديده وبالذات في الجزئية " Save AddNew " يجب استبدال الكود التالي مكان الكود القديم ..

					' Save AddNew
					Try
						Dim InsertCommand As OleDbCommand = New OleDbCommand()
						' Open the connection, execute the command
						If cn.State = ConnectionState.Closed Then cn.Open()
						' Set the SqlCommand object properties...
						InsertCommand.Connection = cn
						' AddNew Record From Thebank Table
						InsertCommand.CommandText = "INSERT INTO thebank(Asknumber) VALUES(?);"
						'Add parameters for the placeholders in the SQL in the CommandText property...
						'Parameter for the Asknumber column...
						InsertCommand.Parameters.AddWithValue("?", txtnumber.Text)
						' Execute the OleDbCommand object to insert the new data...
						InsertCommand.ExecuteNonQuery()
						' Get The ID Value from TheBank Table..
						Dim IdValue As String = CInt(ValueOfFields("Thebank", "ID"))
						' AddNew Record From Thebank Table
						InsertCommand.CommandText = "INSERT INTO Data(id,Ask,Answer) VALUES(?,?,?);"
						'Add parameters for the placeholders in the SQL in the CommandText property...
						'Parameter for the id column...
						InsertCommand.Parameters.Clear()
						InsertCommand.Parameters.AddWithValue("?", IdValue)
						'Parameter for the ask column...
						InsertCommand.Parameters.AddWithValue("?", txtask.Text)
						'Parameter for the answer column
						InsertCommand.Parameters.AddWithValue("?", txtanswer.Text)
						' Execute the SqlCommand object to insert the new data...
						InsertCommand.ExecuteNonQuery()
						' Close the connection...
						cn.Close()
						' Fill the dataset and bind the fields...
						Call FillDataSetAndView()
						BindFields()
						' Set the record position to the one that you saved...
						MyCurrencyManager.Position = MyCurrencyManager.Count - 1
						' Show the current record position...
						ShowPosition()
						' Display a message that the record was added...
						ToolStripStatusLabel1.Text = "Record Added"
						'Dispose Declare local variables and objects
						InsertCommand.Dispose()
						InsertCommand = Nothing
					Catch ex As OleDbException
						MessageBox.Show(ex.Message, " Save AddNew ", MessageBoxButtons.OK, _
					  MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, _
					  MessageBoxOptions.RtlReading)
					End Try
					intOption = False

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

	Private Function ValueOfFields(ByVal MyTable As String, ByVal Field As String) As String
		Try
			'=================================================================
			'  يقوم هذا الإجراء بإرجاع قيمة "الأيدي" لاخر سجل في جدول 
			' من ملف قاعدة البانات "Data"
			'=================================================================
			Dim daTheBank As OleDb.OleDbDataAdapter
			Dim TheBankTable As DataTable = New DataTable
			Dim strValue As String
			Dim CountMyTable As Integer
			If cn.State = ConnectionState.Closed Then cn.Open()
			daTheBank = New OleDb.OleDbDataAdapter("SELECT " & Field & " from " & MyTable & "", cn)
			daTheBank.Fill(TheBankTable)
			CountMyTable = TheBankTable.Rows.Count
			strValue = TheBankTable.Rows(CountMyTable - 1).Item("id")
			Return strValue
			daTheBank.Dispose()
			TheBankTable.Dispose()
		Catch oExcept As OleDbException
			MessageBox.Show(oExcept.Message)
		End Try
	End Function

أرجو ان اكون وضحت لكم الأخطاء والحلول ..

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

تم تعديل هذه المشاركة بواسطة yaseralshikh في 31 أغسطس 2006 في 19:13

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

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

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

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

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

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

#31

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

#32

اللسان يعجز عن شكرك,,

بارك الله فيك

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

ووفقك لما يحبه ويرضاه

راسلني على

mamb121@hotmail.com

أو تفضل وتكرم بزيارة موقعي

www.tecnyt.com

#33

شرح رائع وممتاز .. ما شاء الله

برجاء توضيح كيفيه الاتصال بقاعدة بيانات sql server

#34

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

أنا لست خبيراً في sql server ولكني أعلم أن الفرق في الكود بسيط جداً .

المهم ..

أستبدل أول سطرين في الكود بما يلي ..

Imports System.Data
Imports System.Data.SqlClient

وفي جملة الاتصال بالسيرفر أكتب وغير ما يلزم من اسم السيرفر واليوزر والباسورد ..

Dim objConnection As New SqlConnection("server=bnewsome;database=pubs;user id=sa;password=!p@ssw0rd!;")

وبعدين أي عبارة OleDb استبدلها بـ Sql

هذا والله الموفق ..

تم تعديل هذه المشاركة بواسطة yaseralshikh في 2 سبتمبر 2006 في 12:06

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

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

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

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

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

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

#35

أخونا المهندس ياسر /

الله يسلم هالديات ويجزيك ألف ألف خير على هالموضوع الجبار، بصراحة إنك فكيت لي أزمة كنت حايص فيا من شهر في ADO.NET 2005.

وتشكر كتيييير على هالموضوع 183.gif،

بصراحة يستاهل التثبيت

ولو سمحت ممكن تبين لي شو الفرق بين ربط المشروع بقاعدة بينات بالطريقة ياللي إنتي عملتها ، وبين الطريقة التالية :

1. نرسم textbox في الفريم .

2. من قائمة data نختار ( Add New Data source ) .

3. نتبع الوينزارد.

4. بعد انتهاء الوينزارد نذهب إلى شريط ( Data source ) ، وتختار الحقل اللي بدكياه .

5.نسحب الحقل ونضعه فوق الـ TextBox .

6. بعدها سوف يضاف تلقائياً ، شريط أدوات ToolStrip فيه زر للانتقال للسجل الأول ، وزر للانتقال للسجل الأخيل ، وزر للتالي ، وزر للسابق ، وزر الحفظ ، وزر الإضافة ، ولكن المشكلة مافيها زر للبحث :angry:

ولكن أنا بصراحة أفضل طريقتك ، لأنو أحب أن أعرف كل شيء شلون صار ، ولكني المشكلة أنو أشاء كتييرة ماني فاهمها بالكود ياللي إنت كتبته مشكوراً ، ولكني سأثقل عليك بالأسئلة ، الله يخليك تحملني ، والشباب كذلك .

وتسلم يا غالي

على فكرة :

شلون بدي حسن الكود ياللي في txtfind بحيث إنو إبحث عن أي كلمة في السؤال حتى لو كانت في وسط السؤال ؟؟؟

والله ينفعنا ببركاتك .

#36

شكرا جزيلا اخى فى الله والله العظيم شىء فوق الرائع بكثير جزاكم الله كل خير

كل عام وانتم بخير

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

#37

بسم الله الرحمن الرحيم

أشكر الأخوان على المشاعر الطيبه واسأل الله أن يحبكم كما أحببتموني فيه ، وأن يجعل عملنا خالصاً لوجهه الكريم ..

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

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

اقتباس
لأنو أحب أن أعرف كل شيء شلون صار

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

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

('%" + Trim(txtFind.Text) + "%');"

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

أما تثبيت الدرس فهو يعود للسادة المشرفين ..

-waf

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

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

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

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

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

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

#38

حضرة المهندس ياسر :

بعد التحية : 018.gif

yaseralshikh كتب:
لو تسأل ألف سؤال يومياً لن نمل وسوف نرد عليها بألفين إجابه يومياً ، أنت فقط اسأل ...

شكراً كتير كتير على هالكلام الحلو من .. الله يجزيك عنا خير ويكتر من أمثالك .

وبصراحة أحرجتني 020.gif

بالنسبي للبحث في وسط السؤال لقد غيرت الكود ياللي في تعريف الـ sub serch وأصبح كالتالي :

للسؤال :

sql2 = "SELECT ask FROM Data where ask like ('%" + Trim(txtFind.Text) + "%');"

للجواب :

sql2 = "SELECT answer FROM data where answer like ('%" + Trim(txtFind.Text) + "%');"

ولكن وللأسف لم ينفع 001.gif

فكرت شوية 016.gif

ألت خليني أفل المشروع وعيد فتحو مرة تاني ..... 049.gif

برضو ما زبط

ألت خليني أعمل ري زفت قصدي( ري ستارت للجهاز) ، يمكن مسكت براس الجهاز حاجي إلا بدو يعملا ؟؟؟ 028.gif

برضو ما زبط .... 016.gif

بصراحة فكرت إني أفرمتو 024.gif

على العموم حبيبي لا مشكلة ، رح حاول فيها لين ما تزبط معي وأشوف شو كانت المشكلي بالزبظ ؟؟؟ .

[

008.gif

في جمل في الدالة Search بدياك توضحها :

 MyDataView.Sort = "ask"
				sql2 = "SELECT ask FROM Data where ask like ('%" + Trim(txtFind.Text) + "%');"
				cn.Open()
				da2.SelectCommand = New OleDbCommand(sql2, cn)
				ds2 = New DataSet("TheBankAndData")
				If cn.State = ConnectionState.Open Then
					da2.MissingSchemaAction = MissingSchemaAction.AddWithKey
					da2.Fill(ds2, "TheBankAndData")
				End If
				If ds2.Tables("TheBankAndData").Rows.Count <> 0 Then strSearch = ds2.Tables("TheBankAndData").Rows(0)("ask")

وهذا الكود اللي محطوط في btnfind ما فهمته ؟؟

 intPosition = MyDataView.Find(strSearch)
		strSearch = Nothing
		If intPosition = -1 Then
				   Else

			ToolStripStatusLabel1.Text = "Record Found"
			MyCurrencyManager.Position = intPosition
		End If
			 ShowPosition()

وعندي بعض الأسئلة بدياك توضح لياها الله يرضى عليك :

في الكود التالي وفي بقية الأكواد ليش استخدمت Friend ولم تستخدم Dim ؟ يعني شو الفرق الرئيسي بينهم ؟ وليش ما كتبت AS String ؟

 Friend strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\InformationBank.mdb;User Id=admin;Password=;"

ممكن تشرح الأكواد التالية : وشو فائدة WithEvent ؟

Friend WithEvents MyCurrencyManager As CurrencyManager

 MyCurrencyManager = CType(Me.BindingContext(MyDataView), CurrencyManager)

txtid.DataBindings.Add(New Binding("Text", MyDataView, "id"))

شو فائدة هالدالي :

cboField_SelectedIndexChanged( Nothing, Nothing)

أخونا ياسر آسف على تآلت الدم ، والله محرج منك كتيير كتيير ، يمكن أخذت وجه زيادة ؟؟ 052.gif ؟؟ ، بس الله يجزيك عني وعن الشباب خير .

وبالله عليك إذا ما كنت فاضي لا تثقل على حالك . وشكرا

#39

شكراااااااااااااااااااا كتير للاخ العزيز yaseralshikh على المشاركه الممتعه

فى حاجه انا مش لاقيها وهى الاداة ToolStripStatusLabel1 الاقيها فين

ممكن التوضيح بالصور

وشكرا

#40

أخي mido software

السلام عليكم :

بعد إذن المهندس ياسر :

الأداة ToolStripStatusLabel1 تجدها في صندوق الأدوات ToolBox

تحت عنوان Menu And ToolBad

واسمها statuesStrip كما في الصورة التالية :

oeDUt9xeDqcLv33r.jpg

وهى شريط معلومات لتبيين الحالة كشريط المعلومات اللي في أسفل شاشة الوورد .

#41

بسم الله الرحمن الرحيم

وبه أبدا وأستعين ، وأختم بالصلاة والسلام على خاتم الأنبياء والمرسلين ، أما بعد ..

لو أستطيع الوفاء بقولي ألفين إجابة يومياً :blink: لفعلت ولكني كنت أريد أن أشجعك على السؤال ، ولم أجد طريقه أفضل من ذلك .. لذلك المعذرة 235.gif ..

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

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

****************

MyDataView.Sort = "ask"
				sql2 = "SELECT ask FROM Data where ask like ('%" + Trim(txtFind.Text) + "%');"
				cn.Open()
				da2.SelectCommand = New OleDbCommand(sql2, cn)
				ds2 = New DataSet("TheBankAndData")
				If cn.State = ConnectionState.Open Then
					da2.MissingSchemaAction = MissingSchemaAction.AddWithKey
					da2.Fill(ds2, "TheBankAndData")
				End If
				If ds2.Tables("TheBankAndData").Rows.Count <> 0 Then strSearch = ds2.Tables("TheBankAndData").Rows(0)("ask")

قبل كل شيء أحب أن أوضح أنني في البحث قمت بعمل جملة استعلام جديدة ( SQL2 )وموفق بيانات جديد ( DataAdapter2 ) و فئة بيانات جديد ( DataSet2 ) والسبب أنني لا أريد أن يؤثر فرز البيانات الجديد على البيانات بحيث لا يظهر إلا ما كنت ابحث عنه " لا " أنا أريد أن تبقى البيانات كما هي ، وانتقل لموضع المعلومة التي أبحث عنها فقط . ولم أجد طريقه مناسبه لذلك في أي مكان لذلك فكرت في هذه ألطريقه التي وفت بالغرض وربما يوجد أحسن منها أنا لا أعلم ..

************

نحن استخدمنا الغرض MyDataView في البداية لفرز و ترشيح البيانات وعرضها في ترتيب مختلف . وفي السطر الأول من الكود الذي في الأعلى طلبنا من MyDataView أن يرتب البيانات تصاعدياً ، بناءً على العمود ask الموجود في الجدول "TheBankAndData" والذي هو حصيلة ربط الجدولين TheBank و جدول Data.

وفي السطر الثاني قمنا بكتابة جملة الاستعلام التي تحدد لنا بيانات العمودask الموجوده في جدول Data والتي تحقق شرط إحتوائها العبارة المذكورة في مربع النص txtFind.Text سواء كان في أول أو وسط أو أخر النص ، والذي استخدمنا معه الخاصية Trim التي تلغي منه أي مسافات .

السطر الثالث قمنا بفتح الإتصال ، والمفروض نفتحه بهذا الكود ..

 If cn.State = ConnectionState.Closed Then cn.Open()

والسبب انه لو كان مفتوح من قبل سوف يعطينا خطأ .

وفي السطر الرابع قمنا بتجهيز موفق البيانات da2 ( DataAdapter ) بناءً على جملة الاستعلام المذكورة فيما سبق واخذ المعلومات من قاعدة البيانات المربوطة بواسطة cn وهو الـ Connection الذي استخدمنا للإتصال بقاعدة البيانات .

وفي السطر الخامس قمنا بتجهيز فئة البيانات ds2 ( DataSet ) وتسمية الجدول الذي سوف نخزن فيه البيانات باسم "TheBankAndData" والمفروط أني أسميه "Data_Ask" ما علينا هذه غلطه لكنها تمشي فهي غير ذات أهمية في التسمية .

السطر السادس لا يوجد له أي أهميه في هذا المكان لأننا فتحنا الاتصال في السطر الثالث . يمكن إلغاؤه من الكود.

السطر السابع محتاج شحذ كل التركيز كي يفهم ، وفيه نوضح لموفق البيانات "da2" الفعل الذي يجب أن يقوم به عند فقدان التناظر بين العمودين المترابطين في الجدولين TheBank والجدول Data وهما العمود TheBank.ID والعمود Data.ID ، وتسمح لنا خاصية MissingSchemaAction بتحديد ما يجب أن يحدث عندما يحاول الموفق كتابة بيانات في عمود غير معروف في مخطط فئة البيانات ، والقيمة التي استخدمناها هنا هي AddWithKey والتي تعني إضافة جدول البيانات أو العمود إلى فئة البيانات وإلى المخطط مرفقاً مع بيانات عن المفتاح الأساسي ( Primary Key ) . والعجيب أن هذا السطر غير مهم هنا بسبب عدم ربط جدولين في جملة الاستعلام SQL2 ، ويمكن إلغاؤه أيضاً . اعترف أنني ارتكبت الكثير من الأخطاء بسبب عدم الفهم في بداية الأمر وعدم مراجعة الكود .

السطر الثامن نقوم فيه بتعبئة فئة البيانات بالجدول الذي استعلمنا عنه في موفق البيانات وأسميناه "TheBankAndData" والمفروط أني أسميه "Data_Ask" ما علينا هذه الغلطة تتكرر مره ثانية لكنها تمشي فهي غير ذات أهمية في التسمية .

السطر التاسع يجب إلغاؤه مع السطر السادس .

السطر العاشر وفيه ما يلي : بعد تعبئة فئة البيانات بالجدول المذكور في السطر الثامن نتحقق من أنه ممتلئ وليس فارغ ، فإذا كان فارغ فهذا يعني انه لا توجد بيانات تتوافق مع العبارة المكتوبة في مربع النص txtFind.Text وحينها سوف يعود المتغير strSearch بالقيمة Nothing ، أما إذا كان الجدول ممتلئ ولو بسجل واحد فقط ، فهذا يعني انه توجد بيانات تتوافق مع العبارة المكتوبة في مربع النص txtFind.Text وحينها سوف يعود المتغير strSearch بالقيمة الأولى التي وجدها في هذا الجدول وهي على سبيل المثال " Who is president of the Saudia? " .

اقتباس
وهذا الكود اللي محطوط في btnfind ما فهمته ؟؟

intPosition = MyDataView.Find(strSearch)
		strSearch = Nothing
		If intPosition = -1 Then
			ToolStripStatusLabel1.Text = "Record Not Found"
			txtFind.Text = ""
		Else
			ToolStripStatusLabel1.Text = "Record Found"
			MyCurrencyManager.Position = intPosition
		End If
			 ShowPosition()

السطر الأول : في هذا الكود نستخدم خاصية البحث للـ MyDataView في البحث عن العبارة التي عاد بها المتغيير strSearch من الدالة Search وكما قلنا سابقا أذا وجد بيانات فسوف يعود بهذه البيانات وإذا لم يجد فسوف يعود بالقيمة Nothing ..

ونتيجة هذا الكود تعود على شكل رقم موضع السجل داخل الجدول الذي يحتوي على البيانات المذكورة في txtFind.Text في حالة وجودها ، أما إذا لم يجدها فسوف يعود بالقيمة -1 ، وتخزن هذه النتيجة في المتغير intPosition .

السطر الثاني : نجعل قيمة المتغير strSearch = Nothing وذلك تمهيداً لعملية بحث جديدة .

السطر الثالث : نختبر قيمة المتغيير intPosition فإذا كانت -1 يعرض العباره التاليه "Record NotFound" في الأداة "ToolStripStatusLabel1.Text" كما في السطر الرابع ثم يفرغ مربع النص txtFind كما في السطر الخامس .

السطر السابع : في حالة وجود بيانات يعرض العبارة التالية "Record Found" في الأداة "ToolStripStatusLabel1.Text" .

السطر الثامن : نجعل MyCurrencyManager.Position ينتقل إلى الصف رقم "القيمه التي عاد بها intPosition " وليكن 2 مثلاً .

السطر العاشر : نستدعي الإجراء ShowPosition() الذي يحدد رقم السجل الحالي من عدد السجلات .

اقتباس
في الكود التالي وفي بقية الأكواد ليش استخدمت Friend ولم تستخدم Dim ؟ يعني شو الفرق الرئيسي بينهم ؟ وليش ما كتبت AS String ؟

نستخدم كلمة Friend للإعلان عن المتغيرات التي يمكن الوصول إليها من داخل نفس المشروع ، ولكن ليس من خارج المشروع .

نستخدم كلمة Dim للإعلان عن المتغيرات على مستوى وحدة الكود .

والخلاصة كلها تنفع ويمشي الحال ، وينطبق ذلك على كلمة Private .

أما عدم استخدامي AS String هو ألعجله والمفروض أني استخدمه ولكن الفيجوال بيسك في هذه الحالة رايح يعتبره من نوع Variant .

اقتباس
ممكن تشرح الأكواد التالية : وشو فائدة WithEvent ؟

Friend WithEvents MyCurrencyManager As CurrencyManager

CurrencyManager يتعقب ترتيب فئة البيانات DataSet ، وينسق حركة البيانات من DataSet إلى عناصر التحكم المرتبطة به مثل TextBox و Combobox و ListBox .. الخ ، ولذلك نجده رائع في الإبحار بين السجلات ( First , Next , Previous , Last , lblPosition ) ، أما سؤالك عن WithEvent فإليك الجواب ، نحن قمنا بالتصريح عن المتغير MyCurrencyManager مستخدمين الكلمة المفتاحية WithEvent وذلك كي نستدعي أحداثه وهي (BindingComplete ، CurrentChanged ، CurrentItemChanged ، DataError ، ItemChanged ، ListChanged ، MetaDataChanged ، PositionChanged ) .

علماً أنني لم أستخذ أي واحد منها في الدرس ( وبالتالي يمكن حذف العبارة WithEvent من الكود ) ، ولا أعلم في الحقيقة تفاصيل كل حدث منها باستثناء الحدث PositionChanged والذي يمكننا استخدامه في إظهار ترتيب السجل الجديد في أداة التحكم lblPosition.Text كما في الكود التالي :

	Private Sub MyCurrencyManager_PositionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyCurrencyManager.PositionChanged
		lblPosition.Text = MyCurrencyManager.Position + 1 & _
" of " & MyCurrencyManager.Count()
	End Sub

**********

MyCurrencyManager = CType(Me.BindingContext(MyDataView), CurrencyManager)

قبل هذا الكود قمنا بالتصريح عن MyCurrencyManager ولم نهيئه بعد للعمل ، في هذا الكود قمنا بتهيئته للعمل ، ولو تلاحظ خطوات سير الكود أننا في البداية عبئنا الجدول "TheBankAndData" في DataSet باستخدام DataAdapter ثم ربطنا MyDataView بالجدول الموجود في DataSet وبعد ذلك ربطنا MyCurrencyManager بي MyDataView وبذلك أصبح جاهزاً للعمل .

******

txtid.DataBindings.Add(New Binding("Text", MyDataView, "id"))

في هذا الكود قمنا بربط مربع النص txtid بي MyDataView لأنها كما قلنا سابقا أصبحت مربوطة بالجدول "TheBankAndData" وبالتحديد بالحقل "id" من الجدول . وهذا النوع من الربط يمكن MyCurrencyManager من الإمساك بعنصر التحكم txtid والإنتقال به إلى السجل الجديد في حالة الإبحار والتحديث .

********

cboField_SelectedIndexChanged( Nothing, Nothing)

في هذا الكود نستدعي إجراء كنا قد كتبناه وأعددناه سابقاً وهو ..

	Private Sub cboField_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboField.SelectedIndexChanged
		Select Case cboField.SelectedIndex
			Case 0 'Number Name
				MyDataView.Sort = "Asknumber"
				ToolStripStatusLabel1.Text = "Records Sorted By Number"
			Case 1 'ask 
				MyDataView.Sort = "ask"
				ToolStripStatusLabel1.Text = "Records Sorted By Ask"
			Case 2 'answer
				MyDataView.Sort = "Answer"
				ToolStripStatusLabel1.Text = "Records Sorted By Answer"
		End Select
		btnMoveFirst_Click(Nothing, Nothing)
	End Sub

وفي الختام اكرر اعتذاري على التقصير و التأخير بسبب الانشغال ، ربما كان شرحي غير واضح أو به بعض الأخطاء ولكن أنا شرحت على قد فهمي للكود ..

*******

أخي mido software إضافة إلى كلام أخي mohamd2020 بعد إضافة statuesStrip للمشروع أنقر على السهم أللذي فيها واختار statuesLable بعدها تجد ToolStripStatusLabel1 .

أخي mohamd2020 ليس هناك داعي للاستئذان ، أنا لا أحتكر الدرس بل أحب أن يشارك الجميع في الشرح والإضافة على الدرس ..

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

189.gif

.. هذا والحمد لله رب العالمين ..

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

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

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

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

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

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

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

#42

شكرا جزيلا جدا للاخ ياسر و محمد على التوضيح الجميل

بس انا لسه فى الاول بس وانا بكتب البرنامج

Private Sub FillDataSetAndView()

Try

' Initialize a new instance of the DataSet object...

myds = New DataSet()

' Fill the DataSet object with TheBankAndData...

dathebankanddata.Fill(myds, "TheBankAndData")

' Set the DataView object to the DataSet object...

MyDataView = New DataView(myds.Tables("TheBankAndData"))

' Set our CurrencyManager object to the DataView object...

mycurrencymanager = CType(Me.BindingContext(MyDataView), CurrencyManager)

cn.Close()

Catch ex As Exception

MessageBox.Show(ex.Message, " Fill the DataSet and bind the fields... ", MessageBoxButtons.OK, _

MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, _

MessageBoxOptions.RtlReading)

End Try

وانا بكتب كلمة MyDataView بيعمل تحتها خط ازرق و كأنها error مش عارف ليه ومش راضى يشتغل البرنامج

#43

ربما أنت لم تصرح عن MyDataView بعد ..

في البداية يجب التصريح عن المتغير ، كي يتعرف عليه البرنامج فيما بعد ، وذلك كما يلي :

Private MyDataView As DataView

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

تم تعديل هذه المشاركة بواسطة yaseralshikh في 7 سبتمبر 2006 في 17:45

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

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

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

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

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

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

#44

اولا انا مش عارف اشكرك إزاى

ثانيا هو فين الملف

#45

تجده في الرابط التالي ، فقط إنتظره حتى ينتهي من العد ...

http://download.35mb.com/yaser95/LearnADON...portFormula.zip

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

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

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

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

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

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

#46

شكرا جزيلا جدا ليك يا اخ ياسر

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

إنت من انه بلد يا أخ ياسر

#47

حضرة المهندس ياسر ..

أصدي حضرة الأستاذ الدكتور ( ولا تزعل ) .. 004.gif

والله لا أستطيع أن أكافأك إلا بالدعاء ، فجزاك الله عني وعن الشباب خيراً .

لقد طبعت الدرس ، وسأرد عندما أنتهي منه قريباً .

2_asmilies-com.gif
#48

لقد قمت بحذف الروابط القديمة لتحميل المشروع لان المشروع القديم فيه أخطاء ، وقد تلافيتها ، وقمت أيضاً بترفيع المشروع من جديد بعد التعديل عليه ، وهو موجود في هذا الرابط ...

http://download.35mb.com/yaser95/Learn%20A...ort_Formula.zip

.. والله الموفق ..

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

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

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

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

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

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

#49

أخي الأستاذ الغالي ياسر :

أسعد الله أوقاتك بكل خير .

تسلم كتير كتير عب الشرح الوافي 015.gif بصراحة I Don't have Thanks .

001.GIF

بس ما زال عندي بعض الإشكالات في بعض أجزاء الكود لأني بصراحة أول مرة أتعامل مع قواعد بيانات 021.gif

025.gifحضرة الأستاذ ياسر : لقد رقمت الأسئلة التالية ، على شان ما تعب حالك وتنسخ وتلصق وتعمل اقتباسات . فقط اكتب رقم السؤال والإجابة عليه ، والله يخليك لا تتعب حالك ولا تكلف على نفسك ، وإيمتا ما فضيت جاوبني ، ولك مني خالص دعواتي جزاك الله ألف خير

ds2.Tables("TheBankAndData").Rows.Count

1- الكود السابق معناتو: رقم الصف ياللي في الجدول ( ThwBankAndData ) ياللي في مجموعة البيانات ds2 ؟

يعني هل يرجع قيمة الصف ؟؟ ولا شو ؟؟ لأنو مكتوب .count ؟؟ ولا وضيفة Count بس إنو ترجع هل الصف مليان أم لا ؟؟؟

001.GIF

ds2.Tables("TheBankAndData").Rows(0)("ask")

2- هل الكود السابق يرجع قيمة الصف رقم صفر في الحقل Ask من الجدول TheBankAndData ؟

001.GIF

في الكود ياللي في BtnSave_click :

Dim maxIdCommand As OleDbCommand = New OleDbCommand("SELECT MAX(id) AS MaxID FROM thebank ", cn)
Dim maxId As Object = maxIdCommand.ExecuteScalar() + 1

3- شو الفائدي من maxIdCommand ؟؟؟

4- والله يخليك ترجملي عمل جملة الـ SQL التابعة له .

5- وهذه الخاصيي ExcuteScalar شو فائدتا ؟؟؟

001.GIF

6- شو فائدة هادا الكود :

InsertCommand.Parameters.AddWithValue("?", txtask.Text)

7- وليش بالتحديد علامة الإستفهام ؟؟

001.GIF

8- وهدا الكود كمان شو عملو ؟؟

InsertCommand.ExecuteNonQuery()

9- وهدا الكود التالي كمان شو يعني ؟

maxIdCommand.Dispose()

10- يعني إيمتا نستخدم الخاصية DisPose ؟

025.gifحضرة الأستاذ ياسر : لقد رقمت الأسئلة التالية ، على شان ما تعب حالك وتنسخ وتلصق وتعمل اقتباسات . فقط اكتب رقم السؤال والإجابة عليه ، والله يخليك لا تتعب حالك ولا تكلف على نفسك ، وإيمتا ما فضيت جاوبني ، ولك مني خالص دعواتي جزاك الله ألف خير

001.gif
#50

الف الف الف الف الف

شكر ولك مني الدعاء على هذه الجهود

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