تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
اسناد بينات الاتصال برمجياً عبر المعالج - نص الاتصال-السيرفر-القاعدة-بيانات اخرى
#1
السلام عليكم و رحمة الله و بركاته
رمضان مبارك على الجميع - و اعاده الله عليكم جميعاً بالخير و البركة


الموضوع يتحدث عن كيفية عمل معالج بسيط يقوم بعمل نص الاتصال برمجبا و اضافته الى مسجل النظام (Registry) .
مع امكانية اضافة بيانات اخرى مثل اسم السيرفر او قاعدة البيانات او اسم المستخدم او اي بيانات ترغب بها.
تصبح هذه البيانات متوفرة على مستوى البرنامج او على مستوى الجهاز ككل و يمكن استدعائها ببساطة.
------------------------------------------
الطريقة طرحت لطلب بعض الاخوة لها اثناء تصفحي لموضوع دورة برنامج مبيعات للاخ (ملهم).
الطريقة تنفع مع اي برنامج و هي تحل مشكلة تغيير اسم السيرفر و بالتالي تغير نص الاتصال و تطرح حل عملي لمعالجة البيانات المطلوبة بشكل متكرر من قبل البرنامج.
-------------------------------------------
في البداية سيكون لدي كود بسيط يمهد للمعلومات التي احتاجها في برنامجي .
-اسم السيرفر
-قاعدة البيانات
-اسم المستخدم الخاص بالسيرفر
-كلمة المرور
-نص الاتصال
-معلومات اخرى حسب الحاجة
-------------------------------------------
سيكون لدي دالتان , الدالة الاولى تقوم بجلب معلومات اي مفتاح (حقل) بدلالة اسمه.
الدالة الثانية تقوم باسناد بيانات لاي مفتاح (حقل) بدلالة اسمه.
هذه الحقول ستكون موجودة في الرجستري تحت عقدة خاصة نقوم بانشائها , هذه العقدة ستتوفر على حقول لكل البيانات التي نود تخزينها , دعنا نسميها جدول بيانات.
وفقاً لهذا الكلام سيكون لدينا دالة اخرى تقوم بانشاء هذه الحقول بداية اقلاع البرنامج و تعطيها قيم افتراضية فارغة , طبعاً الدالة ستفحص توفر هذه العقدة في الرجستري قبل اضافة الحقول فاذا كانت موجودة فلن تقوم بانشائها.
عملية اسناد قيم لهذه الحقول ستكون وفق نموذج خاص يجلب اسم السيرفر الخاص بالجهاز و اسم القاعدة الخاصة بالبرنامج , و يقوم بعدها بانشاء نص الاتصال و تخزينه في الحقل الموافق له في الرجستري , و كذلك تخزين باقي المعلومات التي نريدها.
باقي المعلومات يمكنك تخزينها من مواقع اخرى من البرنامج , مثل اسم المستخدم اذا كنت تستخدم نموذج دخول خاص بك في برنامجك , و كذلك اخر مستخدم ولج للبرنامج و غيرها من المعلومات التي تراها تخدم عملك (التي بدورها تصنف على انها متغيرات عامة).
فكرة تخزين المعلومات في الرجستري افضل من تخزينها في اعدادت البرنامج او في ملف نصي (بعيد عن العبث).
-------------------------------------------------------------------
نبدأ على بركة الله , بعد التقديم السابق.
-------------------------------------------------------------------
اعمل مشروع جديد و اضف له مديول (Module) سميها (Ml_ServerSetting)
اضف لها الكود التالي

PHP كود :
Imports Microsoft.Win32

Module Ml_ServerSetting
    Dim ConnectionStr 
As RegistryKey
    Public ReadOnly MainKeyName 
As String "MyApplication_Keys"


#Region "Registry Editing"
 
   ''' <summary>
    ''' 
الحصول على قيمة اي مفتاح تحت عقدة البرنامج في الرجستري
    
''' </summary>
    ''' 
<param name="SubKeyName">اسم المفتاح</param>
 
   ''' <returns>يعيد قيمة نصية تمثل قيمة المفتاح</returns>
    Public Function GetValueKey(ByVal SubKeyName As String) As String
        Dim Value As String = ""

        If Not (Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyName) Is Nothing) Then 
            Value = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyName).OpenSubKey(SubKeyName).GetValue(SubKeyName)
            Return Value
        Else
            Return ""
        End If
        Return Value

    End Function


    ''' 
<summary>
 
   ''' اسناد قيمة لاي مفاح تحت عقدة البرنامج
    ''' 
</summary>
 
   ''' <param name="KeyNmae">اسم المفتاح</param>
    ''' 
<param name="Value">قيمة المفتاح</param>
 
   Public Sub SetValueKey(ByVal KeyNmae As StringByVal Value As String)
 
       If Not (Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyNameIs NothingThen
            Microsoft
.Win32.Registry.CurrentUser.OpenSubKey(MainKeyNameTrue).OpenSubKey(KeyNmaeTrue).SetValue(KeyNmaeValue)
 
       End If

 
   End Sub


    
''' <summary>
    ''' 
انشاء المفاتيح في مسجل النظام بداية اقلاع البرنامج للمرة الاولى في حال لم تكن موجودة
    
''' </summary>
    Public Sub CreateKeyes()

        If Registry.CurrentUser.OpenSubKey(MainKeyName) Is Nothing Then
            Dim ApplicationSetting As RegistryKey = Registry.CurrentUser.CreateSubKey(MainKeyName)
            ConnectionStr = ApplicationSetting.CreateSubKey("UserConnectionString") '
حقل لنص الاتصال
            ConnectionStr 
ApplicationSetting.CreateSubKey("ServerName"'حقل لاسم السيرفر
            ConnectionStr = ApplicationSetting.CreateSubKey("DataBaseName") '
حقل لقاعدة البيانات
            ConnectionStr 
ApplicationSetting.CreateSubKey("Authentication_Mode"'حقل طريقة الدخول
            ConnectionStr = ApplicationSetting.CreateSubKey("Server_UserName") '
حقل لاسم مستخدم السيرفر
            ConnectionStr 
ApplicationSetting.CreateSubKey("Server_Password"'حقل كلمة المرور للسيرفر
            ConnectionStr = ApplicationSetting.CreateSubKey("CurrentApp_User") '
حقل المستخدم الحالي
            ConnectionStr 
ApplicationSetting.CreateSubKey("Current_UserType"'حقل لصلاحية المستخدم
            ConnectionStr = ApplicationSetting.CreateSubKey("Current_UserKind") '
حقل لنوع المستخدم
            ConnectionStr 
ApplicationSetting.CreateSubKey("LastUserLogin"'حقل اخر مستخدم ولج للبرنامج

            DefaultSetting()
        End If
    End Sub

    '
اعدادات افتراضية
    Private Sub DefaultSetting
()
 
       Try
            If Not IsNothing
(Registry.CurrentUser.OpenSubKey(MainKeyName)) Then

                SetValueKey
("UserConnectionString""")
 
               SetValueKey("ServerName""")
 
               SetValueKey("DataBaseName""")
 
               SetValueKey("Authentication_Mode""")
 
               SetValueKey("Server_UserName""")
 
               SetValueKey("Server_Password""")
 
               SetValueKey("CurrentApp_User""")
 
               SetValueKey("Current_UserType""")
 
               SetValueKey("Current_UserKind""")
 
               SetValueKey("LastUserLogin""")
 
           End If
 
       Catch ex As Exception
            MsgBox
(ex.ToString)

 
       End Try
 
   End Sub

#End Region

End Module 
الكود مشروح , اسم المجلد الذي سننشئه (MyApplication_Kyes) سيكون تحت العقدة (CurrentUser)
يحتوي المجلد على عدة حقول كما في الكود السابق يمكنك الزيادة عليها و حذف بعضها .
الدالة (CreateKeyes) هي المسؤولة عن انشاء الحقول و سنسنتخدما مع اي شاشة يبدأ بها البرنامج (هذا يعود لنمط تصميمك للبرنامج), مثل الشاشة الافتتاحية او شاشة البرنامج الرئيسية (Mdi Form).
-----------------------------------------
بعد ذلك سيكون لدينا نموذج خاص باسناد معلومات لهذه الحقول.
تصميم الواجهة سيكون مثل الصورة التالية.



النموذج يتالف من قسمين , الاول خاص باعدادت النظام , وهو يستقي معلوماته من حقول الرجستري السابقة, و يمكن الادخال فيه بشكل يدوي لاسم السيرفر و القاعدة و طريقة الدخول و اسم و كلمة المرور للمستخدم.
القسم الثاني :بيانات السيرفر من الجهاز وهو يقوم بجلب اسم السيرفر و اسم القاعدة عبر الزر(جلب) ثم يقوم باسناد المعلومات عبر الزر (اسناد).
الزر حفظ الاعدادات يقوم بتشكيل نص الاتصال و تخزين كافة المعلومات في حقول الرجستري.
-----------------------------------
الكود الخاص بالنموذج.
PHP كود :
Imports Microsoft.SqlServer.Management.Common
Imports Microsoft
.SqlServer.Management.Smo

Public Class Fr_Setting

    Private Sub Rd_WindowsAuth_CheckedChanged
(sender As ObjectAs EventArgsHandles Rd_WindowsAuth.CheckedChanged
        If Rd_WindowsAuth
.Checked True Then
            Txt_UserName
.ReadOnly True
            Txt_UserPwd
.ReadOnly True
        End 
If
 
   End Sub

    Private Sub Rd_SqlAuth_CheckedChanged
(sender As ObjectAs EventArgsHandles Rd_SqlAuth.CheckedChanged
        If Rd_SqlAuth
.Checked True Then
            Txt_UserName
.ReadOnly False
            Txt_UserPwd
.ReadOnly False
        End 
If

 
   End Sub

    Private Sub Fr_Setting_Load
(sender As ObjectAs EventArgsHandles MyBase.Load
        GetAllSettings
()
 
   End Sub
    Private Sub GetAllSettings
()
 
       If Not (Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyNameIs NothingThen
            Txt_ServerName
.Text = If(GetValueKey("ServerName") <> String.Empty, GetValueKey("ServerName"), String.Empty)
 
           Txt_DatabaseName.Text = If(GetValueKey("DataBaseName") <> String.Empty, GetValueKey("DataBaseName"), String.Empty)
 
           '
            Dim Mode As String = GetValueKey("Authentication_Mode")
            If Mode = "Windows Authentication" Then
                Rd_WindowsAuth.Checked = True
            ElseIf Mode = "SQL Server Authentication" Then
                Rd_SqlAuth.Checked = True
            Else
                Rd_WindowsAuth.Checked = True
            End If

            Txt_UserName.Text = If(GetValueKey("Server_UserName") <> String.Empty, GetValueKey("Server_UserName"), String.Empty)
            Txt_UserPwd.Text = If(GetValueKey("Server_Password") <> String.Empty, GetValueKey("Server_Password"), String.Empty)
            TXt_ConnectionString.Text = If(GetValueKey("UserConnectionString") <> String.Empty, GetValueKey("UserConnectionString"), String.Empty)

        End If

    End Sub

    Private Sub Save_Settings()
        If String.IsNullOrEmpty(Txt_ServerName.Text) Or String.IsNullOrEmpty(Txt_DatabaseName.Text) Then
            MessageBox.Show("لا يتوفر سيرفر او قاعدة بالاسماء المطلوبة", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Exit Sub
        End If

        Try
            If Not (Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyName) Is Nothing) Then
                TXt_ConnectionString.Clear()
                SetValueKey("ServerName", Txt_ServerName.Text)
                SetValueKey("DataBaseName", Txt_DatabaseName.Text)
                '
 
               If Rd_WindowsAuth.Checked True Then
                    Txt_UserName
.Clear()
 
                   Txt_UserPwd.Clear()
 
                   '
                    SetValueKey("Authentication_Mode", "Windows Authentication")
                    CreateConnection(Txt_ServerName.Text, Txt_DatabaseName.Text)
                    SetValueKey("UserConnectionString", TXt_ConnectionString.Text)
                    SetValueKey("Server_UserName", String.Empty)
                    SetValueKey("Server_Password", String.Empty)
                    MessageBox.Show("تم الحفظ", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Information)

                ElseIf Rd_SqlAuth.Checked = True Then
                    SetValueKey("Authentication_Mode", "SQL Server Authentication")
                    CreateConnection(Txt_ServerName.Text, Txt_DatabaseName.Text, Txt_UserName.Text, Txt_UserPwd.Text)
                    SetValueKey("UserConnectionString", TXt_ConnectionString.Text)
                    SetValueKey("Server_UserName", Txt_UserName.Text)
                    SetValueKey("Server_Password", Txt_UserPwd.Text)
                    MessageBox.Show("تم الحفظ", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            End If

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

    End Sub

    Private Sub Btn_Save_Click(sender As Object, e As EventArgs) Handles Btn_Save.Click
        Save_Settings()
    End Sub


    Private Function CreateConnection(ByVal ServerName As String, ByVal DataBaseName As String, Optional ByVal UserNmae As String = Nothing, Optional ByVal Password As String = Nothing) As String
        If UserNmae = Nothing Or Password = Nothing Then
            Dim Windows_Connection As String = "Data Source = " & ServerName & ";Initial Catalog=" & DataBaseName & ";Integrated Security=True"
            TXt_ConnectionString.Text = Windows_Connection
            Return Windows_Connection
        Else
            Dim Sql_Connection As String = "Data Source = " & ServerName & ";Initial Catalog=" & DataBaseName & ";User ID=" & UserNmae & ";Password=" & Password
            TXt_ConnectionString.Text = Sql_Connection
            Return Sql_Connection
        End If
    End Function

    Private Sub Btn_Close_Click(sender As Object, e As EventArgs) Handles Btn_Close.Click
        Close()
    End Sub


#Region "Server Setting"
    Dim conn As New ServerConnection()
    Dim srv As New Server()

    '
جلب قائمة السيرفرات
    Private Sub GetServerList
()

 
       Dim Server As String String.Empty
 
       Dim instance As Sql.SqlDataSourceEnumerator Sql.SqlDataSourceEnumerator.Instance
        Dim table 
As System.Data.DataTable instance.GetDataSources()

 
       For Each row As System.Data.DataRow In table.Rows
            Server 
String.Empty
 
           Server row("ServerName")
 
           If row("InstanceName").ToString.Length 0 Then
                Server 
Server "\" & row("InstanceName")
            End If
            LstSrv.Items.Add(Server)
        Next
        LstSrv.SelectedIndex = LstSrv.FindStringExact(Environment.MachineName)
    End Sub

    ''' <summary>
    ''' تحميل القواعد باستثناء قواعد النظام
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub LoadDbs()
        Me.Cursor = Cursors.WaitCursor
        GetServerList()
        '
        If LstSrv.Items.Count > 0 Then
            LstSrv.SelectedIndex = 0
            conn = New ServerConnection(LstSrv.SelectedItem.ToString)
            srv = New Server(conn)
        End If
        'تحميل القاعدة المطلوبة فقط
        'بامكانك تحميل كل القواعد بعد ازالة الشرط
        Try
            '=================
            LstDbs.Items.Clear()
            For Each db As Database In srv.Databases
                If Not db.IsSystemObject And db.Name = "
familycareDB" Then
                    LstDbs.Items.Add(db.Name)
                End If
            Next
            '
            If LstDbs.Items.Count > 0 Then
                LstDbs.SelectedIndex = LstDbs.FindStringExact("
familycareDB")
            End If
            '
        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

    'جلب بيانات السيرفر و القاعدة من الجهاز
    Private Sub Btn_GetInfo_Click(sender As Object, e As EventArgs) Handles Btn_GetInfo.Click
        LoadDbs()
    End Sub

    'اسناد المعلومات بعد جلبها
    Private Sub Btn_LoadInfo_Click(sender As Object, e As EventArgs) Handles Btn_LoadInfo.Click
        If Not String.IsNullOrEmpty(LstSrv.Text) Then
            Txt_ServerName.Text = LstSrv.Text
        End If
        If Not String.IsNullOrEmpty(LstDbs.Text) Then
            Txt_DatabaseName.Text = LstDbs.Text
        End If

    End Sub

#End Region

End Class 
في الكود السابق انا ابحث عن قاعدة باسم (familycareDB) , قم بتغييرها لاسم القاعدة الخاصة بك , او عدل الشرط الخاص بجلب القواعد ليجلب لك كل القواعد و بعدها عين القاعدة كما تريد (يوجد شرح في الكود).
-----------------------------------------------------------------
لا تنسى استيراد المراجع (ManageMent.Common,ManageMent.Smo)
-------------------------------------------------------------
بعد ان اصبحت المعلومات مخزنة في حقول عامة في الرجستري , كيف يمكنني التعامل معها ؟؟؟

بكل بساطة و كما اعتدت في تعريف نص الاتصال ....
PHP كود :
       Public Shared SqlCon As SqlConnection
        Private ConnectionString 
As String GetValueKey("UserConnectionString"
PHP كود :
       Public Sub New()
 
           If Not String.IsNullOrEmpty(ConnectionStringThen
                SqlCon 
= New SqlConnection(ConnectionString)
 
           Else
                MessageBox
.Show("نص الاتصال بالسيرفر مفقود""تنبيه"MessageBoxButtons.OKMessageBoxIcon.Information)
 
               OpenSetting()
 
           End If
 
       End Sub 

PHP كود :
       Private Sub OpenSetting()
 
           Dim Fr_Setting As New Fr_Setting
            With Fr_Setting
                
.Owner Frm_Main
                
.StartPosition FormStartPosition.CenterScreen
                
.ShowDialog()
 
               SqlCon = New SqlConnection(GetValueKey("UserConnectionString"))
 
           End With

        End Sub 
يمكنك الاستفادة من المشروع و التوسع فيه كما تحب فقط فهم الفكرة يكفي لتنطلق به في اي اتجاه و حسب حاجتك.
طريقة فحص التغييرات التي تطرأ على نص الاتصال و كيفية استدعاء المعالج السابق كما قلت سابقاً تعتمد كلياً على طريقة التصميم و البرمجة الخاصة بك.
بالنسبة لعملية اسناد معلومات لباقي الحقول , هذا يتوقف عليك فاي حقل تريد ان تسند له قيمة ما عليك الا مناداة الدالة (SetValueKey) , و عملية الحصول عل القيمة بداخلها يتم وفق الدالة (GetValueKey).

المشروع لم يخضع للتجريب المثالي نظراً لضيق الوقت , ولكن كتجربة اولى هو يعمل بشكل جيد.

بالتوفيق للجميع.


الملفات المرفقة
.rar   ServerWizared.rar (الحجم : 1.25 م ب / التحميلات : 682)
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}
#2
حضرتك لك كل الشكر 
انا الشخص الذي طلب هذا الموضوع
لكن حضرتك طرحت الموضوع بطريقة كبيرة علينا قوي
المطلوب  هو  حضرتك شاشة في بداية التحميل  يكون فيها 3 مربعات نصوص
الاول اسم السرفر
الثاني اسم قاعدة البيانات ويمكن البحث عنها dialouge
الثالث  لو هناك كلمة مرور لقاعدة البيانات
ويتم حفظهم في مكان وليكن ملف نصي او الريجستري
يتم استخدامهم عند الدخول
ويمكن تعديل هذه البيانات فيما بعد
ولك جزيل الشكر 
وللعلم انا اطرح اسئلة تدور في ذهن الكثير
وانتم لها واكبر منها وسوف تجيبون عليها
وربنا يخليكم لنا
الرد }}}
تم الشكر بواسطة: ابو ليلى , ytohamy
#3
(26-05-18, 02:54 PM)atefkhalf2004 كتب : حضرتك لك كل الشكر  
انا الشخص الذي طلب هذا الموضوع
لكن حضرتك طرحت الموضوع بطريقة كبيرة علينا قوي
المطلوب  هو  حضرتك شاشة في بداية التحميل  يكون فيها 3 مربعات نصوص
الاول اسم السرفر
الثاني اسم قاعدة البيانات ويمكن البحث عنها dialouge 
الثالث  لو هناك كلمة مرور لقاعدة البيانات 
ويتم حفظهم في مكان وليكن ملف نصي او الريجستري
يتم استخدامهم عند الدخول 
ويمكن تعديل هذه البيانات فيما بعد
ولك جزيل الشكر  
وللعلم انا اطرح اسئلة تدور في ذهن الكثير
وانتم لها واكبر منها وسوف تجيبون عليها 
وربنا يخليكم لنا


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

صديقي الكريم انا لا ادري كيف اطرح الموضوع صراحة, لان مفهوم المعالج يعتمد تحديداً كما اسلفت على طريقة البرمجة الخاصة بك او بغيرك من الاخوة.
فلو اني تابعت دورة ما او كان هناك مشروع فعلي تم طرحه لكنت طبقت الفكرة عليه.
بكل حال و بما انني فتحت الباب لهذا السؤال فلن اخذلك في الاجابة عليه (إن شاء الله).
---------------------------------
قبل قليل رأيت سؤال في قسم #C خاص بالاخ Ghost .
رابط السؤال

الاخ يستخدم اسلوب (N-Tier Application) هكذا يبدو وفق طبيعة السؤال ؟؟
لذا قررت ان اصيد عصفورين او 3 بحجر واحد , بالاضافة للاجابة على السؤالين + اسلوب N-Tier.
-----------------------------------------
الاخ عاطف الموضوع يتعلق بمخدم قواعد البيانات SQL SERVER  لذا ليس لدينا كلمة مرور لقاعدة البيانات (كلمة مرور للسيرفر).
---------------------------------------
الواجهة الرئيسية للبرنامج ستكون (Mdi Form) نموذج رئيسي حاوي لنماذج بداخله , وهو شاشة البدء في برنامجنا.
اول ما نفتح البرنامج تنبثق شاشة تسجيل الدخول , طبعا (اسم مستخدم و كلمة مرور كالعادة), هذا يقودنا الى قاعدة بيانات تحتوي على جدول للمستخدمين .
سنطبق فكرتنا كالتالي:
اذا كانت الاعدادات محفوظة في الرجستري مسبقاً سيتم التخاطب مع الجدول و الدخول لواجهة البرنامج .
اذا لم تكن الاعدادت محفوظة او كان اول اقلاع للبرنامج او كان هناك خطأ في احد بيانات السيرفر , عنده سينبثق معالجنا السابق لنقوم بتسجيل المعلومات الخاصة بنا و حفظها للمرة الاولى فقط و بعدها لن نحتاج له الا اذا تغيرت هذه الاعدادات او حصل خطأ بها, اتمنى ان تكون الفكرة واضحة.
-------------------------------------
قاعدة بيانات المثال لدي اسمها (NtierDB) تحتوي على جدول واحد للمستخدمين (User_Tb) وفق الصورة التالية



وتحتوي على اجرائين (Tow Stored Procedures) , واحد لجلب بيانات المستخدمين , و الثاني لمطابقة المستخدم الحالي اثناء الدخول.
كما يلي.

جلب كل المستخدمين
PHP كود :
USE [NTierDB]
GO
Create proc 
[dbo].[User_GetAll]
 
 As

SELECT [_User_id]
 
     ,[_User_Name]
 
 ,[_User_Kind]
 
     ,[_User_Pwd]
 
 FROM [dbo].[User_Tb


مطابقة مستخدم واحد
PHP كود :
USE [NTierDB]
GO
Create proc 
[dbo].[GetUser]
 @
_User_Name nvarchar(100)
,@
_User_Pwd nvarchar(100)

As 
Select From User_Tb
Where _User_Name
=@_User_Name And _User_Pwd=@_User_Pwd 

من جهة البرنامج سيكون لدي تقسيم للبرنامج الى طبقات .
طبقة البيانات (Data Tier), طبقة الاعمال (Business Tier) , طبقة العرض (View Tier).
من دون الدخول في التفاصيل فالامر متشعب كثيراً عندما تتم مناقشته بعمق , فقط لنفهم اننا نريد تقسيم البرنامج الى طبقات و كل طبقة لها تخصص , حتى يسهل عليك لاحقاً التعديل و التوثيق و المراجعة و الفهم من قبل فريق العمل.
-----------------------------------------------
طبقة البيانات (Data Access Layer) التخاطب مع عناصر القاعدة.
طبقة الاعمال (Business Logic) كلاسات تمثل الكائنات و طرق التعامل معها.
طبقة العرض (User Interface) و اجهة العرض و ما يتعلق بها.

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


الملفات المرفقة
.rar   ServerWizared2.rar (الحجم : 1.28 م ب / التحميلات : 398)
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}
#4
واحد مش عارف ما الغضنفر   
فسال شخص   ما هو الغضنفرر
فرد عليه الاخر  ليث

قال له لما انا مش عارف الغضنفر    ااعرف الليث ؟؟؟؟
الرد }}}
تم الشكر بواسطة: ابراهيم ايبو
#5
السلام عليكم

من اهم المشاكل واكثرها شيوعا لذا المبرمجين المبتدئيين - مثل حالي - هي ببساطة :
- نقل البرنامج الي كمبيوتر اخر "عميل"
طبعا يختلف اسم الكمبيوتر وكلمة دخول السيرفر عن الجهاز الخاص بالمبرمج لذا تقع المشكلة ولا يستطيع نشر برنامجه.

اغلب الحلول الموجودة غير واضحة ولا تفيد في الغالب الشخص المبتدئ بسبب تعقيدها. 

الحل هو بتوفير برنامج يقوم بالاتي
1-نسخ السيرفر وبيانات دخوله في ملف قابل للاسترداد.
2-تنصيب سيرفر بالمعلومات المدخلة او المستوردة من قبل الشخص
3-ادراج قاعدة البيانات ورفعها للسيرفر.
ويقوم المبرمج بتشغيله على جهاز العميل لمرة واحدة قبل البدء في تنصيب برنامجه الاصلي
---------------
موضوع ابوليلي في صلب المشكلة ومتوقع انه يحل هالمشكلة حسب مافهمت. بس طريقة عرضه متقدمة وغير واضحة, جاري دراسة المشروع ومشكور اخي ابو ليلى
تحياتي
الرد }}}
تم الشكر بواسطة:
#6
يا ريت
اح يضع ثال بسيط
سكول 2008
فيجوال 2008
الرد }}}
تم الشكر بواسطة:
#7
إخواني الكرام وجدت هذا الحل أتمنى أن يفيدكم    http://vb4arb.com/vb/showthread.php?tid=2358
الرد }}}
تم الشكر بواسطة: elgokr
#8
(25-05-18, 02:04 AM)ابو ليلى كتب : السلام عليكم و رحمة الله و بركاته
رمضان مبارك على الجميع - و اعاده الله عليكم جميعاً بالخير و البركة


الموضوع يتحدث عن كيفية عمل معالج بسيط يقوم بعمل نص الاتصال برمجبا و اضافته الى مسجل النظام (Registry) .
مع امكانية اضافة بيانات اخرى مثل اسم السيرفر او قاعدة البيانات او اسم المستخدم او اي بيانات ترغب بها.
تصبح هذه البيانات متوفرة على مستوى البرنامج او على مستوى الجهاز ككل و يمكن استدعائها ببساطة.
------------------------------------------
الطريقة طرحت لطلب بعض الاخوة لها اثناء تصفحي لموضوع دورة برنامج مبيعات للاخ (ملهم).
الطريقة تنفع مع اي برنامج و هي تحل مشكلة تغيير اسم السيرفر و بالتالي تغير نص الاتصال و تطرح حل عملي لمعالجة البيانات المطلوبة بشكل متكرر من قبل البرنامج.
-------------------------------------------
في البداية سيكون لدي كود بسيط يمهد للمعلومات التي احتاجها في برنامجي .
-اسم السيرفر
-قاعدة البيانات
-اسم المستخدم الخاص بالسيرفر
-كلمة المرور
-نص الاتصال
-معلومات اخرى حسب الحاجة
-------------------------------------------
سيكون لدي دالتان , الدالة الاولى تقوم بجلب معلومات اي مفتاح (حقل) بدلالة اسمه.
الدالة الثانية تقوم باسناد بيانات لاي مفتاح (حقل) بدلالة اسمه.
هذه الحقول ستكون موجودة في الرجستري تحت عقدة خاصة نقوم بانشائها , هذه العقدة ستتوفر على حقول لكل البيانات التي نود تخزينها , دعنا نسميها جدول بيانات.
وفقاً لهذا الكلام سيكون لدينا دالة اخرى تقوم بانشاء هذه الحقول بداية اقلاع البرنامج و تعطيها قيم افتراضية فارغة , طبعاً الدالة ستفحص توفر هذه العقدة في الرجستري قبل اضافة الحقول فاذا كانت موجودة فلن تقوم بانشائها.
عملية اسناد قيم لهذه الحقول ستكون وفق نموذج خاص يجلب اسم السيرفر الخاص بالجهاز و اسم القاعدة الخاصة بالبرنامج , و يقوم بعدها بانشاء نص الاتصال و تخزينه في الحقل الموافق له في الرجستري , و كذلك تخزين باقي المعلومات التي نريدها.
باقي المعلومات يمكنك تخزينها من مواقع اخرى من البرنامج , مثل اسم المستخدم اذا كنت تستخدم نموذج دخول خاص بك في برنامجك , و كذلك اخر مستخدم ولج للبرنامج و غيرها من المعلومات التي تراها تخدم عملك (التي بدورها تصنف على انها متغيرات عامة).
فكرة تخزين المعلومات في الرجستري افضل من تخزينها في اعدادت البرنامج او في ملف نصي (بعيد عن العبث).
-------------------------------------------------------------------
نبدأ على بركة الله , بعد التقديم السابق.
-------------------------------------------------------------------
اعمل مشروع جديد و اضف له مديول (Module) سميها (Ml_ServerSetting)
اضف لها الكود التالي

PHP كود :
Imports Microsoft.Win32

Module Ml_ServerSetting
    Dim ConnectionStr 
As RegistryKey
    Public ReadOnly MainKeyName 
As String "MyApplication_Keys"


#Region "Registry Editing"
 
   ''' <summary>
    ''' 
الحصول على قيمة اي مفتاح تحت عقدة البرنامج في الرجستري
    
''' </summary>
    ''' 
<param name="SubKeyName">اسم المفتاح</param>
 
   ''' <returns>يعيد قيمة نصية تمثل قيمة المفتاح</returns>
    Public Function GetValueKey(ByVal SubKeyName As String) As String
        Dim Value As String = ""

        If Not (Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyName) Is Nothing) Then 
            Value = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyName).OpenSubKey(SubKeyName).GetValue(SubKeyName)
            Return Value
        Else
            Return ""
        End If
        Return Value

    End Function


    ''' 
<summary>
 
   ''' اسناد قيمة لاي مفاح تحت عقدة البرنامج
    ''' 
</summary>
 
   ''' <param name="KeyNmae">اسم المفتاح</param>
    ''' 
<param name="Value">قيمة المفتاح</param>
 
   Public Sub SetValueKey(ByVal KeyNmae As StringByVal Value As String)
 
       If Not (Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyNameIs NothingThen
            Microsoft
.Win32.Registry.CurrentUser.OpenSubKey(MainKeyNameTrue).OpenSubKey(KeyNmaeTrue).SetValue(KeyNmaeValue)
 
       End If

 
   End Sub


    
''' <summary>
    ''' 
انشاء المفاتيح في مسجل النظام بداية اقلاع البرنامج للمرة الاولى في حال لم تكن موجودة
    
''' </summary>
    Public Sub CreateKeyes()

        If Registry.CurrentUser.OpenSubKey(MainKeyName) Is Nothing Then
            Dim ApplicationSetting As RegistryKey = Registry.CurrentUser.CreateSubKey(MainKeyName)
            ConnectionStr = ApplicationSetting.CreateSubKey("UserConnectionString") '
حقل لنص الاتصال
            ConnectionStr 
ApplicationSetting.CreateSubKey("ServerName"'حقل لاسم السيرفر
            ConnectionStr = ApplicationSetting.CreateSubKey("DataBaseName") '
حقل لقاعدة البيانات
            ConnectionStr 
ApplicationSetting.CreateSubKey("Authentication_Mode"'حقل طريقة الدخول
            ConnectionStr = ApplicationSetting.CreateSubKey("Server_UserName") '
حقل لاسم مستخدم السيرفر
            ConnectionStr 
ApplicationSetting.CreateSubKey("Server_Password"'حقل كلمة المرور للسيرفر
            ConnectionStr = ApplicationSetting.CreateSubKey("CurrentApp_User") '
حقل المستخدم الحالي
            ConnectionStr 
ApplicationSetting.CreateSubKey("Current_UserType"'حقل لصلاحية المستخدم
            ConnectionStr = ApplicationSetting.CreateSubKey("Current_UserKind") '
حقل لنوع المستخدم
            ConnectionStr 
ApplicationSetting.CreateSubKey("LastUserLogin"'حقل اخر مستخدم ولج للبرنامج

            DefaultSetting()
        End If
    End Sub

    '
اعدادات افتراضية
    Private Sub DefaultSetting
()
 
       Try
            If Not IsNothing
(Registry.CurrentUser.OpenSubKey(MainKeyName)) Then

                SetValueKey
("UserConnectionString""")
 
               SetValueKey("ServerName""")
 
               SetValueKey("DataBaseName""")
 
               SetValueKey("Authentication_Mode""")
 
               SetValueKey("Server_UserName""")
 
               SetValueKey("Server_Password""")
 
               SetValueKey("CurrentApp_User""")
 
               SetValueKey("Current_UserType""")
 
               SetValueKey("Current_UserKind""")
 
               SetValueKey("LastUserLogin""")
 
           End If
 
       Catch ex As Exception
            MsgBox
(ex.ToString)

 
       End Try
 
   End Sub

#End Region

End Module 
الكود مشروح , اسم المجلد الذي سننشئه (MyApplication_Kyes) سيكون تحت العقدة (CurrentUser)
يحتوي المجلد على عدة حقول كما في الكود السابق يمكنك الزيادة عليها و حذف بعضها .
الدالة (CreateKeyes) هي المسؤولة عن انشاء الحقول و سنسنتخدما مع اي شاشة يبدأ بها البرنامج (هذا يعود لنمط تصميمك للبرنامج), مثل الشاشة الافتتاحية او شاشة البرنامج الرئيسية (Mdi Form).
-----------------------------------------
بعد ذلك سيكون لدينا نموذج خاص باسناد معلومات لهذه الحقول.
تصميم الواجهة سيكون مثل الصورة التالية.



النموذج يتالف من قسمين , الاول خاص باعدادت النظام , وهو يستقي معلوماته من حقول الرجستري السابقة, و يمكن الادخال فيه بشكل يدوي لاسم السيرفر و القاعدة و طريقة الدخول و اسم و كلمة المرور للمستخدم.
القسم الثاني :بيانات السيرفر من الجهاز وهو يقوم بجلب اسم السيرفر و اسم القاعدة عبر الزر(جلب) ثم يقوم باسناد المعلومات عبر الزر (اسناد).
الزر حفظ الاعدادات يقوم بتشكيل نص الاتصال و تخزين كافة المعلومات في حقول الرجستري.
-----------------------------------
الكود الخاص بالنموذج.
PHP كود :
Imports Microsoft.SqlServer.Management.Common
Imports Microsoft
.SqlServer.Management.Smo

Public Class Fr_Setting

    Private Sub Rd_WindowsAuth_CheckedChanged
(sender As ObjectAs EventArgsHandles Rd_WindowsAuth.CheckedChanged
        If Rd_WindowsAuth
.Checked True Then
            Txt_UserName
.ReadOnly True
            Txt_UserPwd
.ReadOnly True
        End 
If
 
   End Sub

    Private Sub Rd_SqlAuth_CheckedChanged
(sender As ObjectAs EventArgsHandles Rd_SqlAuth.CheckedChanged
        If Rd_SqlAuth
.Checked True Then
            Txt_UserName
.ReadOnly False
            Txt_UserPwd
.ReadOnly False
        End 
If

 
   End Sub

    Private Sub Fr_Setting_Load
(sender As ObjectAs EventArgsHandles MyBase.Load
        GetAllSettings
()
 
   End Sub
    Private Sub GetAllSettings
()
 
       If Not (Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyNameIs NothingThen
            Txt_ServerName
.Text = If(GetValueKey("ServerName") <> String.Empty, GetValueKey("ServerName"), String.Empty)
 
           Txt_DatabaseName.Text = If(GetValueKey("DataBaseName") <> String.Empty, GetValueKey("DataBaseName"), String.Empty)
 
           '
            Dim Mode As String = GetValueKey("Authentication_Mode")
            If Mode = "Windows Authentication" Then
                Rd_WindowsAuth.Checked = True
            ElseIf Mode = "SQL Server Authentication" Then
                Rd_SqlAuth.Checked = True
            Else
                Rd_WindowsAuth.Checked = True
            End If

            Txt_UserName.Text = If(GetValueKey("Server_UserName") <> String.Empty, GetValueKey("Server_UserName"), String.Empty)
            Txt_UserPwd.Text = If(GetValueKey("Server_Password") <> String.Empty, GetValueKey("Server_Password"), String.Empty)
            TXt_ConnectionString.Text = If(GetValueKey("UserConnectionString") <> String.Empty, GetValueKey("UserConnectionString"), String.Empty)

        End If

    End Sub

    Private Sub Save_Settings()
        If String.IsNullOrEmpty(Txt_ServerName.Text) Or String.IsNullOrEmpty(Txt_DatabaseName.Text) Then
            MessageBox.Show("لا يتوفر سيرفر او قاعدة بالاسماء المطلوبة", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Exit Sub
        End If

        Try
            If Not (Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyName) Is Nothing) Then
                TXt_ConnectionString.Clear()
                SetValueKey("ServerName", Txt_ServerName.Text)
                SetValueKey("DataBaseName", Txt_DatabaseName.Text)
                '
 
               If Rd_WindowsAuth.Checked True Then
                    Txt_UserName
.Clear()
 
                   Txt_UserPwd.Clear()
 
                   '
                    SetValueKey("Authentication_Mode", "Windows Authentication")
                    CreateConnection(Txt_ServerName.Text, Txt_DatabaseName.Text)
                    SetValueKey("UserConnectionString", TXt_ConnectionString.Text)
                    SetValueKey("Server_UserName", String.Empty)
                    SetValueKey("Server_Password", String.Empty)
                    MessageBox.Show("تم الحفظ", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Information)

                ElseIf Rd_SqlAuth.Checked = True Then
                    SetValueKey("Authentication_Mode", "SQL Server Authentication")
                    CreateConnection(Txt_ServerName.Text, Txt_DatabaseName.Text, Txt_UserName.Text, Txt_UserPwd.Text)
                    SetValueKey("UserConnectionString", TXt_ConnectionString.Text)
                    SetValueKey("Server_UserName", Txt_UserName.Text)
                    SetValueKey("Server_Password", Txt_UserPwd.Text)
                    MessageBox.Show("تم الحفظ", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            End If

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

    End Sub

    Private Sub Btn_Save_Click(sender As Object, e As EventArgs) Handles Btn_Save.Click
        Save_Settings()
    End Sub


    Private Function CreateConnection(ByVal ServerName As String, ByVal DataBaseName As String, Optional ByVal UserNmae As String = Nothing, Optional ByVal Password As String = Nothing) As String
        If UserNmae = Nothing Or Password = Nothing Then
            Dim Windows_Connection As String = "Data Source = " & ServerName & ";Initial Catalog=" & DataBaseName & ";Integrated Security=True"
            TXt_ConnectionString.Text = Windows_Connection
            Return Windows_Connection
        Else
            Dim Sql_Connection As String = "Data Source = " & ServerName & ";Initial Catalog=" & DataBaseName & ";User ID=" & UserNmae & ";Password=" & Password
            TXt_ConnectionString.Text = Sql_Connection
            Return Sql_Connection
        End If
    End Function

    Private Sub Btn_Close_Click(sender As Object, e As EventArgs) Handles Btn_Close.Click
        Close()
    End Sub


#Region "Server Setting"
    Dim conn As New ServerConnection()
    Dim srv As New Server()

    '
جلب قائمة السيرفرات
    Private Sub GetServerList
()

 
       Dim Server As String String.Empty
 
       Dim instance As Sql.SqlDataSourceEnumerator Sql.SqlDataSourceEnumerator.Instance
        Dim table 
As System.Data.DataTable instance.GetDataSources()

 
       For Each row As System.Data.DataRow In table.Rows
            Server 
String.Empty
 
           Server row("ServerName")
 
           If row("InstanceName").ToString.Length 0 Then
                Server 
Server "\" & row("InstanceName")
            End If
            LstSrv.Items.Add(Server)
        Next
        LstSrv.SelectedIndex = LstSrv.FindStringExact(Environment.MachineName)
    End Sub

    ''' <summary>
    ''' تحميل القواعد باستثناء قواعد النظام
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub LoadDbs()
        Me.Cursor = Cursors.WaitCursor
        GetServerList()
        '
        If LstSrv.Items.Count > 0 Then
            LstSrv.SelectedIndex = 0
            conn = New ServerConnection(LstSrv.SelectedItem.ToString)
            srv = New Server(conn)
        End If
        'تحميل القاعدة المطلوبة فقط
        'بامكانك تحميل كل القواعد بعد ازالة الشرط
        Try
            '=================
            LstDbs.Items.Clear()
            For Each db As Database In srv.Databases
                If Not db.IsSystemObject And db.Name = "
familycareDB" Then
                    LstDbs.Items.Add(db.Name)
                End If
            Next
            '
            If LstDbs.Items.Count > 0 Then
                LstDbs.SelectedIndex = LstDbs.FindStringExact("
familycareDB")
            End If
            '
        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

    'جلب بيانات السيرفر و القاعدة من الجهاز
    Private Sub Btn_GetInfo_Click(sender As Object, e As EventArgs) Handles Btn_GetInfo.Click
        LoadDbs()
    End Sub

    'اسناد المعلومات بعد جلبها
    Private Sub Btn_LoadInfo_Click(sender As Object, e As EventArgs) Handles Btn_LoadInfo.Click
        If Not String.IsNullOrEmpty(LstSrv.Text) Then
            Txt_ServerName.Text = LstSrv.Text
        End If
        If Not String.IsNullOrEmpty(LstDbs.Text) Then
            Txt_DatabaseName.Text = LstDbs.Text
        End If

    End Sub

#End Region

End Class 
في الكود السابق انا ابحث عن قاعدة باسم (familycareDB) , قم بتغييرها لاسم القاعدة الخاصة بك , او عدل الشرط الخاص بجلب القواعد ليجلب لك كل القواعد و بعدها عين القاعدة كما تريد (يوجد شرح في الكود).
-----------------------------------------------------------------
لا تنسى استيراد المراجع (ManageMent.Common,ManageMent.Smo)
-------------------------------------------------------------
بعد ان اصبحت المعلومات مخزنة في حقول عامة في الرجستري , كيف يمكنني التعامل معها ؟؟؟

بكل بساطة و كما اعتدت في تعريف نص الاتصال ....
PHP كود :
       Public Shared SqlCon As SqlConnection
        Private ConnectionString 
As String GetValueKey("UserConnectionString"
PHP كود :
       Public Sub New()
 
           If Not String.IsNullOrEmpty(ConnectionStringThen
                SqlCon 
= New SqlConnection(ConnectionString)
 
           Else
                MessageBox
.Show("نص الاتصال بالسيرفر مفقود""تنبيه"MessageBoxButtons.OKMessageBoxIcon.Information)
 
               OpenSetting()
 
           End If
 
       End Sub 

PHP كود :
       Private Sub OpenSetting()
 
           Dim Fr_Setting As New Fr_Setting
            With Fr_Setting
                
.Owner Frm_Main
                
.StartPosition FormStartPosition.CenterScreen
                
.ShowDialog()
 
               SqlCon = New SqlConnection(GetValueKey("UserConnectionString"))
 
           End With

        End Sub 
يمكنك الاستفادة من المشروع و التوسع فيه كما تحب فقط فهم الفكرة يكفي لتنطلق به في اي اتجاه و حسب حاجتك.
طريقة فحص التغييرات التي تطرأ على نص الاتصال و كيفية استدعاء المعالج السابق كما قلت سابقاً تعتمد كلياً على طريقة التصميم و البرمجة الخاصة بك.
بالنسبة لعملية اسناد معلومات لباقي الحقول , هذا يتوقف عليك فاي حقل تريد ان تسند له قيمة ما عليك الا مناداة الدالة (SetValueKey) , و عملية الحصول عل القيمة بداخلها يتم وفق الدالة (GetValueKey).

المشروع لم يخضع للتجريب المثالي نظراً لضيق الوقت , ولكن كتجربة اولى هو يعمل بشكل جيد.

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

(25-05-18, 02:04 AM)ابو ليلى كتب :

ا
-----------------------------------
الكود الخاص بالنموذج.
PHP كود :
   
    Private Sub Fr_Setting_Load
(sender As ObjectAs EventArgsHandles MyBase.Load
        GetAllSettings
()
 
   End Sub
    Private Sub GetAllSettings
()
 
       If Not (Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyNameIs NothingThen
            Txt_ServerName
.Text = If(GetValueKey("ServerName") <> String.Empty, GetValueKey("ServerName"), String.Empty)
 
           Txt_DatabaseName.Text = If(GetValueKey("DataBaseName") <> String.Empty, GetValueKey("DataBaseName"), String.Empty)
 
           '
            Dim Mode As String = GetValueKey("Authentication_Mode")
            If Mode = "Windows Authentication" Then
                Rd_WindowsAuth.Checked = True
            ElseIf Mode = "SQL Server Authentication" Then
                Rd_SqlAuth.Checked = True
            Else
                Rd_WindowsAuth.Checked = True
            End If

            Txt_UserName.Text = If(GetValueKey("Server_UserName") <> String.Empty, GetValueKey("Server_UserName"), String.Empty)
            Txt_UserPwd.Text = If(GetValueKey("Server_Password") <> String.Empty, GetValueKey("Server_Password"), String.Empty)
            TXt_ConnectionString.Text = If(GetValueKey("UserConnectionString") <> String.Empty, GetValueKey("UserConnectionString"), String.Empty)

        End If

    End Sub 
 المعذرة هذا الكود لا يعمل عند تشغيل الفورم
الرد }}}
تم الشكر بواسطة:
#9
If Not (Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyName) Is Nothing) Then
عند التطبيق يصل الى هذا الكود ويقول الشرط غير محقق ويخرج ولا يتم الحفظ
الرد }}}
تم الشكر بواسطة:
#10
السلام عليكم و رحمة الله و بركاته
لنتابع الكود مع بعض
دالة التحميل الرئيسة في النموذج الاب

PHP كود :
   Private Sub Frm_Main_Load(sender As ObjectAs EventArgsHandles MyBase.Load
        CreateKeyes
()
 
       Disable_Items()
 
       Ts_Login_Click(sendere)
 
   End Sub 
يتم استدعاء دالة انشاء مفاتيح في مسجل النظام و هي موجودة في الكلاس الخدمي Ml_ServerSetting.vb
وهي كما يلي:
PHP كود :
   Public Sub CreateKeyes()

 
       If Registry.CurrentUser.OpenSubKey(MainKeyNameIs Nothing Then
            Dim ApplicationSetting 
As RegistryKey Registry.CurrentUser.CreateSubKey(MainKeyName)
 
           ConnectionStr ApplicationSetting.CreateSubKey("UserConnectionString"'حقل لنص الاتصال
            ConnectionStr = ApplicationSetting.CreateSubKey("ServerName") '
حقل لاسم السيرفر
            ConnectionStr 
ApplicationSetting.CreateSubKey("DataBaseName"'حقل لقاعدة البيانات
            ConnectionStr = ApplicationSetting.CreateSubKey("Authentication_Mode") '
حقل طريقة الدخول
            ConnectionStr 
ApplicationSetting.CreateSubKey("Server_UserName"'حقل لاسم مستخدم السيرفر
            ConnectionStr = ApplicationSetting.CreateSubKey("Server_Password") '
حقل كلمة المرور للسيرفر
            ConnectionStr 
ApplicationSetting.CreateSubKey("CurrentApp_User"'حقل المستخدم الحالي
            ConnectionStr = ApplicationSetting.CreateSubKey("Current_UserKind") '
حقل لنوع المستخدم
            ConnectionStr 
ApplicationSetting.CreateSubKey("LastUserLogin"'حقل اخر مستخدم ولج للبرنامج

            DefaultSetting()
        End If
    End Sub 

الدالة تنشئ مفاتيح في مسار محدد داخل العقدة Current_User و ضمن مجلد محدد نستمد اسمه من المتغير MainKeyName
و هو معرف في اعلى الكلاس كما يلي 
PHP كود :
   Public ReadOnly MainKeyName As String "MyApplication_Keys" 
هذا يعني اننا سنشئ مجلد بالاسم  MyApplication_Keys و داخله ستكون المفاتيح مع قيمها الافتراضية المرسلة في الدالة التالية
PHP كود :
   Private Sub DefaultSetting()
 
       Try
            If Not IsNothing
(Registry.CurrentUser.OpenSubKey(MainKeyName)) Then

                SetValueKey
("UserConnectionString""")
 
               SetValueKey("ServerName""")
 
               SetValueKey("DataBaseName""")
 
               SetValueKey("Authentication_Mode""")
 
               SetValueKey("Server_UserName""")
 
               SetValueKey("Server_Password""")
 
               SetValueKey("CurrentApp_User""")
 
               SetValueKey("Current_UserKind""")
 
               SetValueKey("LastUserLogin""")
 
           End If
 
       Catch ex As Exception
            MsgBox
(ex.ToString)

 
       End Try
 
   End Sub 
بعدها سياتي دور الدالة Disable_Items 

وهي لتعطيل قوائم النموذج فقط.
بعدها يتم النداء على نموذج الدخول ليفتح و اول دالة فيه يتم المناداة على تحميل جدول المستخدمين .
PHP كود :
       Cmb_UserName.DataSource Bl_Login.User_GetAll 
وهي تاتي من الكلاس الخاص بالمستخدمين , و بداخل هذا الكلاس دوال تستمد كائنات الاتصال و ما يتعلق بالسيرفر من كلاس طبقة الاتصال 
لنلقي نظرة.
هذه دالة جلب المستخدمين من كلاس المستخدمين
PHP كود :
       Public Function User_GetAll() As DataTable
            Dim Dal 
As Dal.DataAccessLayer = New Dal.DataAccessLayer
            If Dal
.GetConnectionString IsNot Nothing Then
                Dim Dt 
As New DataTable
                Dt 
Dal.SelectData("User_GetAll"Nothing)
 
               Return Dt
            End 
If
 
           Return Nothing
        End 
Function 

كما نرى يتم النداء على كائن الاتصال من كلاس DataAccessLayer    ننتقل الى هذا الكلاس و ندقق
PHP كود :
   Public Class DataAccessLayer
        Public Shared SqlCon 
As SqlConnection
        Private ConnectionString 
As String GetValueKey("UserConnectionString")



 
       Public Sub New()
 
           If Not String.IsNullOrEmpty(ConnectionStringThen
                SqlCon 
= New SqlConnection(ConnectionString)
 
           Else
                MessageBox
.Show("نص الاتصال بالسيرفر مفقود""تنبيه"MessageBoxButtons.OKMessageBoxIcon.Information)
 
               OpenSetting()
 
           End If
 
       End Sub

        Public ReadOnly Property GetConnectionString
() As String
            Get
                If String
.IsNullOrEmpty(ConnectionStringThen
                    Return Nothing
                Else
                    Return ConnectionString
                End 
If
 
           End Get
        End Property 

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

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

اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال
الرد }}}
تم الشكر بواسطة: عبد العزيز البسكري , ytohamy


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  انشاء قاعدة بيانات اكسس بالكود Kamil 0 178 17-02-24, 10:43 PM
آخر رد: Kamil
  طريقة سهلة للاتصال بقاعدة بيانات SQL مع اضافة ايقونات للتحكم في تدفق البيانات ggtt17121985 0 541 06-11-23, 10:16 AM
آخر رد: ggtt17121985
  مشروع تعدد لغات للبرنامج من قاعدة بيانات MsAccess asemshahen5 6 3,651 18-05-23, 03:39 AM
آخر رد: mohamed gida
Lightbulb عمل Attach و Detach و Backup و Restore لقاعدة بيانات MS Sql Server asemshahen5 19 8,866 19-03-23, 09:01 PM
آخر رد: atefkhalf2004
Photo [VB.NET] أحتاج مساعدتكم لطباعة بيانات الفورم في كرستال ربورت Sidiki 1 637 25-02-23, 08:36 PM
آخر رد: Taha Okla
Lightbulb خطوة خطوة بالكود كورس كامل للربط بين فيجوال بيسك دوت نت مع قاعدة بيانات MYSQL ggtt17121985 0 1,003 06-01-23, 09:04 AM
آخر رد: ggtt17121985
Rainbow [مشروع] محول بيانات الانترنت محمد مسافر 0 704 14-11-22, 02:52 AM
آخر رد: محمد مسافر
Video [مشروع] لعبة إختبر معلوماتك [أسئلة عشوائية]+[قاعدة بيانات xml] + [تأثيرات صوتية] عبدالله الدوسري 12 18,081 30-10-22, 05:52 PM
آخر رد: ibra9009
  برنامج لإدارة قواعد بيانات SQL Server ggtt17121985 0 1,169 17-10-22, 06:16 PM
آخر رد: ggtt17121985
  الاتصال بقاعدة بيانات SQL بدون تنصيب البرنامج كامل ملهمـ 0 1,335 23-09-22, 12:28 AM
آخر رد: ملهمـ

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


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم