أحيانا تكون الخدمة الخاصة بـ SQL Server Express متوقفة لسبب ما رغم أن الإعدادات الافتراضية لتشغيلها هي Automatic وعندها لن يعمل البرنامج الخاص بك إذا كان يستخدم قاعدة بيانات مرتبطة به وقد تظهر لك رسالة شبيهة بالتالي
An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: Shared Memory Provider, error: 40 - Could not open a connection to SQL Server)
وهذه الرسالة ممكن أن يكون سببها أيضا خطأ في إعدادات Local and remote connection الخاصة بـ SQL Server وفي هذه الحالة يمكن أن تحل المشكلة بضبط الإعدادات الصحيحة
ولنتأكد أن الخدمة ليست متوقفة يمكن عمل الطريقة التالية لمحاولة بدء الخدمة عند تشغيل برنامجنا
- افتح خصائص المشروع الخاص بك ومن صفحة Application اضغط زر View application events
- في بداية الملف ApplicationEvents.vb الذي أنشئ بالخطوة السابقة اكتب الكود التالي بعد إضافة Reference لـ System.ServiceProcess في المشروع
Imports System.ServiceProcess
- انشئ اجراء لمعالجة الحدث Startup الخاص بـ MyApplication ثم في إجراء الحدث اكتب الكود التالي
Try
' If SQL server Express service not running try to run it first
Dim controller As New System.ServiceProcess.ServiceController("MSSQL$SQLEXPRESS")
If controller.Status <> ServiceControllerStatus.Running And _
controller.Status <> ServiceControllerStatus.StartPending Then
controller.Start()
End If
controller.WaitForStatus(ServiceControllerStatus.Running, New TimeSpan(0, 1, 0))
Catch ex As Exception
System.Media.SystemSounds.Asterisk.Play()
MsgBox(ex.Message, MsgBoxStyle.Critical)
End Tryالذي يقوم بإنشاء مرجع للخدمة الخاصة بـ SQL Server ثم يتأكد من حالتها ويحاول بدءها إن لم تكن تعمل
وشرح الكود
انشاء متحكم للخدمة اعتمادا على اسمها
Dim controller As New System.ServiceProcess.ServiceController("MSSQL$SQLEXPRESS")التأكد من حالة الخدمة وبدءها بالاجراء Start كما يمكن إيقافها أيضا بالاجراء Stop
If controller.Status <> ServiceControllerStatus.Running And _ controller.Status <> ServiceControllerStatus.StartPending Then controller.Start() End If
الانتظار حتى تصبح الخدمة في الحالة المطلوبة مع وضع فترة Timeout لمدة دقيقة واحدة والتي تطلق استثناء Exception في حالة انقضاء المدة المحددة دون وصول الخدمة للحالة المطلوبة
controller.WaitForStatus(ServiceControllerStatus.Running, New TimeSpan(0, 1, 0))
- كما يمكن الاستفادة من الكود السابق للتحكم بأي خدمة من خدمات ويندوز من داخل برنامجك وبنفس الطريقة
- للمعلومات حول أحداث التطبيق Application Events والتعامل معها يوجد موضوع خاص في المنتدى على الرابط
