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

كيف يمكن الحصول على المعرف (id)

بدأه Speed_Of_Light في 26 يونيو 2010 · 5 رد · 839 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدي قاعدة بيانات فيها الجدول Transaction:

(id, amount, tdate, .....)

حيث الحقل id هو مفتاح أساسي متزايد تلقائياً autoincrement

عند إضافة سطر جديد إلى الـ DataTable كما يلي :

transactionDataTable.AddtransactionRow(date, amount, ....);

يتم توليد معرف id سالب ... إلى أن أقوم بتخزين الجدول في قاعدة البيانات عبر Update ...

وبالتالي "يضيع" السطر الجديد ضمن البيانات القديمة ... وللحصول على معرف السطر الجديد يجب علي أن أقوم بالبحث عنه عن طريق فلترة الـ DataTable بواسطة حقول أخرى مثل tdate و amount ....

وهذا يؤدي إلى بطئ شديد، ولا أظنه الطريقة الصحيحة للقيام بالأمر ...

فهل هناك طريقة أخرى ؟

تم تعديل هذه المشاركة بواسطة Speed_Of_Light في 26 يونيو 2010 في 16:13

#2

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

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

إذا كان فهمي لمشكلتك صحيحا" فعليك بتخزين السطر ثم الحصول على المعرف مباشرة" بدون فلترة عن طريق الجملة التالية:

select id =@@identity from transaction_tabel

#3

شكراً لك أخي بهاء

أريد الحصول على الحصول على DataRow (بالتحديد TransactionRow) بعد إضافته مباشرة إلى قاعدة البيانات.

لأن عندي جدول آخر يكون فيه الحقل tid عبارة عن مفتاح خارجي، وعندما أريد إضافة سطر جديد إلى هذا الجدول سأحتاج إلى TransactionRow أي كما يلي:

TransactionRow myNewTransactionRow = transactionDataTable.AddtransactionRow(date, amount, ....);

anotherDataTable.addAnotherDataTableRow(...., myNewTransactionRow , ....);

طبعاً هنا سيكون المعرف للـ myNewTransactionRow سالباً

والحل الذي أقوم به حالياً هو:

TransactionRow myNewTransactionRow;
string filter = String.Format("tdate = #{0}# AND amount = {1}", myDate, 1000, ....);
myNewTransactionRow  = (TransactionRow)transactionDataTable.Select(filter)[0];

anotherDataTable.addAnotherDataTableRow(...., myTransactionRow, ....);

ولكني لست راض عنه، فهل هناك طريقة أفضل ؟!

تم تعديل هذه المشاركة بواسطة Speed_Of_Light في 26 يونيو 2010 في 23:42

#4

آه ... الآن فهمت @@identity !

)ظننتك تقصد وسيطاً parameter باسم identity(

هذا من أجل SQL Server ... سأبحث عن مقابلها في Access

لماذا أستخدم Access ؟!!

العميل يريد ذلك :mad: !!

#5

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

اللي فهمته منك تريد ادخال بيانات لجدول ما وتريد رقم id الخاص بالسجل المدخل علشان تستخدمه في جدول آخر ((((إذا هذا قصدك فإليك الحل))))

Dim Cmd As New OledbCommand
Cmd.Connection = con

Cmd.CommandText = "Insert Into Table1 (f1,f2) VALUES (@f1,@f2")

Cmd.Parameters.AddWithValue("@f1", Textbox1.Text)
Cmd.Parameters.AddWithValue("@f2", Textbox2.Text)

Con.Open

Cmd.ExecuteNonQuery

Cmd.CommandText = "Select fid,f1,f2 From Table1 Where f1=@f2 And f2=@f2")

Cmd.Parameters.Clear

Cmd.Parameters.AddWithValue("@f1", Textbox1.Text)
Cmd.Parameters.AddWithValue("@f2", Textbox2.Text)

Dim Rd As OledbDataReader = Cmd.ExecuteReader

If Rd.Read = True Then
msgbox(Rd!fid)
End If

Rd.Close
Cmd.Dispose
Con.Close

اسم الجدول Table1

الحقل الأول fid =ترقيم تلقائي مفتاح أساسي

الحقل الثاني f1

الحقل الثالث f2

الرقم الذي سيظهر معك في الرسالة هو ال (Id) إمكانية تخزينة في متغير وحفظه في الجدول الآخر بكل سهولة

إن أصبت فأدعو لي بالتوفيق وحسن الخاتمة

وإن أخطأت فأرجو توضيح المطلوب أكثر ... تحياتي

تم تعديل هذه المشاركة بواسطة محمدvb في 27 يونيو 2010 في 06:34

#6

أخ محمد أنا أستخدم الـ ADO.NET بالوضع المنفصل Disconnected Layer ... لكن الفكرة التي ذكرتها هي ذاتها التي كنت أستخدمها والتي لا أريدها ...

على كل حال الآن أرسل استعلام إلى قاعدة البيانات من النوع :

SELECT max(id) FROM transaction

وبما أن حقل الـ id متزايد باستمرار، فهذا سيعيد آخر معرف آخر سطر تم إضافته.

حلت المشكلة

شكراً لجهودكم

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

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

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

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

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