كلام جميل اخي خضر و هذه الهندسة هي اللبنة الاساسية في بناء برامج كبيرة
نحن نستخدم هذه التقنية لبناء البرامج التجارية في اغلب الاحيان
انا عن نفسي لا احب استخدام اي جزء يختص بالتعامل مع البيانات في واجهة البرنامج , كله يكون في قاعدة البيانات
اما من ناحية البرنامج فلا احتاج الا بناء الكلاسات الخاصة للتخاطب مع القاعدة و من ثم واجهة المستخدم التي تتخاطب مع الكلاسات السابقة
هكذا تكون قد فصلت كل شيئ لوحده
يوجد من الكلام الكثير الكثير عن هذه التقنية ربما في قادم الايام ان شاء الله ستكون لي وقفة مفصلة و يا ريت بالتعاون مع شخصكم و باقي الاعضاء للخروج بمرجع جيد عنها
تحياتي لك
بسم الله الرحمن الرحيم
استكمالا لما سبق ساضع مثال تجريب على الكلاس الذي انشأناه سابقا للتجريب
اولا سانشئ قاعدة بيانات بسيطة على السيرفر مؤلفة من 3 جداول
جدول الزبائن
جدول الطلبيات او الفواتير
جدول تفاصيل الفاتورة او المواد
و ساضع السكربت الخاص بها اسفل الموضوع
اردت استخدام الكلاس السابق مباشرة في عملية التحديث على القاعدة , على كل الجداول السابقة
و ساعمل نموذج في واجهة اللغة كما يلي
سنستورد الكلاس السابق الذي اصبح مكتبة الى مراجعنا و نتعامل معه كما ساعرف بعض الكائنات للتعامل الجداول السابقة كما يلي
انا عدلت على الكلاس السابق في جزئية جلب السيرفرات فقط حيث لم تعمل معي في الوندوز 10 مع انها مازالت تعمل في وندوز 7
على اي حال انا ساضع الكلاس مرفق مع المثال
الكود التالي في حدث تحميل النموذج و هو مشروح بالكامل
و الكود التالي في زر الحفظ
فقط هذا كل ما احتجناه لعمليات الحفظ مهما كانت العمليات التي تمت على الجداول
انا اضفت حدثين اضافيين لتعرف ما الذي حصل اثناء عملية الحفظ و تحديدا لجدول تفاصيل الفاتورة فقط
و هذا تجريب من واجهة الادخال
و اخيرا المثال مرفق مع سكربت القاعدة لمن يحب ان يجرب
الجزئية التي تم تعديلها في الكلاس السابق
نحن نستخدم هذه التقنية لبناء البرامج التجارية في اغلب الاحيان
انا عن نفسي لا احب استخدام اي جزء يختص بالتعامل مع البيانات في واجهة البرنامج , كله يكون في قاعدة البيانات
اما من ناحية البرنامج فلا احتاج الا بناء الكلاسات الخاصة للتخاطب مع القاعدة و من ثم واجهة المستخدم التي تتخاطب مع الكلاسات السابقة
هكذا تكون قد فصلت كل شيئ لوحده
يوجد من الكلام الكثير الكثير عن هذه التقنية ربما في قادم الايام ان شاء الله ستكون لي وقفة مفصلة و يا ريت بالتعاون مع شخصكم و باقي الاعضاء للخروج بمرجع جيد عنها
تحياتي لك
بسم الله الرحمن الرحيم
استكمالا لما سبق ساضع مثال تجريب على الكلاس الذي انشأناه سابقا للتجريب
اولا سانشئ قاعدة بيانات بسيطة على السيرفر مؤلفة من 3 جداول
جدول الزبائن
جدول الطلبيات او الفواتير
جدول تفاصيل الفاتورة او المواد
و ساضع السكربت الخاص بها اسفل الموضوع
اردت استخدام الكلاس السابق مباشرة في عملية التحديث على القاعدة , على كل الجداول السابقة
و ساعمل نموذج في واجهة اللغة كما يلي
سنستورد الكلاس السابق الذي اصبح مكتبة الى مراجعنا و نتعامل معه كما ساعرف بعض الكائنات للتعامل الجداول السابقة كما يلي
PHP كود :
Imports System.Data.SqlClient
Imports SQLDBConnect
Public Class Clients
Dim da1, da2, da3 As SqlClient.SqlDataAdapter
Dim ds As New DataSet
Dim d1, d2, d3 As New DbConect
انا عدلت على الكلاس السابق في جزئية جلب السيرفرات فقط حيث لم تعمل معي في الوندوز 10 مع انها مازالت تعمل في وندوز 7
على اي حال انا ساضع الكلاس مرفق مع المثال
الكود التالي في حدث تحميل النموذج و هو مشروح بالكامل
PHP كود :
Private Sub Clients_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'تعين الاتصال الى القاعدة
DbConect.SetConnectionString_ForDb("ClientDb")
'فتح الاتصال
DbConect.OpenSqlConnection()
'تحديد اسماء الجداول التي نريد التعامل معها
d1.TableName = "ClientsTb"
d2.TableName = "OrdersTb"
d3.TableName = "GoodsTb"
'هنا انا اخترن جميع الحقول
Dim fild() As String = {"*"}
'تفريغ الداتاسيت
ds.Clear()
'----------------------------------
'Adapter انشاء كائنات
'و ربطها مع الجداول السابقة
da1 = New SqlClient.SqlDataAdapter
da1 = d1.Creat_Adapter(fild)
'------------
da2 = New SqlClient.SqlDataAdapter
da2 = d2.Creat_Adapter(fild)
'------------------------
da3 = New SqlClient.SqlDataAdapter
da3 = d3.Creat_Adapter(fild)
'ملئ الداتاسيت ببيانات الجداول
da1.Fill(ds, d1.TableName)
da2.Fill(ds, d2.TableName)
da3.Fill(ds, d3.TableName)
ds.AcceptChanges()
'انشاء علاقات بين الجداول
'----------------------------.زبائن و طلبيات-------------------------------------
Dim col1 As DataColumn = ds.Tables(d1.TableName).Columns("Cl_Id") 'جدول الزبائن
Dim col2 As DataColumn = ds.Tables(d2.TableName).Columns("Cl_Id") 'جدول الطلبيات
Dim re As New DataRelation("Clt_Ord", col1, col2)
ds.Relations.Add(re)
''----------------------------طلبيات و مواد---------------------------------------
Dim col4 As DataColumn = ds.Tables(d2.TableName).Columns("Ord_Id") 'جدول الطلبيات
Dim col5 As DataColumn = ds.Tables(d3.TableName).Columns("Ord_Id") 'جدول المواد
Dim re3 As New DataRelation("Ord_Gods", col4, col5)
ds.Relations.Add(re3)
'BindingSource ربط كائنات
'بمصدر بيانات
bn1.DataSource = ds.Tables(d1.TableName)
bn2.DataSource = bn1
bn2.DataMember = "Clt_Ord"
bn3.DataSource = bn2
bn3.DataMember = "Ord_Gods"
'DataGrids و كذلك ربط
Dg1.DataSource = bn1
dg2.DataSource = bn2
dg3.DataSource = bn3
'اغلاق الاتصال
DbConect.CloseSqlConnection()
'عرض اسم السيرفر و حالة الاتصال و جملة الاتصال اسفل النموذج
ST1.Items(0).Text = DbConect.GetSQlConnectionString & " | "
ST1.Items(2).Text = DbConect.GetSrvName
ST1.Items(1).Text = DbConect.GetConnectionState & " | "
End Sub
و الكود التالي في زر الحفظ
PHP كود :
'اجراء الحفظ
Private Sub SaveBtn_Click(sender As Object, e As EventArgs) Handles SaveBtn.Click
Me.Validate()
bn1.EndEdit()
bn2.EndEdit()
bn3.EndEdit()
Dim SaveDataSet As New DataSet
SaveDataSet = ds.Clone
If ds.HasChanges = True Then
SaveDataSet = ds.GetChanges(DataRowState.Added Or DataRowState.Deleted Or DataRowState.Modified)
If (Not (SaveDataSet) Is Nothing) Then
'*******هذه الاحداث لعرض العمليات و لا دخل لها بعملية الحفظ قم بازالتها
AddHandler da3.RowUpdating, AddressOf OnRowUpdating
AddHandler da3.RowUpdated, AddressOf OnRowUpdated
'*******
da1.Update(SaveDataSet, d1.TableName)
da2.Update(SaveDataSet, d2.TableName)
da3.Update(SaveDataSet, d3.TableName)
'********
RemoveHandler da3.RowUpdating, AddressOf OnRowUpdating
RemoveHandler da3.RowUpdated, AddressOf OnRowUpdated
'********
ds.Merge(SaveDataSet)
ds.AcceptChanges()
End If
End If
End Sub
فقط هذا كل ما احتجناه لعمليات الحفظ مهما كانت العمليات التي تمت على الجداول
انا اضفت حدثين اضافيين لتعرف ما الذي حصل اثناء عملية الحفظ و تحديدا لجدول تفاصيل الفاتورة فقط
PHP كود :
Private Sub OnRowUpdating(sender As Object, e As SqlRowUpdatingEventArgs)
PrintEventArgs(e)
End Sub
Private Sub OnRowUpdated(sender As Object, e As SqlRowUpdatedEventArgs)
PrintEventArgs(e)
End Sub
Private Overloads Sub PrintEventArgs(args As SqlRowUpdatingEventArgs)
TextBox1.Text += Environment.NewLine & ("OnRowUpdating")
TextBox1.Text += Environment.NewLine & (" event args: (" & " command=" & args.Command.CommandText &
" commandType=" & args.StatementType & " status=" & args.Status & ")")
End Sub
Private Overloads Sub PrintEventArgs(args As SqlRowUpdatedEventArgs)
TextBox1.Text += Environment.NewLine & ("OnRowUpdated")
TextBox1.Text += Environment.NewLine & (" event args: (" & " command=" & args.Command.CommandText &
" commandType=" & args.StatementType & " recordsAffected=" &
args.RecordsAffected & " status=" & args.Status & ")")
End Sub
و هذا تجريب من واجهة الادخال
و اخيرا المثال مرفق مع سكربت القاعدة لمن يحب ان يجرب
الجزئية التي تم تعديلها في الكلاس السابق
PHP كود :
Private Shared Sub GetServerList()
Dim Server As String = String.Empty
Dim instance As Sql.SqlDataSourceEnumerator = Sql.SqlDataSourceEnumerator.Instance
Dim table As System.Data.DataTable = instance.GetDataSources()
Dim Machine As String = String.Empty
For p As Integer = 0 To table.Rows.Count - 1
Server = String.Empty
Server = table.Rows(p).Item("ServerName")
If table.Rows(p).Item("ServerName").ToString.Length > 0 Then
If table.Rows(p).Item("ServerName") = Machine Then
Machine = (System.Environment.MachineName)
Server = table.Rows(p).Item("ServerName")
ReDim SrvNameArray(table.Rows.Count - 1)
SrvNameArray.SetValue(Server, p)
Else
Machine = (System.Environment.MachineName + "\" + table.Rows(p).Item("ServerName"))
ReDim SrvNameArray(table.Rows.Count - 1)
SrvNameArray.SetValue(Server, p)
End If
MsgBox(SrvNameArray.Count)
End If
Next
End Sub
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال


