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

منع تكرار ال ID

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

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

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

انشئت مشروع لتطبيق ويب يعتمد على طبقتي الـ DAL و الـ BAL ....

- مهمة الـ DAL الاتصال بشكل مباشر بقاعدة البيانات .

- مهمة الـ BAL توفير شروط معينة للطرق و الاستعلامات الخاصة بالعمليات على البيانات من : حذف ، تعديل ، اضافة و غير ذلك.

من احدى الطرق التي انشئتها في طبقة الـ BAL طريقة ADD ، هذه الطريقة تقوم بعملية اضافة البيانات عن طريق استعلام متواجد بطبقة الـ DAL .

* مرة أخرى الطريقة ADD تسمح باضافة البيانات بما فيها حقل الـ ID (حيث حقل الـ ID من نوع Int).

المشكلة :

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

السؤال:

هل هنالك من امكانية اضافة شروط معينة لمنع حدوث هذه المشكلة ضمن طبقة الـ BAL ؟

، لكم جزيل الشكر.

#2
bool FindId(long myId)
	{		
		OleDbDataReader dr;
		YourDalClass = new YourDalClass();
		string str = String.Format("select * from TABLENAME where KEYFIELDNAME={0}", myId);
		dr = c.DrConnect(str);
		bool r = dr.HasRows;
		c.closeConnection();
		if (r)
			return true;
		else
			return false;
	}
#3

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

هذا أفضل من ناحية وضوح الكود و أسهل من اجل صيانة الأكواد و طبعا أسرع في عرض الصفحة :)

نصيحة: حاولي قدر الإمكان جعل العمليات والحسابات داخل ال DBMS و أعتقد أن هذا من أحد ميزات ال SQL Server حيث يمكن عمل الكثير داخل ال Stored Procedures

حظا موفقا

You can fly while you can touch the sky

#4

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

المبرمج / aaaaaForum

اقتباس

bool FindId(long myId)

{

OleDbDataReader dr;

YourDalClass c = new YourDalClass();

string str = String.Format("select * from TABLENAME where KEYFIELDNAME={0}", myId);

dr = c.DrConnect(str);

bool r = dr.HasRows;

c.closeConnection();

if ( r)

return true;

else

return false;

}

فكرتك رائعة !! هذه الفكرة التي كنت أبحث عنها، و لم تخطر ببالي !

تعتمد طريقة " aaaaaForum " على إرجاع قيمة منطقية صحيحة إذا حدث تكرار لقيمة حقول الـ ID.

و لكن بما أني استخدم طبقتي الـ DAL و الـ BAL فأفضل تجنب كتابة الاستعلامات ضمن طبقة الـ BAL ،و بذلك سوف أجري بعض التغيرات البسيطة لسهولة الاستخدام .

لنفترض أننا قمنا بإضافة( GetRowsByID(ID في طبقة الـ DAL للـ TableAdapter الخاص باستعلامات الـ IDالتي تجرى على جدول الـ ID.

( GetRowsByID(ID: هو استعلام يقوم بـ استرجاع السجلات التي تحمل نفس قيمة ID الممرر لها .

Private Function DuplicateID(ByVal ID As Integer) As Boolean
  'أولا سوف أقوم بتعريف متغير يحتوي على السجلات المسترجعة	   
Dim Rows As ID_DataSet.ID_DataTable = Adapter.GetRowsByID(ID)
 'ثانيا احدد عدد السجلات المسترجعة	   
If Rows.Count = 0 Then
			Return True
		Else
			Return False

		End If

	End Function

ملاحظة :

إذا كان حقل الـ ID هو Primary Key فليس هنالك من ضرورة من استخدام الطريقة ، حيث أنه عند تفعيل خيار الـ Primary Key لحقل الـ ID ، تنشأ قيود على هذا الحقل و هي كالتالي :

* عدم السماح بإدخال قيمة فارغة لهذا الحقل.

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

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

، أشكرك كثيرا ..لك تحية.

#5

الأستاذ / محمد خليل أبو صلاح

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

فلدي جهل كبير بالإمكانيات و الإجراءات التي توفرها لي بيئة الـ SQL Server ، لذا سأخصص الفترة القادمة إن شاء الله في دراسة هذا الموضوع.

، نشكر لكم اهتمامكم و جهودكم البناءة لنشر العلم و المعرفة.

، لكم تحية .

#6

الأستاذ / محمد خليل أبو صلاح

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

فلدي جهل كبير بالإمكانيات و الإجراءات التي توفرها لي بيئة الـ SQL Server ، لذا سأخصص الفترة القادمة إن شاء الله في دراسة هذا الموضوع.

، نشكر لكم اهتمامكم و جهودكم البناءة لنشر العلم و المعرفة.

، لكم تحية .

#7

العفو انا ما عملت شي.. عموما انا كتبت مثال جيد جدا خاصة لعملية التعديل والاضافة على شكل Stored Procedure.

الفكرة: نقوم بعمل Execute لل StoredProcedure و نمرر لها Id و UserName و في حال أن السجل موجود ستقوم فقط بتعديله للبيانات الجديدة و إن لم يكن موجودا تقوم بإنشاء سجل جديد و تضيف إليه البيانات.

الكود كالتالي و أتمنى أن يكون واضحا:

CREATE PROCEDURE SP_AddNewUser
@Id int,
@Name nvarchar(500)
as
IF isnull((Select Count(id) From [JuliaTable]  where Id = @Id),0)>0
update [JuliaTable]  set [Name] = @Name where Id = @Id 
Else 
	Begin

	 If @Name <> ''
		Insert Into [JuliaTable]  (Id,Name)Values(@Id,@Name)
	End
GO

لو كان في أي إستفسار يا ريت تطرحوه ما في مشكلة

You can fly while you can touch the sky

#8

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

الأستاذ / محمد خليل أبو صلاح ..

فكرتك جميلة ، و الكود واضح بالنسبة لي .

، شكرا لك مرة أخرى ..

، تحياتي .

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

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