اسناد بينات الاتصال برمجياً عبر المعالج - نص الاتصال-السيرفر-القاعدة-بيانات اخرى - ابو ليلى - 25-05-18
السلام عليكم و رحمة الله و بركاته
رمضان مبارك على الجميع - و اعاده الله عليكم جميعاً بالخير و البركة
الموضوع يتحدث عن كيفية عمل معالج بسيط يقوم بعمل نص الاتصال برمجبا و اضافته الى مسجل النظام (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 String, ByVal Value As String) If Not (Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyName) Is Nothing) Then Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyName, True).OpenSubKey(KeyNmae, True).SetValue(KeyNmae, Value) 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 Object, e As EventArgs) Handles 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 Object, e As EventArgs) Handles 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 Object, e As EventArgs) Handles MyBase.Load GetAllSettings() End Sub Private Sub GetAllSettings() If Not (Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyName) Is Nothing) Then 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(ConnectionString) Then SqlCon = New SqlConnection(ConnectionString) Else MessageBox.Show("نص الاتصال بالسيرفر مفقود", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.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).
المشروع لم يخضع للتجريب المثالي نظراً لضيق الوقت , ولكن كتجربة اولى هو يعمل بشكل جيد.
بالتوفيق للجميع.
RE: اسناد بينات الاتصال برمجياً عبر المعالج - نص الاتصال-السيرفر-القاعدة-بيانات اخرى - atefkhalf2004 - 26-05-18
حضرتك لك كل الشكر
انا الشخص الذي طلب هذا الموضوع
لكن حضرتك طرحت الموضوع بطريقة كبيرة علينا قوي
المطلوب هو حضرتك شاشة في بداية التحميل يكون فيها 3 مربعات نصوص
الاول اسم السرفر
الثاني اسم قاعدة البيانات ويمكن البحث عنها dialouge
الثالث لو هناك كلمة مرور لقاعدة البيانات
ويتم حفظهم في مكان وليكن ملف نصي او الريجستري
يتم استخدامهم عند الدخول
ويمكن تعديل هذه البيانات فيما بعد
ولك جزيل الشكر
وللعلم انا اطرح اسئلة تدور في ذهن الكثير
وانتم لها واكبر منها وسوف تجيبون عليها
وربنا يخليكم لنا
RE: اسناد بينات الاتصال برمجياً عبر المعالج - نص الاتصال-السيرفر-القاعدة-بيانات اخرى - ابو ليلى - 27-05-18
(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) و اجهة العرض و ما يتعلق بها.
-----------------------------------------
تم تقسيم المشروع الى طبقات في كل مجلد طبقة او اكثر حسب الحاجة .
----------------------------------------
المثال يطبق كل الافكار السابقة , فقط اطلع عليه و جرب ما تم الحديث عنه سابقاً.
--------------------------------------
طبيعة العمل تقتضي ان نقوم بزرع القاعدة لدى العميل اولاً , ثم يتم تنصيب البرنامج و تشغيله , ليتم ادخال الاعدادات للمرة الاولى فقط.
--------------------------------------
بالتوفيق.
RE: اسناد بينات الاتصال برمجياً عبر المعالج - نص الاتصال-السيرفر-القاعدة-بيانات اخرى - atefkhalf2004 - 27-05-18
واحد مش عارف ما الغضنفر
فسال شخص ما هو الغضنفرر
فرد عليه الاخر ليث
قال له لما انا مش عارف الغضنفر ااعرف الليث ؟؟؟؟
RE: اسناد بينات الاتصال برمجياً عبر المعالج - نص الاتصال-السيرفر-القاعدة-بيانات اخرى - fareglarkt - 27-06-18
السلام عليكم
من اهم المشاكل واكثرها شيوعا لذا المبرمجين المبتدئيين - مثل حالي - هي ببساطة :
- نقل البرنامج الي كمبيوتر اخر "عميل"
طبعا يختلف اسم الكمبيوتر وكلمة دخول السيرفر عن الجهاز الخاص بالمبرمج لذا تقع المشكلة ولا يستطيع نشر برنامجه.
اغلب الحلول الموجودة غير واضحة ولا تفيد في الغالب الشخص المبتدئ بسبب تعقيدها.
الحل هو بتوفير برنامج يقوم بالاتي
1-نسخ السيرفر وبيانات دخوله في ملف قابل للاسترداد.
2-تنصيب سيرفر بالمعلومات المدخلة او المستوردة من قبل الشخص
3-ادراج قاعدة البيانات ورفعها للسيرفر.
ويقوم المبرمج بتشغيله على جهاز العميل لمرة واحدة قبل البدء في تنصيب برنامجه الاصلي
---------------
موضوع ابوليلي في صلب المشكلة ومتوقع انه يحل هالمشكلة حسب مافهمت. بس طريقة عرضه متقدمة وغير واضحة, جاري دراسة المشروع ومشكور اخي ابو ليلى
تحياتي
RE: اسناد بينات الاتصال برمجياً عبر المعالج - نص الاتصال-السيرفر-القاعدة-بيانات اخرى - atefkhalf2004 - 30-06-18
يا ريت
اح يضع ثال بسيط
سكول 2008
فيجوال 2008
RE: اسناد بينات الاتصال برمجياً عبر المعالج - نص الاتصال-السيرفر-القاعدة-بيانات اخرى - غياث - 08-08-18
إخواني الكرام وجدت هذا الحل أتمنى أن يفيدكم http://vb4arb.com/vb/showthread.php?tid=2358
RE: اسناد بينات الاتصال برمجياً عبر المعالج - نص الاتصال-السيرفر-القاعدة-بيانات اخرى - ham2014dy@gmail.com - 20-06-20
(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 String, ByVal Value As String) If Not (Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyName) Is Nothing) Then Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyName, True).OpenSubKey(KeyNmae, True).SetValue(KeyNmae, Value) 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 Object, e As EventArgs) Handles 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 Object, e As EventArgs) Handles 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 Object, e As EventArgs) Handles MyBase.Load GetAllSettings() End Sub Private Sub GetAllSettings() If Not (Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyName) Is Nothing) Then 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(ConnectionString) Then SqlCon = New SqlConnection(ConnectionString) Else MessageBox.Show("نص الاتصال بالسيرفر مفقود", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.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 Object, e As EventArgs) Handles MyBase.Load GetAllSettings() End Sub Private Sub GetAllSettings() If Not (Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyName) Is Nothing) Then 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
المعذرة هذا الكود لا يعمل عند تشغيل الفورم
RE: اسناد بينات الاتصال برمجياً عبر المعالج - نص الاتصال-السيرفر-القاعدة-بيانات اخرى - ham2014dy@gmail.com - 20-06-20
If Not (Microsoft.Win32.Registry.CurrentUser.OpenSubKey(MainKeyName) Is Nothing) Then
عند التطبيق يصل الى هذا الكود ويقول الشرط غير محقق ويخرج ولا يتم الحفظ
RE: اسناد بينات الاتصال برمجياً عبر المعالج - نص الاتصال-السيرفر-القاعدة-بيانات اخرى - ابو ليلى - 22-06-20
السلام عليكم و رحمة الله و بركاته
لنتابع الكود مع بعض
دالة التحميل الرئيسة في النموذج الاب
PHP كود :
Private Sub Frm_Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load CreateKeyes() Disable_Items() Ts_Login_Click(sender, e) End Sub
يتم استدعاء دالة انشاء مفاتيح في مسجل النظام و هي موجودة في الكلاس الخدمي Ml_ServerSetting.vb
وهي كما يلي:
PHP كود :
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_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(ConnectionString) Then SqlCon = New SqlConnection(ConnectionString) Else MessageBox.Show("نص الاتصال بالسيرفر مفقود", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Information) OpenSetting() End If End Sub
Public ReadOnly Property GetConnectionString() As String Get If String.IsNullOrEmpty(ConnectionString) Then Return Nothing Else Return ConnectionString End If End Get End Property
كما نرى في بداية انشاء الكلاس يتم جلب قيمة نص الاتصال من المفتاح الخاص به في مسجل النظام
فاذا كان فارغاً و هو الحال الافتراضي في بداية اقلاع البرنامج سيتم المناداة على نموذج ضبط الاتصال عبر الدالة OpenSetting
و من هناك يجب ان نضبط السيرفر و القاعدة و نخزن نص الاتصال .
بعد ذلك لن نكون بحاجة اليه و سيتم قراءة نص الاتصال من المكان المطلوب.
صورة للمفاتيح المسجلة.
|