منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : مشروع التعامل مع قواعد البيانات من خلال الكلاسس
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2
السلام عليكم ورحمة الله

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

http://vb4arb.com/vb/showthread.php?tid=19925


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

وبعد ان يكتمل سوف يجربه كل منا على اي قاعدة بيانات يريد



لتحميل المشروع من هنا

PHP كود :
http://www.m5zn.com/d/?16875873 
(09-05-18, 11:40 PM)viv كتب : [ -> ]السلام عليكم ورحمة الله

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

http://vb4arb.com/vb/showthread.php?tid=19925


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

وبعد ان يكتمل سوف يجربه كل منا على اي قاعدة بيانات يريد



لتحميل المشروع من هنا

PHP كود :
http://www.m5zn.com/d/?16875873 

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

PHP كود :
 Dim row As DataGridViewRow = New DataGridViewRow
        Try
            TextBox1
.Text "Employy"
 
           TextBox2.Text "Id"
 
           row.CreateCells(DataGridView1)
 
           row.Cells(0).Value "id"
 
           row.Cells(1).Value "Integer"
 
           DataGridView1.Rows.Add(row)
 
           row = New DataGridViewRow
            row
.CreateCells(DataGridView1)
 
           row.Cells(0).Value "FirstName"
 
           row.Cells(1).Value "String"
 
           DataGridView1.Rows.Add(row)
 
           row = New DataGridViewRow
            row
.CreateCells(DataGridView1)
 
           row.Cells(0).Value "Age"
 
           row.Cells(1).Value "Date"
 
           DataGridView1.Rows.Add(row)
 
       Catch ex As Exception

        Finally
            row
.Dispose()
 
       End Try 

وايضا تغيير الكود الذي في حدث النقر كالتالي :

PHP كود :
Addtext("Public Class TB_" TextBox1.Text)
 
       Addtext("Inherits DbGo")
 
       Addtext(" ")

 
       For Each row As DataGridViewRow In DataGridView1.Rows
            If row
.Cells(0).Value <> "" Then
                Addtext
("Private " "_" row.Cells(0).Value " As " row.Cells(1).Value)
 
           End If
 
       Next

        Addtext
(" ")

 
       Addtext("Private ID_Key As String =""" TextBox2.Text """")
 
       Addtext("Private TableName As String =""" TextBox1.Text """")

 
       Addtext(" " vbCrLf)

 
       For Each row As DataGridViewRow In DataGridView1.Rows
            If row
.Cells(0).Value <> "" Then
                Addtext
("Public Property " TextBox1.Text "_" row.Cells(0).Value " As " row.Cells(1).Value)
 
               Addtext("Get"True)
 
               Addtext("  Return _" row.Cells(0).ValueTrue)
 
               Addtext("End Get"True)
 
               Addtext("Set(value As" row.Cells(1).Value ")"True)
 
               Addtext("  _" row.Cells(0).Value "= value"True)
 
               Addtext("End Set"True)
 
               Addtext("End Property")
 
               Addtext(" ")
 
           End If
 
       Next
        RichTextBox1
.AppendText("End Class")
 
       Panel1.Visible False 

واضافة الاجراء التالي :

PHP كود :
Private Sub Addtext(str As StringOptional tab As Boolean False)
 
       If tab True Then
            RichTextBox1
.AppendText(vbTab str vbCrLf)
 
       Else
            RichTextBox1
.AppendText(str vbCrLf)
 
       End If

 
   End Sub 

وهذا للاختصار والتقليل من الشوشرة

في الحدث للزر Sample يمكن اضافة الامر التالي

PHP كود :
DataGridView1.Rows.Clear() 
السلام عليكم و رحمة الله و بركاته
الاخ الكريم,
بما ان المثال لديك اعتمد على الجداول في مثالي السابق , فلن اتكلم كثيراً عنه.
لكن ما الفائدة من كتابة نمط ثابت اقصد طريقة انشاء Properitys عن طريقة كتابتها يدوياً في الكود البرمجي.
ليس من فائدة تذكر لانك تستطيع استخدام زر التاب مرتين و يقوم المحرر بانشاء الخصائص بسرعة لك او عن طريق المؤشر الذكي في المحرر.
ما يهمني صراحة هو استخدام الفئات المتقدمة في قلب اللغة لتقوم هي بانشاء الخصائص و الانواع و كل شيئ احتاجه عن طريق فئة قاعدية انا اقوم ببرمجتها و توريثها و هي تتكفل بباقي العمل  (Reflection) هي الحل لهذا الموضوع 
بطريقة بسيطة يمكنني اختصار الكثير مما سبق في مثالي وفق مثال ساقدم شرح بسيط عنه هنا.
من جهة اخرى يجب ان تمتلك طريقة لتقوم وحدها بالتعرف على الجدول و حقوله و انواع الحقول فيه و تقوم هي نفسها باجراء عمليات التحويل لتتطابق مع انواع اللغة و ما يقابلها  (اعرف انك تملك الطريقة) و انتظر منك ان تقوم بها بالشكل الاوسع في مثالك القادم.
ما رايته في المثال بسيط و هو بمثابة كتابة اسطر و نسخها الى الواجهة (لديك اكثر من ذلك) فقط افرج عنه  Dodgy
----------------------------------------------------------------------
بالنسبة للمثال الذي اقصده تابع معي هذه الكلاسات البسيطة و ستعرف ما اقصده عند دراسته.
مثلاً لدي برنامج لاحد الاخوة و هو يخص عمله (المثال هنا مختصر).
يتالف من 3 جداول (جدول تصنيفات-جدول محتوى - جدول حلقات او اجزاء)
البرنامج لهاوي مسلسلات و افلام بالمختصر

الجداول الثلاثة تنشئ عبر كلاسات بسيطة وفق ما يلي.
PHP كود :
Public Class tblCategory
    Public id 
As Integer
    Public CategoryName 
As String
End 
Class 
PHP كود :
Public Class tblSubVideo
    Public id 
As Integer
    Public SubVideo 
As String
    Public LinkVideo 
As String
    Public VideoId 
As Integer
End 
Class 
PHP كود :
Public Class tblVideo
    Public id 
As Integer
    Public VideoName 
As String
    Public CategoryId 
As Integer
End 
Class 
كما تلاحظ لم ادخل في اي نوع من الخصائص او غيرها مجرد حقول بسيطة.
الان ننتقل الى الفئة القاعدية المسؤولة عن العمل
PHP كود :
Imports System.Reflection
Public Class Cls_TableBase(Of Cls_TableBase)
 
   Public TableName As String
    Public Entry 
As String
    Public Table 
As DataTable

    Public Sub 
New()
 
       TableName GetType(Cls_TableBase).Name
        Entry 
TableName.Remove(03)
 
       TableFromFileds()
 
   End Sub




    Private 
Function TableFromFileds() As DataTable
        Dim Types
() As String = {"Int32""Int64""String""Object""DateTime""Date"}
 
       Table = New DataTable(GetType(Cls_TableBase).Name)

 
       Dim MyField As FieldInfo() = GetType(Cls_TableBase).GetFields()
 
       For i As Integer 0 To MyField.Length 1

            If Types
.Contains(MyField(i).FieldType.NameThen
                Dim Column 
As New DataColumn With {.ColumnName MyField(i).Name, .DataType MyField(i).FieldType}
 
               If Not Table.Columns.Contains(Column.ColumnNameThen
                    If MyField
(i).Name "id" And MyField(i).FieldType.Name "Int32" Then
                        With Column
                            
.AutoIncrement True
                            
.AutoIncrementSeed 1
                            
.AutoIncrementStep 1
                            
.AllowDBNull False
                        End With
                    End 
If
 
                   Table.Columns.Add(Column)
 
               End If

 
           End If
 
       Next i

        Return Table
    End 
Function 
اضف مديول (Module) كما بالشكل التالي , المديول ليس لها علاقة بعملنا و فكرتنا و لكن ليعمل معك المثال فقط

PHP كود :
Module ML_MyExten
    Dim Myds 
As New DataSet()
 
   Public Function GenrateDataset(Table As DataTable) As DataSet
        Myds
.Namespace = "AboLayla"
 
       If Not (Myds.Tables.Contains(Table.TableName)) Then
            Myds
.Tables.Add(Table)
 
       End If
 
       Return Myds
    End 
Function


 
   <Runtime.CompilerServices.Extension>
 
   Public Sub GenrateRelations(DS As DataSet)
 
       If Myds.Tables.Count 3 Then
            Dim Relation1 
As DataRelation = New DataRelation("Re1"Myds.Tables(0).Columns("id"), Myds.Tables(1).Columns(2))
 
           Myds.Relations.Add(Relation1)
 
           Dim foreignKey1 As ForeignKeyConstraint Relation1.ChildKeyConstraint
            foreignKey1
.DeleteRule Rule.Cascade
            foreignKey1
.UpdateRule Rule.Cascade
            foreignKey1
.AcceptRejectRule AcceptRejectRule.Cascade

            Dim Relation2 
As DataRelation = New DataRelation("Re2"Myds.Tables(1).Columns("id"), Myds.Tables(2).Columns(3))
 
           Myds.Relations.Add(Relation2)
 
           Dim foreignKey2 As ForeignKeyConstraint Relation2.ChildKeyConstraint
            foreignKey2
.DeleteRule Rule.Cascade
            foreignKey2
.UpdateRule Rule.Cascade
            foreignKey2
.AcceptRejectRule AcceptRejectRule.Cascade

        End 
If
 
   End Sub

End Module 
الان ناتي الى النموذج , ادرج نموذج و ضع عليه 3 كائنات  DataGridView 
كل واحد يخص جدول محدد

كود النموذج

PHP كود :
Imports System.Xml

Public Class Form1
    Dim Catogary 
As New Cls_TableBase(Of tblCategory)
 
   Dim Video As New Cls_TableBase(Of tblVideo)
 
   Dim SubVideo As New Cls_TableBase(Of tblSubVideo)
 
   Dim Path As String Application.StartupPath "\DB.xml"
 
   Shared DS As New DataSet
    Dim BnCat
BnVideoBnSubvideo As New BindingSource


    Private Sub BtnSaveXml_Click
(sender As ObjectAs EventArgsHandles BtnSaveXml.Click
        DS
.WriteXml(Path)
 
   End Sub

    Private Sub Form1_Load
(sender As ObjectAs EventArgsHandles MyBase.Load
        DS 
GenrateDataset(Catogary.Table)
 
       DS GenrateDataset(Video.Table)
 
       DS GenrateDataset(SubVideo.Table)
 
       DS.GenrateRelations()


 
       If Not IO.File.Exists(PathThen
            DS
.WriteXml(Path)
 
       End If


 
       BnCat.DataSource DS.Tables(Catogary.TableName)
 
       BnVideo.DataSource BnCat
        BnVideo
.DataMember "Re1"

 
       BnSubvideo.DataSource BnVideo
        BnSubvideo
.DataMember "Re2"

 
       DataGridView1.DataSource BnCat
        DataGridView2
.DataSource BnVideo
        DataGridView3
.DataSource BnSubvideo


        If IO
.File.Exists(PathThen
            DS
.ReadXml(Path)
 
       End If

 
       GenrateDataGridViewStyle(DataGridView1, {"id"})
 
       GenrateDataGridViewStyle(DataGridView2, {"id""CategoryId"})
 
       GenrateDataGridViewStyle(DataGridView3, {"id""VideoId"})

 
   End Sub

    Private Sub CreateDoc
()
 
       If Not IO.File.Exists(Application.StartupPath "\DB.xml"Then

            Dim Doc 
As New XmlDocument

            Doc
.AppendChild(Doc.CreateElement("tblCategory"))
 
           For Each column As DataColumn In Catogary.Table.Columns
                Doc
.DocumentElement.AppendChild(Doc.CreateElement(column.ColumnName))
 
           Next
            Doc
.Save(Application.StartupPath "\DB.xml")
 
           Doc Nothing
        End 
If

 
   End Sub


    Private Sub GenrateDataGridViewStyle
(Dgv As DataGridViewColumnsToHide() As String)
 
       Dgv.AutoSizeRowsMode DataGridViewAutoSizeRowsMode.AllCells
        If Dgv
.Columns.Count 0 Then
            For Each column 
As DataGridViewColumn In Dgv.Columns
                If ColumnsToHide
.Contains(column.NameThen
                    column
.Visible False
                Else
                    column
.AutoSizeMode DataGridViewAutoSizeColumnMode.Fill
                End 
If
 
           Next
        End 
If

 
   End Sub


End 
Class 
الكود يتعامل مع قاعدة بيانات Xml لكي لا ندخل في قواعد بيانات
الكود هنا مبسط لغرض انارة حول تقنية Reflection .

ادرس Reflection جيدأ و سترى اكوادك اصبحت قادرة على انجاز اشياء لم تتصورها بهذه السهولة.

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

إقتباس :لكن ما الفائدة من كتابة نمط ثابت اقصد طريقة انشاء Properitys عن طريقة كتابتها يدوياً في الكود البرمجي.

لا ليست ثابتة انا استخدم نفس طريقتك ولكن باسماء مختلفة للكلاسس والخصائص والحقول يعني على حسب تسمية الجدول والحقل تكون الخصائص .

إقتباس :ليس من فائدة تذكر لانك تستطيع استخدام زر التاب مرتين و يقوم المحرر بانشاء الخصائص بسرعة لك او عن طريق المؤشر الذكي في المحرر.

المشكلة قد يطلب الاخرون كتابة كل شئ حتى هذه

إقتباس :ما يهمني صراحة هو استخدام الفئات المتقدمة في قلب اللغة لتقوم هي بانشاء الخصائص و الانواع و كل شيئ احتاجه عن طريق فئة قاعدية انا اقوم ببرمجتها و توريثها و هي تتكفل بباقي العمل  (Reflection) هي الحل لهذا الموضوع 

بالشويش علينا لاحظ انني تركت الدوت نت منذ 2005 واسمع فهذا فقط من هنا وهناك ولا اجيدها حتى الان

إقتباس :من جهة اخرى يجب ان تمتلك طريقة لتقوم وحدها بالتعرف على الجدول و حقوله و انواع الحقول

المشكلة هنا تحتاج ان تتصل بقاعدة البيانات فعلا ، وكل شخص يستخدم قاعدة بيانات مختلفة قلت نتركها الان 

إقتباس :بالنسبة للمثال الذي اقصده تابع معي هذه الكلاسات البسيطة و ستعرف ما اقصده عند دراسته.

سادرسه الان لافهمه جيدا قبل العودة وسوف ادرس الـ Reflection

من الاضافات الجميلة استخدمتها في احد المشاريع

قلت نترك التجميل حتى انتهاء المشروع .
ما اسم هذه الاداة أذكر انه كان معي اداة تظهر الكود بهذا التنسيق وكانت تقراء ايضا الفرامورك وتظهر حتى الفئات والاجراءت عند النقر على زر Ctrl+spase 
اكمال تلقائي يعني .
سوف احتاجها في نهاية المشروع 
اسم الاداة FastColoredTextBox

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

يقول Contains ليس عضو في من ضمن المجموعة او المصفوفة system.Array لقد حلت المشكلة بطريقة اخرى


PHP كود :
If Types.Contains(MyField(i).FieldType.NameThen 

اذا لم تخونني ذاكرتي اعتقد ان هناك كائن ربما commandbuilder بامكانه توليد ايضا كائنات بنفسه بناء على كلاسس موجود او Dataset
اعتقد عرفت من اين ابداء


PHP كود :
Public Function CreateClass(ByVal className As StringByVal properties As Dictionary(Of StringType)) As Type

        Dim myDomain 
As AppDomain AppDomain.CurrentDomain
        Dim myAsmName 
As New AssemblyName("MyAssembly")
 
       Dim myAssembly As AssemblyBuilder myDomain.DefineDynamicAssembly(myAsmNameAssemblyBuilderAccess.Run)

 
       Dim myModule As ModuleBuilder myAssembly.DefineDynamicModule("MyModule")

 
       Dim myType As TypeBuilder myModule.DefineType(classNameTypeAttributes.Public)

 
       myType.DefineDefaultConstructor(MethodAttributes.Public)

 
       For Each o In properties

            Dim prop 
As PropertyBuilder myType.DefineProperty(o.KeyPropertyAttributes.HasDefaulto.ValueNothing)

 
           Dim field As FieldBuilder myType.DefineField("_" o.KeyGetType(Integer), FieldAttributes.[Private])

 
           Dim getter As MethodBuilder myType.DefineMethod("get_" o.KeyMethodAttributes.[Public] Or MethodAttributes.SpecialName Or MethodAttributes.HideBySigo.ValueType.EmptyTypes)
 
           Dim getterIL As ILGenerator getter.GetILGenerator()
 
           getterIL.Emit(OpCodes.Ldarg_0)
 
           getterIL.Emit(OpCodes.Ldfldfield)
 
           getterIL.Emit(OpCodes.Ret)

 
           Dim setter As MethodBuilder myType.DefineMethod("set_" o.KeyMethodAttributes.[Public] Or MethodAttributes.SpecialName Or MethodAttributes.HideBySigNothing, New Type() {o.Value})
 
           Dim setterIL As ILGenerator setter.GetILGenerator()
 
           setterIL.Emit(OpCodes.Ldarg_0)
 
           setterIL.Emit(OpCodes.Ldarg_1)
 
           setterIL.Emit(OpCodes.Stfldfield)
 
           setterIL.Emit(OpCodes.Ret)

 
           prop.SetGetMethod(getter)
 
           prop.SetSetMethod(setter)

 
       Next

        Return myType
.CreateType()

 
   End Function 
انا اعجبتني الفكرة وصرت اجربها وتركت المشروع  Smile

PHP كود :
http://www.m5zn.com/d/?16876286 
الملف بالمرفقات او الرابط
الصفحات : 1 2