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

اغلاق الاتصال بقاعدة البيانات

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

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

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

والسبب او رسالة الخطا التي دائما تظهر لي تقول ان هذه الداتا بيس مستخدمه

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

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

عمر المختار

اللهم انعم على بلادي بالأمن والأمان

#2

لاغلاق الاتصال بقاعدة البيانات

CN.close
AlexCard.gif

Business Card

Ahmad Fathy Ahmad

Computer and Systems Department

Faculty of Engineering, Alexandria University

Cellular: +2 010 1461154

E-mail: midoalx@hotmail.com

ICQ: 148481391

#3

السلام عليكم

الاخ احمد يبدو انك لم تفهم القصد من سؤالي

انا استنفذت جميع الوسائل والطرق لجميع انواع الاسترجاع لقاعدة بيانات من نوع SQLSERVER من هذا المنتدي وغيره ولكن رسالة الخطاء عندي هي نفسها تقريبا وهي " قاعدة البيانات الحاليه مستخدمة"

فانا استخدم الاسترجاع على FORM توجد بها حقول مربوطة بقاعدة البيانات ونوع الاتصال الذي استخدمة هو الاتصال المنفصل اى ان عندما املا بياناتي اغلق الاتصال

فانا ياخواني احتاج طريقة اكون من خلالها قد اغلقت جميع اتصالاتي بقاعدة البيانات

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

عمر المختار

اللهم انعم على بلادي بالأمن والأمان

#4

السلام عليكم

اخي عبدالجليل العقوري الاخ احمد فهم السؤال ولكن اخي انت لم تحسن صياغة السؤال

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

قبل استرجاع النسخ الاحتياطي Backup سيكون أكثرً إضاحاً من ما هو عليه الان أليس كذلك؟

تذكر ان جُل القراء يقرؤن رؤوس المواضيع ليس إلا.

السلام عليكم.

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

#5

أعتقد ان الأخ عبد الجليل يستخدم DataAdapter في الاتصال بقاعدة البيانات، و ان لم يكن يستخدمه فرد أحمد فتحي هو الحل...

يمكنك تجريب الكود التالي لتتأكد ان الاتصال بقاعدة البيانات مغلق:

		Select Case Me.conn.State
			Case ConnectionState.Closed
				MessageBox.Show("Closed")
			Case ConnectionState.Open
				MessageBox.Show("Opened")
			Case Else
				MessageBox.Show("Else")
		End Select

وان لم تستطع اغلاق الـ Connection بين التطبيق و قاعدة البيانات، فيمكنك استخدام نفس الـ Connection Strings للاتصال بقاعدة بيانات أخرى، فسينقطع الاتصال بين التطبيق و قاعدة البيانات الأصلية و بعد عملية الـ Backup يمكنك ارجاع الـ Connection Strings كما كانت لتعيد الاتصال بقاعدة البيانات الأصلية..

رأس الحكمة الإيمان بالله

#6

السلام عليكم،،

استدعاء الطريقة Close لكائن الاتصال فى الحقيقة لا يتم اغلاق الاتصال ولهذا تظهر الرسالة بان قاعدة البيانات قيد الاستخدام،،،،لانه عند انشاء كائن اتصال وفتح الاتصال وغلقة يتم الاحتفاظ به فيما يسمى باحواض الاتصال Connection Pool لاعادة استخدامه،،،ولهذا لن تتمكن مع اتمام عملية الاسترجاع للنسخة الاحتياطية

لانها تتطلب وصول خاص،،،وان لا يكون هناك اى اتصال بقاعدة البيانات،،،

اخى عبد الجليل،،اذا كان التطبيق ليس متعدد المستخدمين،،او ان عدد المستخدمين قليل،،قم بالغاء خاصية Connection Pool وذلك باضافة Pooling=False; اذا كنت تستخدم مزود sqlconnection او باضافة OLE DB Services=-4; اذا كنت تستخدم oledbconnection لنص الاتصال

مثلا

Data Source=.\SQLEXPRESS;Initial Catalog=mydb;Integrated Security=True;Pooling=False;

ايضا تاكد انه لا يوجد اى جزئية فى الكود،،لا يتم فيها اغلاق الاتصال بعد الاستخدام وتدمير كائن الاتصال

cn.Close
cn=nothing
cn.dispose

اما لو كان التطبيق متعدد المستخدمين،،، multi-tiered application فالافضل ترك احواض الاتصال لتحسين الاداء والحفاظ على المصادر،،،وفى هذه الحالة عملية الاسترجاع اصلا تكون على السيرفر،،وتتم فى وقت لايكون هناك اى استخدام،،، او يمكنك قطع الاتصال بهذا الامر

ALTER DATABASE [mydb]
   SET offline
GO

استخدم sql server profiler لمراقبة عدد الاتصالات التتى تتم على قاعدة البيانات وهل يتم اغلاقه

بالتوفيق

VB.NET and C# Comparison

http://www.harding.edu/fmccown/vbnet_csharp_comparison.html

002.gif

=-=-=-=-=-=-=
ذو العلم يشقى فى النعيم بعلمه .:. واخو الجهالة فى الشقاوة ينعم
=-=-=-=-=-=-=
يا من بدنياه اشتغل . قد غره طول الأمل . فالموت يأتى بغتة . والقبر صندوق العمل
=-=-=-=-=-=-=
ان لم تستطع ان تجد ما تفعله فافعل ما لم تسطع ان تجده

