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

رجاء كيف أقوم بعمل Sql للتحقق من سجل قبل إضافة سجل أخر في قاعدة البيانات لمن تكرار

بدأه hicham_ في 7 أغسطس 2008 · 6 رد · 1,083 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

عندي قاعدة بيانات من نوع أكسس وعندي في الفورم تكست بوكس وبتون للحفظ مثلا

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

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

وأنا عاوز الكود أو الإستعلام بالدوت نت الله يجازيكم خيرا

#2

أستخدم جملة أستعلام (select )عن الصنف برقمة الصنف قبل أضافة أي صنف >>

#3

السلام عليكم

الأمر بسيط للغاية أخي الكريم ..

أولا يوجد هناك طريقتين لفعل ذلك الأمر :

الطريقة الأولى :

عندما نريد أن نتحقق من رقم معين في قاعدة البيانات إذا كان موجود بالفعل أم لا ، يجب أن نرسل datareader لتتحقق من الرقم .. فإن وجدت الرقم موجود تخبرنا برساله ولتكن ( الرقم مكرر ) .. وإن لم يكن الرقم موجود نقوم بإدخال الرقم وحفظة بقاعده البيانات.

ولكن هذة الطريقة بطيئه نوعا ما إذا كانت قاعدة البيانات تحتوي على آلاف البيانات والارقام ..

تخيل معي أخي الكريم لو أن قاعدة البيانات تحتوي على 1000000 سجل :blink: ، وعندما نريد ان نتحقق من تكرار الرقم ستقوم الـ datareader بالمرور على كل السجلات من الأعلى إلى الأسفل ، وتخيل أيضا لو أن الرقم الذي سوف ترجع به الـ datareader هو آخر رقم بقاعدة البيانات ... فما هو الوقت المتوقع لهذة العملية .. :S

اذا انت مصمم على هذا الاسلوب .. فخذ هذا كود العملية :

cn.Open()

		Dim cmd As New OleDb.OleDbCommand
		Dim dr As OleDb.OleDbDataReader
		cmd.Connection = cn
		cmd.CommandText = "select id from t1 where id=" & TextBox1.Text & ""
		dr = cmd.ExecuteReader
		dr.Read()

		If dr.HasRows Then
			MsgBox("الرقم مكرر")
			dr.Close()
			cn.Close()
			Exit Sub
		Else
			dr.Close()
			cmd.CommandText = "insert into t1(id) values(" & TextBox1.Text & ")"
			cmd.ExecuteNonQuery()
		End If
		cn.Close()

الطريقة الثانية :

لكل قاعدة بيانات أخطاء من المتوقع السقوط بها ..

على سبيل المثال :

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

ملاحظة مهمة : هذا الخطأ الذي حدث له رقم بقاعدة البيانات .. أي أن قاعده البيانات تحتوي على ارقام الأخطاء ..

أي أن خطأ الارقام المكرره له رقم أيضا ولكن يختلف عن رقم ترك الحقل فارغ .

لهذا نحن الآن محتاجين رقم خطأ الادخال المكرر .. لماذا ؟

افترض ان رقم الخطأ هو 1245874

لذا نريد ان نخبر الفجوال بسيك ان اذا كان رقم الكود الخطأ هو 1245874 .. أخرج من الإجراء وأظهر لنا رساله مضمونها ( الررقم مكرر )

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

هذا هو الكود ..

 cn.Open()
		Try
			Dim cmd As New OleDb.OleDbCommand("insert into t1(id) values(" & TextBox1.Text & ")", cn)
			cmd.ExecuteNonQuery()
		Catch ex As OleDb.OleDbException
			If ex.ErrorCode = -2147467259 Then
				MsgBox("الرقم مكرر")
			End If
		End Try
		cn.Close()

اتمنى ان الكلام يكون مفهوم وواضح

تحياتي لك

#4

جزاك الله خير اخوي طلال حامد

بس كيف استطيع اعرف ارقام الاخطاء ..

يعني على سبيل المثال رقم خطأ تكرار السجل ؟؟

#5

هلا اخوي ابو خالد ..

لكي نعرف ارقام رسائل الاخطاء نأخذ نسخة من كلاس OleDbException كما هو موضح أدناه في جملة try

 Try

		Catch ex As OleDb.OleDbException


		End Try

ومن ثم نضع كود الحفظ في جزء الـ Try ..

وفي القسم الخاص بـ Try نضع هذا الكود

   MsgBox(ex.ErrorCode)

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

ويصبح الكود الأخير كالتالي ..

 Try
			Dim cmd As New OleDb.OleDbCommand("insert into t1(id) values(" & TextBox1.Text & ")", cn)
			cmd.ExecuteNonQuery()
		Catch ex As OleDb.OleDbException

			MsgBox(ex.ErrorCode)

		End Try

تحياتي ..

تم تعديل هذه المشاركة بواسطة طلال حامد في 9 أغسطس 2008 في 11:44

#6

الله يجازيك أخي طلال علي هذا المجهود الرائع وأسئل الله العظيم أن يغفر لك ولوالديك وأن يسكنكم فسيح جناته أمين.

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

المشكلة هي : أنا عامل جدول فيه إدي طبعا وفيه كود الطالب (الرقم التسلسلي) وفيه المادة التي سيحضرها هذا الطالب , وكود الطالب يقبل التكرار لأني عامل sql في الكومبوبوكس لما يقوم المستخدم بإختيار كود الطالب تطلع فقط بيانات صاحب هذا الكود وهي المواد التي يحضرها تمام , أنا أريد أن يتم إضافة مادة واحدة لكل طالب أقصد أن لا تكون تكرار المادة لنفس الطالب مرتين أظن اني قد أوضحت وجزاك الله عني خيرا.

01.png

02.png

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

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

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

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

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