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

إضافة قاعدة البيانات إلى المشروع وفقدان التغيرات

بدأه HassanAlattas في 1 يونيو 2009 · 3 رد · 1,254 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

عند إضافة قاعدة بيانات إلى المشروع ، تذكر انه يمكنك التعديل في البيانات من خلال نافذة Server Explorer (او غيرها من الأدوات في الفيجوال استديو) فقط ، وان اي تعديلات تقوم بها اثناء تشغيل البرنامج ، يمكن ان تفقدها عند تشغيله مرة اخرى.

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

للتوضيح :

1- حمل هذا المثال (VS2008):

LocalDataApp.rar

2- افتح المشروع وقم بتشغيله (F5)

3- قم بإضافة البيانات إلى الفورم

4- اضغط على زر حفظ

5- اغلق الفورم

6- قم بأي من التالي:

- من القائمة Build اضغط على Rebuild Soultion.

- عدل الكود ( مثلاً اضف سطر جديداً في الفورم) ثم اضغط Build

7- شغل البرنامج مرة اخرى ،ولن تجد السجلات التي قمت بإضافتها سابقاً

ماذا يحدث خلف الكواليس؟

عند عمل Build للمشروع، يقوم فيجوال استديو بنسخ قاعدة البيانات من المجلد الجذر للمشروع إلى مجلد الخرج bin\Debug ، ويتصل البرنامج عند تشغيله بالنسخة ويعمل عليها، لذا فإن اي اضافة او حذف او تحديث تحصل في الأساس على قاعدة البيانات النسخة بدون ان تتأثر قاعدة البيانات الأصل.

وإذا قمنا بعد ذلك بتعديل الكود وطلبنا تشغيل البرنامج مرة اخرى، فإن قاعدة البيانات سوف تنسخ إلى المجلد bin\Debug فوق السابقة التي تحتوي على التعديلات وتظهر البيانات في البرنامج بشكلها الأصلي.

الخاصية Copy to Output Directory لملف قاعدة البيانات:

post-173477-1243873258_thumb.jpg

تحدد هذه الخاصية اللحظة التي يقوم فيها فيجوال استديو بنسخ ملف قاعدة البيانات ، والقيم الممكنة لها كالتالي:

Copy always: (الأعداد الأفتراضي لملفات .mdf و .mdb )

يقوم فيجوال استديو بنسخ ملف قاعدة البيانات إلى المجلد bin دائماً عند عمل build للمشروع.

Copy if newer: (الأعداد الأفتراضي لملفات .sdf)

يقوم فيجوال استديو بنسخ ملف قاعدة البيانات إلى المجلد bin عند عمل build للمشروع لأول مرة، او إذا كانت اجدد (احدث) من قاعدة البيانات في المجلد bin - هنا يستخدم تاريخ التعديل في المقارنة.

ملاحظة: لا يفضل هذا الخيار مع ملفات .mdf و .mdb بسبب ان تاريخ التعديل يمكن ان يتغير لمجرد استعراض قاعدة البيانات في Server Explorer.

Do not copy:

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

لمعرفة المزيد ، انظر في هذا الرابط: http://msdn.microsoft.com/en-us/library/ms233817.aspx

تم تعديل هذه المشاركة بواسطة HassanAlattas في 6 يونيو 2009 في 22:22

[وسط]لا اله الا انت سبحانك انى كنت من الظالمين

[/وسط]

#2

مشكور الله يجزاكم خير

#3

جزاك الله عنا كل خير و لكن وجدت حل لهذه المشكلة و التي كانت كالتالي:

عندما أقوم بإضافة قاعدة بيانات و استخدم الـ wizard للإتصال بقاعدة البيانات و أضعها ضمن المجلد bin\Debug لا يقوم المعالج بالإضتال بالشكل الصحيح بقاعدة البيانات بسبب أنه يقوم بتكرير المسار bin\Debug ضمنيا في الكود

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

الحل من خلال خصائص قاعدة البيانات build action و تعيين القيمة None لها و انحلت جميع المشاكل الخاصة بي, صدقا يا شباب إلي 24 ساعة و أنا عم أبحث عن حل أو على الأقل أعرف ليش هيك عم يتصرف الفيجوال بيسك.

لا تنسوني و إخواني من الدعاء في ظهر الغيب .. سلام

#4

ليس للخاصية Build Action اي علاقة بفقدان التغيرات ، ويفضل ان تكون قيمتها Content (خاصة اذا كنت تخطط لأستخدام ClickOnce في التحزيم)

وكما ذكرت سابقاً الطريقة السليمة للحفاظ على البيانات هي باستخدام Server Explorer او غيرها من الأدوات في الفيجوال استديو.

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

الطريقة 1:

بعد ادخال البيانات و اغلاق البرنامج ، قم بنسخ قاعدة البيانات من المجلد bin إلى المجلد الجذر للمشروع فوق الأصلية (في كل مرة).

الطريقة 2:

تغيير الخاصية Copy to Output Directory لملف قاعدة البيانات إلى Do not copy ، عمل Build ، ثم نسخ قاعدة البيانات إلى المجلد bin (استخدم مستكشف الويندوز).

الطريقة 3:

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

في المثال المرفق يمكن ان تضيف هذا الكود إلى Form1 :

Public Sub New()

		' This call is required by the Windows Form Designer.
		InitializeComponent()

		' Add any initialization after the InitializeComponent() call.
		Dim fullPath As String = System.IO.Path.GetFullPath(System.IO.Path.Combine(Application.StartupPath, "..\..\CRM.mdf"))
		Dim ConnString = "Data Source=" + ".\SQLEXPRESS;AttachDbFilename=" + fullPath + ";Integrated Security=True;User Instance=True"
		My.Settings.Item("CRMConnectionString") = ConnString
	End Sub

[وسط]لا اله الا انت سبحانك انى كنت من الظالمين

[/وسط]

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