screen_shot_2011-05-19_at_12.44.49_pm.pn

#7

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

إخوتي الأعزاء شكرا تفاعلكم معي وأنا أسف إن حدث مني أي تقصير في إيضاح صيغة السؤال

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

هذا الكود تحصلت عليه من هذا الموقع النسخ الاحتياطي تمام وشغال ولكن الاسترجاع يخرج الرسالة التالية

Cannot open database requested in login 'c:\documents and settings\GPS\My documents \store_capy.bak'.

Login failed for user 'General\GPS'.

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

ملاحظه على هذه الرسالة

store_capy اسم نسخة قاعدة البيانات .

General اسم السيرفير

GPS اسم الجهاز

كود النسخ 
Dim Save As New SaveFileDialog
		Dim BackupPath As String
		Save.Filter = "bak files (*.bak)|*.bak"
		If Save.ShowDialog() = DialogResult.OK Then
			BackupPath = Save.FileName
Dim SQL_Connection As New SqlConnection("data source=" + Environment.MachineName + "; initial catalog=STORE;Integrated Security=SSPI;;Connect Timeout=5")
			Dim cmd As SqlCommand = SQL_Connection.CreateCommand()
			cmd.CommandType = CommandType.Text
			cmd.CommandText = "USE STORE BackUp DATABASE STORE TO DISK= '" + BackupPath + "'"
			SQL_Connection.Open() 'MSreplication_options
			Try
				Me.Cursor = Cursors.WaitCursor
				cmd.ExecuteNonQuery()
				MessageBox.Show(Me, "تم عمل نسخة إحتياطية من قاعدة البيانات", "حفظ", MessageBoxButtons.OK, MessageBoxIcon.Information)
				Me.Cursor = Cursors.Default
			Catch ex As Exception
				MessageBox.Show(ex.Message)
				MessageBox.Show(Me, "خطأ فى أخذ النسخة الإحتياطية من قاعدة البيانات", "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
				Me.Cursor = Cursors.Default
			Finally

				SQL_Connection.Close()
			End Try

		End If
كود الاسترجاع
Dim RestorePath As String
		Dim open As New OpenFileDialog
		open.Filter = "bak files (*.bak)|*.bak"
		cn.Dispose()
		cn.Close()
		cn = Nothing
		If open.ShowDialog() = DialogResult.OK Then
			RestorePath = open.FileName '''''''''''' Data 
			Try
Dim SQL_Connection As New SqlConnection("Data Source=" + Environment.MachineName + ";Initial Catalog=" & RestorePath & ";Integrated Security=True;Pooling=False")

Dim cmd As SqlCommand = SQL_Connection.CreateCommand()
SQL_Connection.Open()
cmd.CommandType = CommandType.Text
cmd.CommandText = "RESTORE DATABASE STORE FROM DISK= '" + RestorePath + "'"

				Me.Cursor = Cursors.WaitCursor
				cmd.ExecuteNonQuery()

				Me.Cursor = Cursors.Default
MessageBox.Show(Me, "تم إسترجاع النسخة الإحتياطية من قاعدة البيانات", "إسترجاع", MessageBoxButtons.OK, MessageBoxIcon.Information)
Me.Cursor = Cursors.Default
			Catch ex As Exception
				MessageBox.Show(ex.Message)
MessageBox.Show(Me, "خطأ فى إسترجاع النسخة الإحتياطية من قاعدة البيانات", "خطأ", MessageBoxButtons.OK, MessageBoxIcon.Error)
				Me.Cursor = Cursors.Default
			Finally
				SQL_Connection.Close()
			End Try

		End If

ونحن متعودين على سعة صدركم للمبتدئين

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

عمر المختار

اللهم انعم على بلادي بالأمن والأمان

#8

up

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

عمر المختار

اللهم انعم على بلادي بالأمن والأمان

#9

للرفع

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

عمر المختار

اللهم انعم على بلادي بالأمن والأمان

#10

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

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

سأحاول أن أجلب لك رابط الموضوع بأقرب وقت

ها هو : /index.ph...&hl=Restore

#11

اخي العزيز mostbar

السلام عليكم

قد اطلعت مسبقا على موضوعك الذي دليتني عليه في الرابط المرفق وهو يعتبر حلاً كآخر الحلول ولكن ما يعيبه هو ما يبينه الاقتباس التالي

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

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

واخيرا اتمنى منك اخي mostbar ان توصلت لحل لهذه المشكلة ان تقوم بمراسلتي وشكرا للتواصلك

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

عمر المختار

اللهم انعم على بلادي بالأمن والأمان

#12

وهل يتم عمل استرجاع لقاعدة البيانات كل دقيقة !!

الموضوع يتم في حالات الطوارئ فقط (الاسترجاع ) ..

كما أن استرجاع البيانات قد يغير أشياء كثيرة في البرنامج .. ألا تستحق هذه الأشياء عمل إعادة تشغيل للبرنامج !

وفي النهاية .. أنت قمت بكتابة اتصال بقاعدتك .. فكيف تغير في ملفاتها و أنت على اتصال بها !

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

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