تقييم الموضوع :
  • 1 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
الغزل مع SQL Server
#2
بسم الله الرحمن الرحيم


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

افتح VS و قم بانشاء مشروع جديد من النوع Windows Forms
لدينا الان FOrm1 ضمن المشروع  نضيف بعض الادوات

-ListBox نسميها LstSrv
-TextBox نسميه TxtSrvName
-TextBox نسميه txtLogin
-TextBox نسميه txtPassword
-RadioButton نسميه chkWindowsAuthentication
-Button نسميه btnConnect

الخطوات التي سنقوم بعملها هي فحص السيرفرات المثيته على الجهاز و عرضها في LstSrv
اذا كان هناك سيرفرات طبعا
و بعدها سنحتاج للاتصال بالسيرفر المحدد باحدى الطريقتين اما باستخدام آمان وندوز او باستخدام اسم مستخدم و كلمة مرور.

ساقوم بعمل اجراء جديد نسميه LoadServ

PHP كود :
Private Sub LoadServ()
 
       'تحميل السيرفرات الموجودة على الجهاز
        Dim rk As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Microsoft SQL Server")
        Dim instances As [String]() = DirectCast(rk.GetValue("InstalledInstances"), [String]())
        If instances.Length > 0 Then
            For Each element As [String] In instances
                If element = "MSSQLSERVER" Then
                    LstSrv.Items.Add(System.Environment.MachineName)

                Else
                    LstSrv.Items.Add(System.Environment.MachineName + "\" + element)

                End If
            Next
        End If

    End Sub 


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

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

PHP كود :
If LstSrv.Items.Count <= 0 Then
            MessageBox
.Show("لا يوجد سيرفرات مثبتة على الجهاز""تسجيل الدخول"MessageBoxButtons.OKMessageBoxIcon.InformationMessageBoxDefaultButton.Button1MessageBoxOptions.RightAlign)

 
           Exit Sub
        ElseIf LstSrv
.Items.Count And TxtServName.Text "" Then
            MessageBox
.Show("يرجى تحديد السيرفر""تسجيل الدخول"MessageBoxButtons.OKMessageBoxIcon.InformationMessageBoxDefaultButton.Button1MessageBoxOptions.RightAlign)

 
           Exit Sub
        End 
If


 
       If chkWindowsAuthentication.Checked False And txtLogin.Text "" And txtPassword.Text "" Then
            MessageBox
.Show("يرجى تحديد اسم المستخدم و كلمة المرور او استخدام امان وندوز""تسجيل الدخول"MessageBoxButtons.OKMessageBoxIcon.InformationMessageBoxDefaultButton.Button1MessageBoxOptions.RightAlign)

 
           Exit Sub
        End 
If 


اظن ان الاكواد واضحة .

الان ناتي الى عملية الدخول الى السيرفر المحدد.
الان و لكي نعمل مع الكائن SQLSmo الذي تحدثنا عنه سابقا يجب ان نقوم باستيراد بعض المراجع لمشروعنا
وجب التنبيه انه يجب ان يكون لديك نسخة SQL Server مثبة على الجهاز لديك
يختلف موقع المراجع باختلاف نسخة SQL Sever المثبة لديك فقط اتبع ما يلي

النسخة المثبته لدي هي SQL Server 2008 R2
و المراجع المطلوبة موجودة في المسار التالي
C:\Program Files\Microsoft SQL Server\100\SDK\Assemblies
الرقم 100 هو خاص برقم النسخة.
في حال كان لديك SQL Sever 2005 ستجد المراجع تحت الرقم 90 على ما اعتقد
ليصبح المسار الخاص بها كما يلي
C:\Program Files\Microsoft SQL Server\90\SDK\Assemblies
و هكذا تجري العملية مع اختلاف النسخ و الله اعلم.
المراجع المطلوبة هي الملفات التالية

Microsoft.SqlServer.ConnectionInfo
Microsoft.SqlServer.Management.Sdk.Sfc
Microsoft.SqlServer.Smo
Microsoft.SqlServer.SmoExtended
Microsoft.SqlServer.SqlEnum
طريقة اضافتها
في تبويب Solution Explorer
قف على References ثم Add Reference و حدد الملفات السابقة ضمن المسار الموجود لديك و الذي تحدده رقم نسخة SQL Server.


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

PHP كود :
Imports Microsoft.SqlServer.Management.Common
Imports Microsoft
.SqlServer.Management.Smo
Imports Microsoft
.SqlServer.Management.Sdk.Sfc 


الان اصبحنا جاهزين للعمل مع الكائن SQLSmo  و التخاطب مع SQL Server .
سنقوم بتعريف بعض المتغيرات التي سنحتاجها للعمل في بداية الكلاس نقوم بتعريف المتغيرات التالية.

PHP كود :
Dim s As String
    Dim conn 
As New ServerConnection()
 
   Dim srv As New Server() 

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

- LstBox نسميها LstDbs  لعرض قواعد البيانات
- ListBox نسميها LstLogin  لعرض المستخدمين

تحت الاكواد السابقة نضيف الكود التالي

PHP كود :
If chkWindowsAuthentication.Checked True Then
            
'اتصال موثوق
            conn = New ServerConnection(LstSrv.SelectedItem.ToString)
            srv = New Server(conn)
            LstDbs.Items.Clear()
            LoadLogins()
            LoadDbs()


        Else
            '
اتصال بكلمة مرور
            conn 
= New ServerConnection(LstSrv.SelectedItem.ToStringtxtLogin.TexttxtPassword.Text)
 
           srv = New Server(conn)
 
           LoadLogins()
 
           LoadDbs()

 
       End If


 
       If srv.ConnectionContext.IsOpen Then
            srv
.ConnectionContext.Disconnect()
 
       End If 


LoadLogins هو الاجراء الخاص بجلب اسماء المستخدمين و نوعهم  و الكود الخاص به كما يلي

PHP كود :
   Private Sub LoadLogins()
 
       For Each lognName As Login In srv.Logins
            If Not lognName
.IsSystemObject Then
                If Not lognName
.Name.Contains("#"Then
                    LstLogin
.Items.Add(lognName.Name " - " lognName.LoginType.ToString)

 
               End If

 
           End If

 
       Next
    End Sub 


اما الاجراء LoadDbs فهو شبيه بالاجراء السابق كما يلي

PHP كود :
   Private Sub LoadDbs()

 
       'تحميل القواعد باستثناء قواعد النظام
        Try
            '
=================
 
           LstDbs.Items.Clear()
 
           Me.Cursor Cursors.WaitCursor

            For Each db 
As Database In srv.Databases
                If Not db
.IsSystemObject Then
                    LstDbs
.Items.Add(db.Name)
 
               End If
 
           Next

        Catch ox 
As SmoException
            MsgBox
(ox.Message.ToString)
 
       Catch ex As Exception
            MsgBox
(ex.Message.ToString)
 
       Finally
            Me
.Cursor Cursors.Default
 
           If srv.ConnectionContext.IsOpen Then
                srv
.ConnectionContext.Disconnect()
 
           End If
 
       End Try

 
   End Sub 


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

PHP كود :
   Private Sub chkWindowsAuthentication_CheckedChanged(sender As System.ObjectAs System.EventArgsHandles chkWindowsAuthentication.CheckedChanged
        If chkWindowsAuthentication
.Checked True Then
            txtLogin
.Enabled False
            txtPassword
.Enabled False
        Else
            txtLogin
.Enabled True
            txtPassword
.Enabled True
        End 
If
 
   End Sub 


بهذه الطريقة نكون قد حصلنا على مبتغانا , هناك الكثير من الامور الفنتازية التي يمكنك المرور عليها.
مثلا لعرض اسم ملف قاعدة البيانات المحددة و موقع القاعدة على الجهاز و الاسم الداخلي للقاعدة.
و كذلك عرض خصائص قاعدة البيانات المحددة.
يمكننا ذلك عن طريق كود بسيط و لعمل ذلك اضف بعض الادوات تحت القائمة LstbBs

- TextBox نسميه TextBox1 نعرض فيه اسم ملف قاعدة البيانات الملف من النوع Mdf
- TextBox نسميه TextBox2 نعرض فيه موقع قاعدة البيانات , المسار
- TextBox نسميه TextBox3 سنعرض فيه اسم القاعدة المختارة
- TextBox نسميه TextBox4 نعرض فيه الاسم الداخلي للملف
- ListBox نسميه LstDbProp نعرض فيه خواص القاعدة المحددة

الكود التالي سيفي بالغرض

PHP كود :
Private Sub LstDbs_SelectedIndexChanged(sender As System.ObjectAs System.EventArgsHandles LstDbs.SelectedIndexChanged
        
'تحميل معلومات القاعدة المحددة
        If LstDbs.Items.Count > 0 Then

            TextBox1.Text = ""
            TextBox2.Text = ""
            TextBox3.Text = ""
 TextBox4.Text = ""
LstDbProp.Items.Clear()
 Dim db As Database = srv.Databases(LstDbs.SelectedItem.ToString)
            TextBox3.Text = db.Name
            For Each fg As FileGroup In db.FileGroups
                TextBox1.Text = (fg.Name)


                For Each df As DataFile In fg.Files
                    TextBox2.Text = (df.FileName)
                    TextBox4.Text = df.Name
                Next

            Next
Dim database As Database = srv.Databases(LstDbs.SelectedItem.ToString)
            LstDbProp.Items.Clear()

            For Each prop As [Property] In database.Properties
                LstDbProp.Items.Add(prop.Name + " - " + prop.Value.ToString)
            Next
End If
If srv.ConnectionContext.IsOpen Then
            srv.ConnectionContext.Disconnect()
        End If
End Sub 


و لعرض اسماء الجداول و الاستعلامات و الاجراءات المخزنة سنقوم باضافة بعض الادوات

- ListBox نسميه LstTable لعرض الجداول
- ListBox نسميه LstViews لعرض الاستعلامات
- ListBox نسميه LstStoredPro لعرض الاجراءات
- ListBox نسميه LstTbProp نعرض فيه اسماء الحقول و نوعها الخاصة بالجدول المحدد


الاجراء التالي سيتكفل بالمهمة

PHP كود :
   Private Sub LoadAll()
 
       LstTable.Items.Clear()
 
       LstViews.Items.Clear()
 
       LstStoredPro.Items.Clear()

 
       Dim Dbs As Database srv.Databases(LstDbs.SelectedItem.ToString)
 
       Me.Cursor Cursors.WaitCursor
        
'تحميل الجداول
        Dim myTable As Table

        For Each myTable In Dbs.Tables
            If Not myTable.IsSystemObject Then
                LstTable.Items.Add(myTable.Name)
            End If
        Next
        '
--------
 
       'تحميل المناظر
        Dim myviews As View
        For Each myviews In Dbs.Views
            If Not myviews.IsSystemObject Then
                LstViews.Items.Add(myviews.Name)
            End If
        Next
        '
---------
 
       'تحميل الاجراءات
        Dim myStoredPro As StoredProcedure
        For Each myStoredPro In Dbs.StoredProcedures
            If Not myStoredPro.IsSystemObject Then
                LstStoredPro.Items.Add(myStoredPro.Name)
            End If
        Next

        Me.Cursor = Cursors.Default
    End Sub 


نضيف هذا الاجراء في نهاية الكود السابق ليصبح الكود كما يلي


PHP كود :
Private Sub LstDbs_SelectedIndexChanged(sender As System.ObjectAs System.EventArgsHandles LstDbs.SelectedIndexChanged
        
'تحميل معلومات القاعدة المحددة
        If LstDbs.Items.Count > 0 Then

            TextBox1.Text = ""
            TextBox2.Text = ""
            TextBox3.Text = ""
 TextBox4.Text = ""
LstDbProp.Items.Clear()
LstTbProp.Items.Clear()
 Dim db As Database = srv.Databases(LstDbs.SelectedItem.ToString)
            TextBox3.Text = db.Name
            For Each fg As FileGroup In db.FileGroups
                TextBox1.Text = (fg.Name)


                For Each df As DataFile In fg.Files
                    TextBox2.Text = (df.FileName)
                    TextBox4.Text = df.Name
                Next

            Next
Dim database As Database = srv.Databases(LstDbs.SelectedItem.ToString)
            LstDbProp.Items.Clear()

            For Each prop As [Property] In database.Properties
                LstDbProp.Items.Add(prop.Name + " - " + prop.Value.ToString)
            Next
 LoadAll() '
تحميل الجداول و الاستعلامات و الاجراءات
End 
If
If 
srv.ConnectionContext.IsOpen Then
            srv
.ConnectionContext.Disconnect()
 
       End If
End Sub 



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

PHP كود :
Private Sub LstTable_SelectedIndexChanged(sender As System.ObjectAs System.EventArgsHandles LstTable.SelectedIndexChanged
        Try

            LstTbProp
.Items.Clear()
 If 
LstTable.Items.Count 0 Then
 
For Each Col As Column In srv.Databases(LstDbs.SelectedItem.ToString).Tables(LstTable.SelectedItem.ToString).Columns
                    LstTbProp
.Items.Add(Col.Name " - " Col.DataType.SqlDataType.ToString)
 
               Next

            End 
If

 
       Catch ex As Exception
            
' MsgBox(ex.Message.ToString)
        End Try 


لدينا الان كل ما نريد استطعنا جلب كائنات القاعدة و كذلك حقول الجدول المحدد .
بعض الامور التي تسترعي انتباهنا ماذا لو احببت ان اشاهد بنية استعلام ما او اجراء مخزن من خلال الكود, يمكننا ذلك و بسهولة , سنضيف بعض الادوات الجديدة.

- TextBox نسميه txtDscr نستخدمه لوصف الكائن المحدد و في اي قاعدة يقبع هذا الكائن
- TextBox نسميه txtBase نستخدمه لعرض ما يحتويه الكائمن من جمل استعلام
- ListBox نسميه lstParameters نستخدمة لعرض البارمترات في حال تم تحديد اجراء مخزن
, عرض اسم الباراميتر و تحديد نوعه.

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

PHP كود :
   Private Sub LstViews_SelectedIndexChanged(sender As System.ObjectAs System.EventArgsHandles LstViews.SelectedIndexChanged
        If LstViews
.Items.Count 0 Then
            Try
                txtBase
.Clear()
 
               txtDscr.Clear()
 
               lstParameters.Items.Clear()
 
               Dim myview1 As View srv.Databases(LstDbs.SelectedItem.ToString).Views(LstViews.SelectedItem.ToString)
 
               txtDscr.Text " بنية إستعلام " " - " srv.Databases(LstDbs.SelectedItem.ToString).Name "/" myview1.Name
                txtBase
.Text myview1.TextBody

            Catch ex 
As Exception

            End 
Try
 
       End If
 
   End Sub 


للحصول على بنية اجراء مخزن و عرض البارمترات التي يحتويها

PHP كود :
   Private Sub LstStoredPro_SelectedIndexChanged(sender As System.ObjectAs System.EventArgsHandles LstStoredPro.SelectedIndexChanged
        If LstDbProp
.Items.Count 0 Then
            Try
                txtBase
.Clear()
 
               txtDscr.Clear()
 
               lstParameters.Items.Clear()
 
               Dim stp As StoredProcedure srv.Databases(LstDbs.SelectedItem.ToString).StoredProcedures(LstStoredPro.SelectedItem.ToString)
 
               txtDscr.Text " بنية اجراء مخزن " " - " srv.Databases(LstDbs.SelectedItem.ToString).Name "/" stp.Name
                txtBase
.Text stp.TextBody
                For Each parm 
As Parameter In stp.Parameters
                    lstParameters
.Items.Add(parm.Name " - " parm.DataType.ToString)

 
               Next

            Catch ex 
As Exception

            End 
Try
 
       End If
 
       

    End Sub 


الى هنا نكون قد اكتفينا اليوم , لقائنا يتجدد ان شاء الله لاستكمال بقية المشوار
نستودعكم الله , ولا تنسونا من صالح دعائكم
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}


الردود في هذا الموضوع
الغزل مع SQL Server - بواسطة nonoms - 25-03-14, 12:37 PM
RE: الغزل مع SQL Server - بواسطة nonoms - 25-03-14, 04:19 PM
RE: الغزل مع SQL Server - بواسطة Sajad - 25-03-14, 07:59 PM
RE: الغزل مع SQL Server - بواسطة ابو ابراهيم - 26-03-14, 06:13 AM
RE: الغزل مع SQL Server - بواسطة nonoms - 26-03-14, 05:32 PM
RE: الغزل مع SQL Server - بواسطة nonoms - 05-04-14, 01:31 AM
RE: الغزل مع SQL Server - بواسطة nonoms - 05-04-14, 04:49 AM
RE: الغزل مع SQL Server - بواسطة Sajad - 05-04-14, 10:48 AM
RE: الغزل مع SQL Server - بواسطة a_almisery - 05-04-14, 02:29 PM
RE: الغزل مع SQL Server - بواسطة مالكـ - 05-04-14, 04:25 PM
RE: الغزل مع SQL Server - بواسطة nonoms - 07-04-14, 05:13 AM
RE: الغزل مع SQL Server - بواسطة T.ALKATHIRI - 09-05-14, 04:20 AM
RE: الغزل مع SQL Server - بواسطة nonoms - 12-05-14, 12:14 AM
RE: الغزل مع SQL Server - بواسطة Omar Mekkawy - 05-06-14, 10:00 PM
RE: الغزل مع SQL Server - بواسطة Omar Mekkawy - 06-06-14, 01:12 PM
RE: الغزل مع SQL Server - بواسطة KH_Alaswad - 12-04-18, 12:47 PM
RE: الغزل مع SQL Server - بواسطة atefkhalf2004 - 07-06-19, 04:03 PM
RE: الغزل مع SQL Server - بواسطة elgokr - 08-06-19, 05:09 PM
RE: الغزل مع SQL Server - بواسطة atefkhalf2004 - 08-06-19, 09:59 PM
RE: الغزل مع SQL Server - بواسطة ابو ليلى - 09-06-19, 09:19 PM
RE: الغزل مع SQL Server - بواسطة atefkhalf2004 - 09-06-19, 10:18 PM
RE: الغزل مع SQL Server - بواسطة ابو ليلى - 10-06-19, 12:38 AM
RE: الغزل مع SQL Server - بواسطة asemshahen5 - 10-06-19, 01:55 PM
RE: الغزل مع SQL Server - بواسطة atefkhalf2004 - 10-06-19, 09:01 PM
RE: الغزل مع SQL Server - بواسطة Abdo hamed - 28-03-20, 09:38 PM


التنقل السريع :


يقوم بقرائة الموضوع: