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

مشكلة الجدول الفارغ من السجلات وإدراج البيانات لأول سجل

مغلق
بدأه hatif في 23 أغسطس 2006 · 23 رد · 1,816 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدي قاعدة بيانات فيها جدولين مرتبطين بعلاقة والبرنامج يقوم بإدراج السجلات والتحديث .ووووو. إلخ

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

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

الأمر الثاني هو إذا كان الجدول فارغ فماذا سوف تكون قيمة zn في الكود التالي :

 cmd.CommandText = "SELECT MAX(UserID)+1 as NextLast FROM Users"

			ds = New DataSet
			adpt = New SqlCeDataAdapter(cmd.CommandText, objCon)

			adpt.Fill(ds)
			zn = ds.Tables(0).Rows(0).Item(0).ToString()

وشكرا لكم

#2

try this

SELECT isnull( MAX(UserID),0) +1 as NextLast FROM Users

تم تعديل هذه المشاركة بواسطة IUnknown في 23 أغسطس 2006 في 12:18

When all else fails, read the instructions.

If there is a possibility of several things going wrong the one that will cause the most damage will be the one to go wrong.

No Matter how many times you repeat, there will be someone not listening .

To beat the bureaucracy, make your problem their problem

55926083.png

#3

لازم تكتب لنا توصيف الجدول

سلام

#4

الأخ الفاضل IUnknown شكرا لك على المعلومة ولكن الكود الذي وضعته ماذا يفعل بالضبط وماذا تفيد isnull

الأخ الفاضل Desigen الجدول كما في الكود التالي وهما جدول Users وهو للإسم والآخر States وهو للمعلومات مثل رقم الهاتف وبين الجدولين علاقة حيث States.UserState2 = Users .UserID

المشكلة تحدث عندما أريد إدراج أول سجل في الجدولين أي إدراج الإسم في جدول Users وإدراج رقم الهاتف في جدول States حيث لابد من استعلام يحضر UserID من جدول Users ويضعه في UserState2 في جدول States ليكون هو الدليل والعلاقة بين الإسم ورقم الهاتف ولكن الجدول فارغ وهنا تحدث المشكلة فلن يعود الإستعلام بقيمة UserID وبناء عليه فإن البيانات ناقصة ويحدث خطأ

وهذا هو الكود الذي ينشيء الجدول لتتضح الصورة

Dim strUserTB As String
			strUserTB = "Create Table Users ("
			strUserTB &= "UserID int primary Key IDENTITY(1,1) not null"
			strUserTB &= ", UserName  nvarchar(40)"
			strUserTB &= ")"


			strStatesTB = "Create Table States ("
			strStatesTB &= "StateCode int primary Key IDENTITY(1,1) not null"
			strStatesTB &= ", UserState2 smallint"
			strStatesTB &= ", phone   nvarchar(10)"
					  strStatesTB &= ")"
#5

اما انك تستعمل Stored Procedure واحد وفي هذه الحالة يكون الكود كالتالي:

CREATE PROCEDURE dbo.INSERT_User_State  
(
@UserName NVARCHAR(40),
@Phone NVARCHAR(10)
)
AS

DECLARE @UserID INT

INSERT INTO Users(UserName) VALUES(@UserName)

SET @UserID=IDENT_CURRENT('Users')

INSERT INTO States(UserID,Phone) VALUES(@UserID,@Phone)

GO

او انك تستخدم اثنين من ال Stored Procedure

وفي هذه الحالة يصبح الكود كالتالي:

CREATE PROCEDURE dbo.INSERT_User 
(
@UserName NVARCHAR(40)
)
AS

DECLARE @UserID INT

INSERT INTO Users(UserName) VALUES(@UserName)

SET @UserID=IDENT_CURRENT('Users')

RETURN @UserID

حيث سيقوم ال Stored Procedure بارجاع UserID المولد تلقائيا، ومنها ستستخدم الرقم في برنامجك وتمريره كمعامل لل Stored Procedure التالية التي تقوم بادخال State ل User معين

CREATE PROCEDURE dbo.INSERT_State 
(
@UserID INT,
@Phone NVARCHAR(10)
)
AS

INSERT INTO States(UserID,Phone) VALUES(@UserID,@Phone)

GO
#6

أنا عندي فكرة لحل هذه المشكلة

أن تقوم بعمل sp يقوم بمنادات sp يضيف بيانات إلى الجدول user

و بعد ذلك يقوم بالإستعلام عن البيانات التي تم ادخالها

ليتم ارجاع رقم المستخدم الجديد

لكن المشكلة لديك هو أنه يمكن تكرار اسم المستخدم لديك

و بالتالي لن تنفع هذه الطريقة

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

Select Top 1 UserId From Users Where UserName = @UserName 
Order By UserId DSCE

و بالتالي يمكن استخدام القيمة العائدة

إلى sp ليقوم الأخير بإضافة

سجل إلى جدول الهاتف

سلام

#7

الأخوان الفاضلان :

abd_albaset

Desigen

شكرا لكما على سرعة الرد وعلى الحلول التي وضعتموها وبارك الله فيكما

والحمد لله وجدت طريقة وهي إنشاء جدول ثالث به صف واحد فقط وفيه القيمة تكون (0) عندما يكون الجدولان فارغان أو (1) عندما يكون الجدولان بهما صف واحد فأكثر ويتم التحقق من قيمة هذا الجدول الثالث قبل أي عملية إدراج عن طريق استعلام فإذا كان (0) فإنني أضع قيمة العمود UserState2 = 1 وبذلك ستكون مساوية لقيمة UserID بعد أن تتم عملية الإدراج وستكون العلاقة صحيحة ومن ثم تعديل قيمة الجدول الثالث لتصبح قيمته 1 للدلالة على أن كلا من الجدولين فيهما صف واحد

أما إذا كانت قيمة الجدول الثالث 1 (يعني الجدولين فيهما صف واحد فأكثر) فإن البرنامج يقوم بشكل عادي بالإستعلام عن آخر صف في الجدول Users ويزيد قيمة UserID بمقدار 1 ثم يضعها في UserState2 لتكون هي العلاقة بين الجدولين .

والبرنامج يسير بشكل جيد والحمد لله

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

إذا كان الجدول فارغ فماذا سوف تكون قيمة zn في الكود التالي مع العلم بأن zn متغير من نوع integer :

هل ستكون (-1) أو (0) أو NUll أو false أو ماذا :

cmd.CommandText = "SELECT MAX(UserID)+1 as NextLast FROM Users"

			ds = New DataSet
			adpt = New SqlCeDataAdapter(cmd.CommandText, objCon)

			adpt.Fill(ds)
			zn = ds.Tables(0).Rows(0).Item(0).ToString()

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

وشكرا لكم جميعا

#8

الأخ الفاضل

هذه الجمله

SELECT MAX(UserID)+1 as NextLast FROM Users

سوف ترجع لك قيمة null اذا كان الجدول فارخ مما يعطيك خ"ا في الكود المرفق

الجمله

isnull(Variable,valuifnull)

تستبدل قيمة المتغير variable بالقيمة valuifnull فقط اذا كانت قيم المتغير تساوي null وفي مثالك اذا كانت القيمة العظمى null سوف تستبدل بالصفر الذي سوف تضيف عليه واحد ليعطيك رقم 1 ويكون هو اول record عندك

ارجون ان يكون شرحي مفهوما ويمكنك الرجوع للhelp بخصوص isnull()

When all else fails, read the instructions.

If there is a possibility of several things going wrong the one that will cause the most damage will be the one to go wrong.

No Matter how many times you repeat, there will be someone not listening .

To beat the bureaucracy, make your problem their problem

55926083.png

#9

مثال :

select

case

when userid is null then 1

else userid +1

end as newuserid

from tblusers

#10
Web-Dv كتب:
مثال :

select

case

when userid is null then 1

else userid +1

end as newuserid

from tblusers

حسب الجدول الموجود بالاعلى

UserID int primary Key IDENTITY(1,1) not null

When all else fails, read the instructions.

If there is a possibility of several things going wrong the one that will cause the most damage will be the one to go wrong.

No Matter how many times you repeat, there will be someone not listening .

To beat the bureaucracy, make your problem their problem

55926083.png

#11

لسلام عليكم

في حال كان

UserID int primary Key IDENTITY(1,1) not null

عندها لا داعي لكل ما سبق هو اتوماتيكياً بيعمل كل شيء....

#12

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

أنا أعتقد إخواني أن تحديد الحقل كــ Identity يحل المسألة من الجذور .. -_-

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

#13
imadouzoun كتب:
السلام عليكم و رحمة الله و بركاته :

أنا أعتقد إخواني أن تحديد الحقل كــ Identity يحل المسألة من الجذور .. -_-

#14
اقتباس
السلام عليكم و رحمة الله و بركاته :

أنا أعتقد إخواني أن تحديد الحقل كــ Identity يحل المسألة من الجذور ..

نعم...

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

#15

السلام عليكم

على حسب ما فهمت ان الاخ محتاج يعمل عملية Auto Increment عن طريق الكود

   Dim cmd As New SqlCommand("select max(UserID) FROM Users", SqlConnection)
		ConnectDb()
		If cmd.ExecuteScalar() Is DBNull.Value Then
			mAutoNumber = 1
		Else
			mAutoNumber = cmd.ExecuteScalar + 1
			DisconnectDb()
		End If

{وَاتَّقُواْ يَوْمًا تُرْجَعُونَ فِيهِ إِلَى اللّهِ ثُمَّ تُوَفَّى كُلُّ نَفْسٍ مَّا كَسَبَتْ وَهُمْ لاَ يُظْلَمُونَ} (281) سورة البقرة

br17.gif

برنامج الإتصلات الإدارية والارشيف الالكتروني

برنامج الخبير لنقاط البيع المباشرة

#16

السلام عليكم

شكرا لكم جميعا على مساعدتكم وبارك الله فيكم

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

عندما أريد إضافة سجلات جديدة (لأول مرة) فلا مشكلة فبناء على قيمة الجدول الثالث والذي قيمته (0) ستكون قيمة UserState2 =1 كما ذكرنا سابقا ولا مشاكل

ولكن المشاكل تحدث إذا حذفت السجلات من الجدولين وأصبحا فارغين عندها سيصبح قيمة الجدول الثالث (0) وعند عملية الإدراج المقبلة ستكون قيمة UserState2 =1 ولكن الجدول Users سيزيد قيمة UserID تلقائيا ليس من الصفر ولكن من قيمة أكبر رقم وصل إليه الجدول يعني

لو كان عندي أربعة سجلات وقمت بحذفها وأصبح الجدول فارغ لن يكون UserID يساوي (1) ولكن سيكون (5) وستختلف العلاقة لأنها ستصبح (1) والمفروض أن تتساوى مع UserID

فهل هناك طريقة لتصفير الجدول .

وشكرا لكم مقدما .

#17

يا صاحبي إنت عم تعقد الأمور أكثر من اللازم

سلام

#18

السلام عليكم

الأخ Desigen الحل قريب وهو على حسب ظني واحد من إثنين إما أن يتم تصفير الجدول بعد الحذف بحيث يبدأ الترقيم التلقائي من 1

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

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

DELETE * FROM table_name

ولكن يعطيني رسالة خطأ في استثناء try وكذلك جربت الكود التالي ولكن أيضا يظهر خطأ :

TRUNCATE TABLE table_name
#19

أخي كنصيحة تصميمية تحليلية بحتة

لا تقم بتصفير عداد identity أي

Primary Key لـ عامود يحدد باقي الكيان و

تعتمد الكيانات الأخرى عليه

سلام

#20

يا أخي لا تعقد الأمور ولا تعمل مية شغلة

الموضوع أبسط مما تتوقع بكثير

اما اعمل ترقيم تلقائي

او استخدم أحد أكواد الأخوة مثلاً كود الأخ

waleedhm ممتاز

تحياتي

#21

السلام عليكم

شكرا لك أخي Desigen على النصيحة وبارك الله فيك

الأخ Web-Dv شكرا لك على الرد وبارك الله فيك

يا إخوان أنا بينت توصيف الجدول في أول المشاركة ولو لاحظت أخي Web-Dv فإني عامل ترقيم تلقائي لكل جدول ... ولكن المشكلة بعد الحذف وعندما يصبح الجدول الأول والثاني فارغين ... هنا (وهنا فقط) عند إدراج صف سوف يواصل الترقيم التلقائي إكمال الترقيم من حيث انتهى أما عمود العلاقة بين الجدولين فسوف يبدأ من الصفر .... بس :D

أما كود waleedhm فهو نفس عمل الكود الذي وضعته أنا وسوف تحدث المشكلة حتى لو وضعته لإنه عندما تكون القيمة null أي الجدول فارغ يزيد واحد لكن الترقيم التلقائي سيواصل فإذا كان عندك 20 صف وحذفتها سيكون أول صف تدرجه .. الترقيم التلقائي له 21 والجدول الثاني العلاقة 1 بينما يجب أن تكون 21

وعموما شكرا لكم

#22

أنا الحقيقة كنت متوقع ما كنت تريده :^) ..

فعلاً الترقيم التلقائي فاشل في هذه النقطة بالذات ..

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

#23
اقتباس
ما كود waleedhm فهو نفس عمل الكود الذي وضعته أنا وسوف تحدث المشكلة حتى لو وضعته لإنه عندما تكون القيمة null أي الجدول فارغ يزيد واحد لكن الترقيم التلقائي سيواصل فإذا كان عندك 20 صف وحذفتها سيكون أول صف تدرجه .. الترقيم التلقائي له 21 والجدول الثاني العلاقة 1 بينما يجب أن تكون 21

وعموما شكرا لكم

لقد تم الحديث عن هذا الامر انظر هذه المشاركة الرائعة للاخ Walcom عن كيفية التحكم بال Identity

ايقاف + تصفير ال Identity

و الموضوع التالي قد يفيدك كثيرا في مشاكل ال Identity وسوف يبين لك ما هي عيوب Identity

ِِAuto Identity or GUID

رب اجعلني مقيم الصلاة ومن ذريتي ربنا وتقبل دعاء.

لا تنسى: "العقل مثل العضلة كلما استخدمته أكثر كلما ازدادت قوته"

#24

الأخ imadouzoun شكرا لك على المشاركة

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

اقتباس
اولا بالنسبة لل Auto Identity:

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

هذه المعلومة التي ذكرتها أنت في المشاركة أفادتني جدا وفعلا ألغيت الترقيم التلقائي وخليت البرنامج يقوم بذلك ولن تحدث مشاكل بإذن الله المشاكل كلها من هذا الترقيم التلقائي وبعدين يعني أنا أشتغل على قاعدة بيانات وكالة ناسا للأبحاث الفضائية الشغلة كلها جدول للأسماء وثاني للمعلومات بس :D

شكرا لك مرة أخرى وبارك الله فيك أخي waeldalol

تحياتي

تم تعديل هذه المشاركة بواسطة hatif في 27 أغسطس 2006 في 21:26

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

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

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

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

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

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