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

لم أتمكن من تحديث البيانات

مغلق
بدأه الكود الصعب في 20 مارس 2005 · 14 رد · 1,302 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

أخوتي الكرام قمت بتصميم فورم وعملت اتصال مع قاعدة بيانات في البداية قمت بتفريغ البيانات في الداتا سيت وربطت الداتا سيت بصناديق نصية (اي أنه لم يكن عن طريق الداتا قريد) وتم عرض البيانات بشكل ممتاز لكن لما أردت ان أعدل على بعض البيانات عن طريق الأمر

DataAdapter.update(dataSet1,"Table")

يبقى التحديث فقط اثناء تنفيذ البرنامج ولم يتم على الداتا بيز اي أنه عند ننفيذ البرنامج مره أخرى لايظهر التحديث تظهر البيانات كما كانت من قبل التحيث.

#2

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

#3

السلام عليكم

الطريقة المثلى لتحديث البيانات

أنك تنشئ DataSet جديدة و تأخذ التحديث الذي تم في الـ DataSet الموجودة لديك في المشروع

بعدها تقوم بعملية ضم merge ثم تحديث update بهذا الشكل.

 Try
            Dim ds As DS = New DS
            Me.BindingContext(Me.DS1, "Emp").EndCurrentEdit()
            ds = CType(DS1.GetChanges(), DataSet)
            Me.DS1.Merge(ds)
            Me.da.Update(Me.DS1)
            Me.DS1.AcceptChanges()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

الـ ds هي الـ DataSet الجديدة

الـ DS هي الـ DataSet الموجودة في داخل المشروع DS.xsd

الـ DS1 هي النسخة التي تم إنشائها من الـ DS.xsd و الموجودة على الـ Component Tray

والله الموفق .. السلام عليكم

في المثال يتضح المقال

#4

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

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

concurrancy violation

أتمنى أجد الحل ولكم الشكر

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

#5

السلام عليكم

مشكلة الـ

تحصل عندما مثلاً تقوم بتحميل بيانات الآبن قبل الأب أو مثلاً لم تقوم بعملية ربط بينهما في البرنامج

و ما تعرف بـ DataRelation وتكون بهذا الشكل

 Private Sub BindDataRelation()
        Try
            Dim ParentColumn As DataColumn
            Dim childColumn As DataColumn
            ParentColumn = DsMain1.Tables("Main").Columns("SerialNumber")
            childColumn = DsMain1.Tables("Child").Columns("SerialNumber")
            Rel = New DataRelation("MS", ParentColumn, childColumn)
            Me.DsMain1.Relations.Add(Rel)
            Me.DGSus.SetDataBinding(DVMain1, "MS")
        Catch ex As Exception
            Throw ex
        End Try
    End Sub

إذا كانت قاعدة البيانات لديك بها بيانات كثيرة و عملية النمو فيها سريعة فالـ Inner Join أو الـ Left Join

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

و إن كانت مبنية على SQL فستخدام الـ STOREDPROCEDURES هو الحل الأفضل والله اعلم .

في المثال يتضح المقال

#6

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

ParentColumn

childColumn

MS

ليتك توضحها وما تقصر يالحبيب

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

#7

السلام عليكم

حاضر يا عزيزي الطيب

بما أن ربط جدول بأخر يتم عن طريق الـ Primary Key المفتاح الأساسي فإن الـ SerialNumber

هو العامود الذي به الـ Primary Key في الجدول Main وهو الأب Parent

أما في الجدول الأبن Child فهو يسمى Foreign key وهو المفتاح الثانوي و من باب التنسيق

يفضل أن يكون كِلا العامودين يحملان نفس الاسم والذي هو في المثال SerialNumber

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

المهم أن Dim ParentColumn As DataColumn هو تعريف عنصر من نوع عامود

وهذا العامود سيمثل المفتاح الأساسي للأب وهو SerialNumber وكتبناه بهذا الشكل

ParentColumn = DsMain1.Tables("Main").Columns("SerialNumber")

ثم تقوم بنفس العمل لجدول الأبن

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

 Dim Rel As DataRelation

بعدها تقوم بإستنساخ عنصر من نوع DataRelation بهذا الشكل

Rel = New DataRelation("MS", ParentColumn, childColumn)

تلاحظ أن الـ DataRelation لها ثلاثة ممررات

الأول وهو الـ MS هو الاسم المنطقي للعلاقة بين الجدولين

الثاني وهو ParentColumn وهو عامود الأب , المفتاح الأساسي

الثالث وهو childColumn وهو عامود الأبن , مفتاح ثانوي

ثم بعد ذلك قمت بإضافة هذه العلاقة في الـ DataSet بهذا الشكل

 Me.DsMain1.Relations.Add(Rel)

وبما أن لدي DataView و أن البيانات في DataGrid قمت بربطها بهذا الشكل

Me.DGSus.SetDataBinding(DVMain1, "MS")

تلاحظ أنني أستخدمت الاسم MS فهذا هو اسم العلاقة التي تحتاجة الـ DataGrid لكي لا يظهر ما يسمى بـ concurrancy violation

لو كنت تستخدم الـ DataSet مباشرة , اي أنك لا تستخدم الـ DataView ضع اسم الـ DataSet الخاصة بك بدل الاسم DVMain1

و إن شاء الله أنا معاك حتى تنجز العمل ( الصعوبه لابد منه في بداية كل أمر) ثم ييسر الله عليك

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

هذا والله أعلم

في المثال يتضح المقال

#8

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

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

DGSus

أرجو أن تفيدني ياأخي ثم أنت قلت في أحد الردود كلام لم أفهم المقصود منه وأتمنى منك توضح لي

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

و إن كانت مبنية على SQL فستخدام الـ STOREDPROCEDURES"

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

#9

السلام عليكم

الـ DGSus هي الـ DataGrid لدي في المشروع وهي التي تحمل بيانات الجدول الفرعي الأبن كما يسمونهُ.

و آسف على الخطأ التالي

أنا أقصد تحميل كل جدول على حده وليس كل (ملف) , فهذا خطأٌ مني , أعتذر لذلك ...

والقصد كالتالي لِنفترض أن لدينا مشروع مكون من جدولين وبهما بيانات قليلة مثلاً 500 صف فقط.

وهذه البيانات لا تنموى بشكل سريع .. المهم مثل هذه المشاريع يفضل أن نحمل كل جدول على حده

مثلاً لدينا جدولين باسم المستهلك Consumer الأب

وجدول المنتج Product الابن

سيكون تحميل كل جدول على حِده بهذا الشكل

DAConsumer.Fill(Ds1, "Consumer")
DAProduct.Fill(Ds1, "Product")

هذا بالنسبة للمشاريع البسيطة بطيئة النمو أما المشاريع الضخمة سريعة النمو فالأمر يختلف تماماً

حيث نحتاج إلى ربط الجدولين أثناء جلب البيانات أما بـ Inner Join أو Left Right Joins

أما الـ STOREDPROCEDURES فهو عبارة عن Patch نصوص برمجية بلغة SQL

تستخدم مع قاعدة البيانات من نوع SQL Server Database

فهي لا علاقة لها بالـ DataSet و إنما يستخدمها الـ Command Object في VB.NET لعملية ما

مثل تحديث البيانات أو جلب البيانات أو غير ذلك .

لدي سؤال من فضلك ماهي قاعدة البيانات التي تستخدمها في هذا المشروع ؟

السلام عليكم

في المثال يتضح المقال

#10

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

Authors table يحتوي على

Author & Id

Books Table يحتوي على

Book & ID & AuthorId

أضفت للمشروع جدول المؤلفين فقط

غيرت ال CommandText التابع للاتصال واصبح

SELECT Books.ID, Books.Book, Authors.Author

FROM Authors

INNER JOIN Books ON Authors.ID = Books.AuthorID

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

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

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

خادم القواعد عند هو الاس كيو سيرفير

تسلم اخوي الغملاسي على تفاعلك والله يوفقنا واياك وأنا في إنتظار ردك بشوق .

تم تعديل هذه المشاركة بواسطة الكود الصعب في 23 مارس 2005 في 11:03

#11

السلام عليكم

آسف على التأخير .. ربما الهدوء الذي يسبق البرنامج :D

على كل حال قمت بأنشاء برنامج مصغر إن شاء الله يرضيك و يطيب خاطرك هذا شكل البرنامج

BookAuthorsApp.gif

وهو نفس الفكرة تماماً مع وضع DataGrid بدل خانات نصية

ستجد ملف نصي باسم AuthorsDB قم بتشغيلة عن طريق الـ Query Analizer لإنشاء قاعدة بيانات باسم BookAuthors

ولا تحتاج إلى تعديل الإتصال connection ولا غير ذلك كل شيء إن شاء الله على مايرام .

البرنامج يستخدم كل من جدولين و DataView و 2 storedProcedures

الأول باسم sp_InsertAuthorImage لتخزين صور المؤلف

والثاني باسم sp_FindAuthors للبحث عن المؤلف بطريقة Left Join

الإضافات على مشروعك هو أضفت حقل Column في الـ Author لوضع صورة المؤلف

وحقل أخر في الـ Book لوضع صورة الكتاب (لكن لم أكمله) سأكمله معك إنشئت إن أعطيتني شرف المشاركة.

أتمنى لك التوفيق والسداد ....... السلام عليكم

BookAuthorsApplication.zip

في المثال يتضح المقال

#12

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

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

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

#13

السلام عليكم

أحسن الله إليك , على كل حال لو تم تطوير المشروع سأضعه مع شرحه في الموقع .

السلام عليكم

في المثال يتضح المقال

#14

أخي العزيز الغملاسي

هذا ايميلي أتمنى تضيفيني على الماسنجر اريد ك في موضوع هام

abu_zyed@hotmail.com

#15

السلام عليكم

حياك الله أخي , لكن للأسف لا أملك ماسنجر !!!

في المثال يتضح المقال

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

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