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

سؤال كيف ارجع رقم السجل الذي يتم اضافته بستور بروسيجر

مغلقمُجاب
بدأه ورق خسرانه في 13 أبريل 2013 · 36 رد · 3,090 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
لهذا السؤال إجابة معتمدة — اضغط للانتقال إليها
#1 صاحب الموضوع

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

اخواني الاعضاء والمشرفين .. لدي ستور بروسيجر يقوم باضافة البيانات الى جدول الموضفين  والجدول مكون من:

1- member_id من نوع nvarchar وهو مفتاح اساسي 

2- name

3- age

4- email

5- sal 

واريد عندما يتم اضافة السجل يقوم البورسيجر بارجاع رقم السجل الذي تم اضافته  لاني اريد رقم السجل لاقوم باضافة بيانات اخرى للموظف تتعلق به بجدول اخر

طبعاُ ال member_id انا اقوم بادخلة يبداء من الرقم 101 اول سجل

ياليت تدولني علن طريقة ارجاع قيمة السجل الذي يتم اضافة عن طريق الاستور بروسيجر ولكم جزيل الشكر مع العلم انني لستو مفعل خاصية Idntity للحقل member_id

#2

أخي الفاضل
ورق خسرانة
السلام عليكم ورحمة الله وبركاتة
 
1- اذا كان حقل كود الموظف سيحتوي علي أرقام فقط فلا داعي ليكون نوع الحقل Nvarchar أما اذا كنت تريده هكذا لغرض ما لا نعرفة فيمكنك عمل هذا الاجراء بالشكل التالي باستخدام الدالة MAX لجلب أعلي قيمة في الحقل لكن لابد من تحويل نوع الحقل الي int حتي تستطيع جلب القيمة الاعلي أو السجل الاخير حيث انك لا تستطيع عمل ذلك الا اذا قمت بتحويل نوع الحقل من Nvarchar الي int كالتالي

 

Create proc [dbo].[insert_EmployeeData]


@EmpCode nvarchar (50)
,@EmpName nvarchar (20)
,@Department nvarchar (50)

as
begin

insert into Employee(EmpCode,EmpName,DepartmentName) values (@EmpCode,@EmpName,@Department)
Select Max(convert(int,EmpCode)) as EmpCode from Employee


end

مثال آخر ويمكنك استخدام Top 1 ثم تتبعة بــ Order by DESC وايضا لا تستطيع ترتيب المدخلات بدلاله حقل كود الموظف

الا اذا قد قمت بتحويل نوعه من nvarchar الي int كالمثال التالي ولذلك كان سؤالي في أول المشاركة اذا كان لايوجد

احتياج لجعل الحقل Nvarchar فيفضل تغيير نوع الحقل من تصميم الجدول ليصبح int

 

Create proc [dbo].[insert_EmployeeData]

@EmpCode nvarchar (50)
,@EmpName nvarchar (20)
,@Department nvarchar (50)

as
begin

insert into Employee(EmpCode,EmpName,DepartmentName) values (@EmpCode,@EmpName,@Department)
Select Top 1 * from Employee order by convert(int,EmpCode) DESC

end

 

وما أفضلة أنا أن تقوم بانشاء حقل اسمة ID ويكون نوع بياناتة int وخصائصة Idntity

ثم تستخدم هذا الكود لجلب آخر قيمة في الجدول حيث ان IDENT_CURRENT تقوم بجلب آخر Idntity تم توليده في الجدول

 

Select * from Employee where ID=IDENT_CURRENT('Employee')

 

 

بالتوفيق

تم تعديل هذه المشاركة بواسطة محمد فؤاد تركي في 13 أبريل 2013 في 08:56

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#3

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

ALTER PROCEDURE [dbo].[spCitizenInsert]
	@psCitizenName nvarchar(100) ,
	@psCitizenEmail nvarchar (50) ,
	
	@pnCitizenCode  bigint OUTPUT
	
AS
BEGIN
 INSERT INTO dbo.pCitizen
           (psCitizenName,
           psCitizenEmail)
     VALUES
           (@psCitizenName,
            @psCitizenEmail
           )


SET @pnCitizenCode = @@IDENTITY

end

تم تعديل هذه المشاركة بواسطة KARIMSOFT في 13 أبريل 2013 في 13:44

#4

 مشكور اخي  المشرف محمد قؤاد على ردك . لكن  بيكون في مشكلة  عند استخدام Max  لو انا شخصان سجلان بنفس وقت سيكون هناك اعتراض بيانات ويمكن ان يكون في خطاء 

 بالنسبة للاستخدام nvarchar   انا استخدمته عشان بجمع ارقام + حروف  في الحقل هل يوجد طريقة غير الماكس ؟

#5

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

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#6
اقتباس

هل يوجد طريقة غير الماكس ؟

 

لقد قدمت لم في مشاركتي 3 حلول و MAX كانت أحد الحلول  :(

 

- الحل الاول استخدام Max

- الحل الثاني استخدام Top 1

- الحل الثلث استخدام IDENT_CURRENT

 

فلماذا لم تلتفت لباقي الحلول وشاهدت فقط الحل الذي يعتمد علي MAX

ارجو قراءة مشاركتي جيدا

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#7

 اخي محمد فؤاد .. الحل الاول الي هو يجلب Max   لن يجدي اذا كان يوجد مستخدمين سجلو بنفس الوقت .. سوف يحدث تعارض مئة بالمئة ويولد خطاء ؟

 الحل الثاني الي هو Top1  سوف يحدث تعارض اذا يوجد مستخدمين سجلو بنفس الوقت 

 

- الحل الثلث استخدام IDENT_CURRENT

 لا استطيع استعاملة لانني لستو مفعل خاصية Idntity للحقل member_id  انا عاملة فقط مفتاح رئيسي .. واقوم بتوليد الارقام بنفسي واضيف للرقم رمز معين لكل دولة 
انا اريد طريقة ترجع لي قيمة السجل بنفس الية IDENT_CURRENT مع العلم انني لستو مفعل الخاصة Idntity للحقل  اذا يوجد طريقة ياليت تساعدني فيها ولك جزيل الشكر 
#8

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

إذا أنشي جدول بعمودين وسطر واحد

الأول ID رقمي والثاني ناف تشار

وضع فيه سطر واحد قيمة الأي دي 1 و الخانة الثانية تضع فيها آخر تسلسل قمت بإنشاءه

الآن عندما تريد آخر رقم ما عليك إلا قراءة هذه القيمة

أنا أستخدم هذه الطريقة ولكن لحفظ التوقيت عندما يحدث أي تحديث أو إضافة لأي جدول في القاعدة

وذلك لمعرفة إن كان يتطلب جلب البيانات من السيرفر أم لا

وذلك من أجل التخفيف من الاتصال بالسيرفر وتجنب جلب كل شيء بلا داعي

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 14 أبريل 2013 في 07:07

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#9

اقتباس
- الحل الثلث استخدام IDENT_CURRENT
 لا استطيع استعاملة لانني لستو مفعل خاصية Idntity للحقل member_id  انا عاملة فقط مفتاح رئيسي .. واقوم بتوليد الارقام بنفسي واضيف للرقم رمز معين لكل دولة 
انا اريد طريقة ترجع لي قيمة السجل بنفس الية IDENT_CURRENT مع العلم انني لستو مفعل الخاصة Idntity للحقل  اذا يوجد طريقة ياليت تساعدني فيها ولك جزيل الشكر

 

 
أخي الفاضل
بخصوص الحل الثالث أنا لم أقل ان تجعل خاصية الحقل member_id  لتكون Idntity
أنا قلت يتم انشاء حقل جديد اسمة ID ويكون خاصيتة Idntity وبهذه الطريقة نكون ابتعدنا عن الحقل member_id  وفي نفس الوقت استطعنا جلب آخر ID تم توليده علي البرنامج
 
ارجو قراءة الحل الثالث مرة أخري بعناية وتجربتة
 
مثال

 

Create proc [dbo].[insert_EmployeeData]


@EmpCode nvarchar (50)
,@EmpName nvarchar (20)
,@Department nvarchar (50)

as
begin

insert into Employee(EmpCode,EmpName,DepartmentName) values (@EmpCode,@EmpName,@Department)

Select * from Employee where ID=IDENT_CURRENT('Employee')

end

تم تعديل هذه المشاركة بواسطة محمد فؤاد تركي في 14 أبريل 2013 في 07:47

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#10

اخي العزيز محمد فؤاد لكن انا اريد ان ارجع السجل الذي هو member_id والذي نوعه nvarchar لاني استخدمة 

لو اني ما استخدمة لكنت عملت نفس الذي قلتم لي وقمت باضافة سجل جديد  واجلب السجل عن طريقة الخاصية Idntity

بس انا محتاج السجل الذي اولد له ارقام  بنفسي طبعا الارقام تبداء من 101 + رمز كل دولة بجانب الرقم 



اخي العزيز محمد فؤاد لكن انا اريد ان ارجع السجل الذي هو member_id والذي نوعه nvarchar لاني استخدمة 

لو اني ما استخدمة لكنت عملت نفس الذي قلتم لي وقمت باضافة سجل جديد  واجلب السجل عن طريقة الخاصية Idntity

بس انا محتاج السجل الذي اولد له ارقام  بنفسي طبعا الارقام تبداء من 101 + رمز كل دولة بجانب الرقم 

#11

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

 

1- قم بادخال قيمة 101EGY في السجل الاول وشاهد النتيجة

 

post-46243-0-72382200-1365942864_thumb.j

 

كما في الصورة

 

2- ستجد ان الاستور قام بادخال البيانات داخل الجدول ثم استدعي الرقم 101EGY

 

post-46243-0-08053600-1365942888.jpg

 

3-  سنقوم الان بادخال آخر وهو 102EGY

 

post-46243-0-38405800-1365942918_thumb.j

 

وهذه هي النتيجة قام الاستوريد بروسيديور باستدعاء الرقم 102EGY وهو آخر سجل تم تسجيلة يدويا في البرنامج 

 

post-46243-0-80809400-1365942940.jpg

 

مع الوضع في الاعتبار

 

1- الحقل EMPCode نوع بياناتة Nvarchar وليس Identity ولا استخدام MAX ولا استخدام TOP 1

 

والذي تم عملة هو استدعاء آخر سجل قد تم تسجيلة في الجدول يدويا مع العلم ان الحقل EMPCode يساوي الحقل طرفك الذي تسمية member_id

 

اتمني من خلال المثال المرفق ان أكون قد وصلت الفكرة 

تم تعديل هذه المشاركة بواسطة محمد فؤاد تركي في 14 أبريل 2013 في 15:50

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#12

تعتمد اكبر قيمه في الحقل النصي علي الترتيب الابجدي ويفضل توحديد ول التسلسل من حيث عدد الحروف ومكانها وعدد الارقام ومكانها مثل

ka100

aa999

ايهما اكبر من وجهة نظرك

#13
KARIMSOFT كتب:

تعتمد اكبر قيمه في الحقل النصي علي الترتيب الابجدي ويفضل توحديد ول التسلسل من حيث عدد الحروف ومكانها وعدد الارقام ومكانها مثل

ka100

aa999

ايهما اكبر من وجهة نظرك

ka100 هذه الاكبر

محمد فؤاد تركي كتب:

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

 

1- قم بادخال قيمة 101EGY في السجل الاول وشاهد النتيجة

 

attachicon.gif1.jpg

 

كما في الصورة

 

2- ستجد ان الاستور قام بادخال البيانات داخل الجدول ثم استدعي الرقم 101EGY

 

attachicon.gif2.jpg

 

3-  سنقوم الان بادخال آخر وهو 102EGY

 

attachicon.gif3.jpg

 

وهذه هي النتيجة قام الاستوريد بروسيديور باستدعاء الرقم 102EGY وهو آخر سجل تم تسجيلة يدويا في البرنامج 

 

attachicon.gif4.jpg

 

مع الوضع في الاعتبار

 

1- الحقل EMPCode نوع بياناتة Nvarchar وليس Identity ولا استخدام MAX ولا استخدام TOP 1

 

والذي تم عملة هو استدعاء آخر سجل قد تم تسجيلة في الجدول يدويا مع العلم ان الحقل EMPCode يساوي الحقل طرفك الذي تسمية member_id

 

اتمني من خلال المثال المرفق ان أكون قد وصلت الفكرة 

 اخي اين المثال المرفق  ياليت ترفق لي الكود الذي استخدمته ولك جزيل الشكر 

#14

السلام عليكم

 

اقتباس

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

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

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

#15
TareqVB كتب:

السلام عليكم

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

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

في الحقيقة جاء الجواب في معرض كلامه ورده على الأخ محمد فؤاد في المشاركة 7

 

 

ورق خسرانه كتب:

 

 اخي محمد فؤاد .. الحل الاول الي هو يجلب Max   لن يجدي اذا كان يوجد مستخدمين سجلو بنفس الوقت .. سوف يحدث تعارض مئة بالمئة ويولد خطاء ؟

 الحل الثاني الي هو Top1  سوف يحدث تعارض اذا يوجد مستخدمين سجلو بنفس الوقت

 

- الحل الثلث استخدام IDENT_CURRENT

 لا استطيع استعاملة لانني لستو مفعل خاصية Idntity للحقل member_id  انا عاملة فقط مفتاح رئيسي .. واقوم بتوليد الارقام بنفسي واضيف للرقم رمز معين لكل دولة

انا اريد طريقة ترجع لي قيمة السجل بنفس الية IDENT_CURRENT مع العلم انني لستو مفعل الخاصة Idntity للحقل  اذا يوجد طريقة ياليت تساعدني فيها ولك جزيل الشكر

 

 

 

فوضعت له حلا بناء على هذا الجواب ولكن لم يعلق عليه  المشاركة 8

 

 

أبو أحمد المبرمج كتب:

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

إذا أنشي جدول بعمودين وسطر واحد

الأول ID رقمي والثاني ناف تشار

وضع فيه سطر واحد قيمة الأي دي 1 و الخانة الثانية تضع فيها آخر تسلسل قمت بإنشاءه

الآن عندما تريد آخر رقم ما عليك إلا قراءة هذه القيمة

أنا أستخدم هذه الطريقة ولكن لحفظ التوقيت عندما يحدث أي تحديث أو إضافة لأي جدول في القاعدة

وذلك لمعرفة إن كان يتطلب جلب البيانات من السيرفر أم لا

وذلك من أجل التخفيف من الاتصال بالسيرفر وتجنب جلب كل شيء بلا داعي

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 15 أبريل 2013 في 11:12

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#16
أبو أحمد المبرمج كتب:

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

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

فانا الذي اريدة ان ارجع قيمة السجل الذي يتم اضافته .. وقلت ان الحقل member_id هو من نوع nvarchar وهو  المفتاح الاساسي للجدول .. وبعض الاخوان قالو اضيف حقل جديد واضع له الخاصية اي Idntity وانا قلت لا اريد ان اقوم باضافة سجل جديد اريد فقط ان ارجع السجل   وسئلت له يوجد طريقة 

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

#17

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

وعلى أية حال لا بأس سأشرح الطريقة بتوضيح أكبر

أولا ننشيء جدول يحوي عمودين الأول ID رقمي والآخر LastID من النوع [NVARCHAR] و نضع فيه سطر واحد بقيمة فارغة ومعرف قيمته 1
كما يلي

USE [xxxxx]
GO

/****** Object:  Table [dbo].[TblLastTime]    Script Date: 2013/04/15 03:18:52 م ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TblLastID](
	[ID] [int] NOT NULL,
	[LastID] [NVARCHAR](20) NULL,
) ON [PRIMARY]

GO

INSERT INTO [dbo].[TblLastID]
           ([ID],[LastID])
     VALUES (1,'')
GO

طبعا ضع بدل xxxxx  اسم القاعدة لديك

 

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

 

	UPDATE dbo.TblLastID	SET LastID = ?????	WHERE ID = 1

 

طبعا ????  هي القيمة الجديدة التي قمت بتوليدها

 

بهذه الطرقة تضمن أن هذا الجدول يحوي في سطره الأول آخر تسلسل قمت بتوليده

 

لقراءته ما عليك إلا استخدام فنكشن لإرجاع القيمة تلك

 

أنشيء الفنكشن كما يلي

 

USE [xxxxx]
GO

/****** Object:  UserDefinedFunction [dbo].[GetLastTime]    Script Date: 2013/04/15 03:29:37 م ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date, ,>
-- Description:	<Description, ,>
-- =============================================
CREATE FUNCTION [dbo].[GetLastID] 
(
)
RETURNS [NVARCHAR](20)
AS
BEGIN
	RETURN 
	(
		SELECT TOP 1 LastID
		FROM TblLastID
		WHERE ID = 1
	)
END


GO

 

الآن عند استدعاء الفنكشن سيعيد لك آخر قيمة تم حفظها أي آخر تسلسل قمت بتوليده

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 15 أبريل 2013 في 14:34

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#18
أبو أحمد المبرمج كتب:

ليتك ذكرت أنك لم تدرك الطريقة لكنت زدت بالتوضيح

لأني ولضيق الوقت أكتفي بالإشارة للحل بدلا من الإسهاب والتفصيل ,بصراحة أنا قلت جواب مختصر خير من تجاهل الجواب

وعلى أية حال لا بأس سأشرح الطريقة بتوضيح أكبر

أولا ننشيء جدول يحوي عمودين الأول ID رقمي والآخر LastID من النوع [NVARCHAR] و نضع فيه سطر واحد بقيمة فارغة ومعرف قيمته 1

كما يلي

USE [xxxxx]
GO

/****** Object:  Table [dbo].[TblLastTime]    Script Date: 2013/04/15 03:18:52 م ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[TblLastID](
	[ID] [int] NOT NULL,
	[LastID] [NVARCHAR](20) NULL,
) ON [PRIMARY]

GO

INSERT INTO [dbo].[TblLastID]
           ([ID],[LastID])
     VALUES (1,'')
GO

طبعا ضع بدل xxxxx  اسم القاعدة لديك

 

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

 

	UPDATE dbo.TblLastID	SET LastID = ?????	WHERE ID = 1

 

طبعا ????  هي القيمة الجديدة التي قمت بتوليدها

 

بهذه الطرقة تضمن أن هذا الجدول يحوي في سطره الأول آخر تسلسل قمت بتوليده

 

لقراءته ما عليك إلا استخدام فنكشن لإرجاع القيمة تلك

 

أنشيء الفنكشن كما يلي

 

USE [xxxxx]
GO

/****** Object:  UserDefinedFunction [dbo].[GetLastTime]    Script Date: 2013/04/15 03:29:37 م ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO



-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date, ,>
-- Description:	<Description, ,>
-- =============================================
CREATE FUNCTION [dbo].[GetLastID] 
(
)
RETURNS [NVARCHAR](20)
AS
BEGIN
	RETURN 
	(
		SELECT TOP 1 LastID
		FROM TblLastID
		WHERE ID = 1
	)
END


GO

 

الآن عند استدعاء الفنكشن سيعيد لك آخر قيمة تم حفظها أي آخر تسلسل قمت بتوليده

 

----------

اولاُ----

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

 ثانياُ ------------

  عندما اقوم بجلب Top1 ماذا سيحدث اذا سجل بنفس الوقت اكثر من شخص سيحدث تعارض عندما يطلب كل شخص Top1 بنفس الوقت ؟ 

ثالثا!-----

 اخي العزيز انا لا اعرف طريقة استدعاء Faunction بالـ asp.net  انا استخدمة الستور بروسيجر فقط هل من الممكن توضيح طريقة استدعاFunction  في asp.net ?

#19

لا أخي أنا قدمت هذه الطريقة حتى أجنبك إضافة أي حقول جديدة في جداولك

أنا قلت تنشيء جدول جديد ولم أقل أضف عمود إلى جدول من جداولك السابقة

واستدعاء توب ليس له علاقة بالتعارض

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

 

بالنسبة لاستدعاء الفنكشن هو تماما مثل استدعاء البروسيدجر غير أنه يعيد قيمة توافق النوع الذي حددته وفي مثالنا سيكون ضمن الـ ASP.NET  من النوع string

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#20

 طيب اخي ابو احمد المبرمج .. لو انه اثنين سجلو بنفس الحظة ماذا سوف يرجع لهم Top1  سوف يرجع له نفس القيمة .. وهنا سوف يظهر خطاء ؟ انه لايسمح اضافة نفس القيمة بنفس الوقت ؟ 

اما بالنسبة انني اضيف جدول جديد فلا اريد ان اضيف جدول جديد ..  

ثانياُ اخي العزيز  انت قلت لي طريقة استدعاء function نفس البروسيجر ؟ هل ممكن تعطيني مثال بسيط ؟ 

لاني عندما قمت بتغير هذا السطر 

dt.SelectCommand.CommandType = CommandType.StoredProcedure

 لايظهر لي  Function ?

#21

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

إذا لو قام أكثر من شخص بالإضافة في نفس الجزء من الثانية

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

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

فلا تشغل بالك بالتعارض

 

في حال لم تتمكن من إضافة جدول جديد فانسى الطريقة لأنها لن تصلح

 

لنتخيل السيناريو التالي

 

قام أكثر من يوزر بإضافة سجلات جديدة

ستصل الطلبات إلى القاعدة فيقوم بصفها في طابور انتظار

سيأخذ الطلب الأول ويضيف السجل الجديد

مباشرة سيتم تنفيذ البروسيدجر ويقوم بإضافة سيريال جديد

حينها سيقوم بتخزين تلك القيمة في الجدول الوسيط الذي تحدثنا عنه

 

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

بناء عليه يولد السيريال التالي ويتم حفظه وهكذا

 

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

 

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

1

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#22
اقتباس

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

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

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

1
#23
أبو أحمد المبرمج كتب:

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

إذا لو قام أكثر من شخص بالإضافة في نفس الجزء من الثانية

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

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

فلا تشغل بالك بالتعارض

 

في حال لم تتمكن من إضافة جدول جديد فانسى الطريقة لأنها لن تصلح

 

لنتخيل السيناريو التالي

 

قام أكثر من يوزر بإضافة سجلات جديدة

ستصل الطلبات إلى القاعدة فيقوم بصفها في طابور انتظار

سيأخذ الطلب الأول ويضيف السجل الجديد

مباشرة سيتم تنفيذ البروسيدجر ويقوم بإضافة سيريال جديد

حينها سيقوم بتخزين تلك القيمة في الجدول الوسيط الذي تحدثنا عنه

 

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

بناء عليه يولد السيريال التالي ويتم حفظه وهكذا

 

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

 

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

مشكور اخي على المعلومات القيمة ..  طيب اخي العزيز لدي استفسار انا كنت بدائة اتعلم Linq  ولكن لدي استفسار هل  استخدام Linq اسرع  من استخدام الاستعلامات العادية الخاصة بـ sqlserver   وثانيا من ناحية الامان هل  الامان تبعها عالي مثل استخدام الاستور بروسيجر ؟ 

#24
TareqVB كتب:

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

بارك الله بك أخي طارق وأشكرك على التصويب

لأني مستند إلى معلومة سابقة لدي

قد يكون الأمران موجودان

حتى مسألة نجاح الأسبق وفشل البقية عمليا هي غير منطقية

تخيل عشرات الآلاف يقومون بنفس الأمر بشكل متكرر وتكرر أن واحد لظروف ما هو الذي دائما يسبق فهل سيتم فشل البقية في كل مرة

ولهذا أظن يوجد شيء اسمه Timeout لتحديد زمن المحاولات بعدها يتم إعلان الفشل

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

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

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

ومن هذا المنطلق تم إنشاء ميزة العد التلقائي للتولى القاعدة مسألة تنظيم الأرقام وعدم التعارض

 

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

 

أشكرك مرة أخرى وبارك الله بك.

تم تعديل هذه المشاركة بواسطة أبو أحمد المبرمج في 16 أبريل 2013 في 12:17

1

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

#25
ورق خسرانه كتب:

مشكور اخي على المعلومات القيمة ..  طيب اخي العزيز لدي استفسار انا كنت بدائة اتعلم Linq  ولكن لدي استفسار هل  استخدام Linq اسرع  من استخدام الاستعلامات العادية الخاصة بـ sqlserver   وثانيا من ناحية الامان هل  الامان تبعها عالي مثل استخدام الاستور بروسيجر ؟ 

 

حياك الله أخي الكريم

 

حتى ندرك آلية عمل لينك ما هي إلا مُعرّب أو مترجم داخلي يقوم بتحويل تعليمات لينك إلى أوامر سيكوال يعني مآل الأمر أنه يقوم بتحويل ما تكتبه ب لينك إلى أوامر نصية كالتي تستخدم بشكل تقليد

من ناحية السرعة لا يوجد فرق وإن وجد فيكاد لا يذكر

أنا عن نفسي جربت عمليات على مائة ألف سجل فكانت السرعة طبيعية

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

 

للعلم عندما تضيف عنصر Linq to SQL  فإنه يقبل الجداول والاستعلامات والبروسدجرز والفنكشنات بأنواعها

 

فيما يخص الآمان فلا شك أنه قد تم مراعاة ذلك

 

وللعلم عندما تضيف بروسدجر إلى لينك فإنه لا يضيف إلى التصريح عنه وعندما يتم استدعاؤه من الكود فإنه عمليان يذهب لينفذه في القاعدة

ونفس الأمر بالنسبة للفنكشن

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

 

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

 

 

طيب آخي ما رأيك أن تشرح لنا مثال عن آلية العمل بأرقام وقيم طبيعية حتى ندرك المطلوب لأني من خلال ما أراه من اختلاف بينك وبيننا هو عدم إدراك المطلوب بالضبط

 

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

 

ودمتم بخير

1

ما أقبـح المعصية ، تذهب لذتها ويبقى إثمها ... ومأ أحسن الطاعة ، تذهب مشقتها ويبقى ثوابها

كل نعيم دون الجنة غرور ... وكـل شقـاء دون النـار سرور

الدورة التطبيقية لتعليم التصميم بالإليستريتور

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

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

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

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

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

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