الان مع جملة التحديد ,سنبدأ الاستفادة من كل المعلومات التي قمنا بتخزينها سابقا
سنقوم بعمل جملة تحديد بسيطة نعبئ فيها الحقول من مصفوفة الحقول التي انشأناها سابقا وفق حلقة تكرارية
و سنفحص اذا ما كان الحقل هو مفتاح رئيسي في قائمة الحقول لنضيفه الى جملة التحديد ايضا
و كذلك سنضيف قائمة البارمترات المرافقة للحقول من المصفوفة الموافقة الى كائن SQL COMMAND
توقف اخي ؟؟؟ لماذا ساضيف بارمترات مع جملة التحديد
ربما تحتاجها مستقبلا اذا ما نويت التوسع في الكلاس كان تجري عمليات بحث و فلترة و غيرها من الامور المعتمدة على البارمترات
الكود التالي يوضح العملية مع الشرح
اذا دققت في الكود السابق ستجد ان لديك الاجراء checkfileds
هذا الاجراء مهمته تفحص تواجد الحقول المدخلة من قبل المستخدم و مطابقتها مع مصفوفة الحقول لدينا
لكي لا يدخل المستخدم اسم حقل غير موجود لدينا
الان ننتقل الى UPDATE
عملية تحديث البيانات في القاعدة تعتمد على شيئ اساسي الا و هو عمود المفتاح الرئيسي اذا ان جملة التحديث تبقى عمياء بدون هذا الحقل ولا تعرف اي حقل تريد ان تحدث لذا وجب ان يكون البارميتر الخاص بهذا الحقل اساسي يعني يحمل القيمة الحقيقة
عملية تحديد الحقول كما سابقها في جملة SELECT
الادخال INSERT
لا شيئ جديد حددنا الحقول كما سابقه و قمنا فقط باستثناء البارميتر الخاص بالمفتاح الرئيسي اذا كان الحقل الذي تتعامل معه من النوع ترقيم تلقائي او قم باضافته اذا كنت تستخدم حقل خاص بك لكن تذكر ان تفحص قيمة الحقل قبل الارسال لكي لا تنشئ لديك قيم مكررة
عملية الحذف DELETE
الحذف يجري بطريقة معتادة وفق قيمة المفتاح الرئيسي و هو معروف لديكم جميعا
كما انني اردت ان اعمل طريقة اخرى لحذف كل محتويات الجدول
الحذف وفق معيار محدد
حذف كامل الصفوف في الجدول المحدد
ماذا بعد ذلك
احببت ان اضمن كل عملنا السابق و اضافة كل كائنات SQL COMMANDS الى كائن SQL DATA ADAPTER
ليتكفل هو بالعملية كاملة يمكنك تخطيها اذا احببت
مشكور اخي خضر على المشاركة اكيد فيك تكتبه بطرق سهلة اكثر و حسب مزاجك
الموضوع برمته كان على عجالة و الكلاس سيتم تجريبه اكثر للتاكد من عمله
و يمكن الاستفادة من الالية لتطويرها بما يتناسب مع تصورك للهدف
بعد ذلك لم يتبقى لدينا الى عملية تخريج الكلاس BUILD لنحصل على ملف Dll نستخدمه في مشروعنا
ساقوم بوضع تجريب بسيط للتعامل مع الكلاس لاحقا
سنقوم بعمل جملة تحديد بسيطة نعبئ فيها الحقول من مصفوفة الحقول التي انشأناها سابقا وفق حلقة تكرارية
و سنفحص اذا ما كان الحقل هو مفتاح رئيسي في قائمة الحقول لنضيفه الى جملة التحديد ايضا
و كذلك سنضيف قائمة البارمترات المرافقة للحقول من المصفوفة الموافقة الى كائن SQL COMMAND
توقف اخي ؟؟؟ لماذا ساضيف بارمترات مع جملة التحديد
ربما تحتاجها مستقبلا اذا ما نويت التوسع في الكلاس كان تجري عمليات بحث و فلترة و غيرها من الامور المعتمدة على البارمترات
الكود التالي يوضح العملية مع الشرح
PHP كود :
''' <summary>
''' اجراء يقوم بانشاء جملة تحديد لبيانات الجدول المحدد
''' يمكنك تحديد كل حقول الجدول بواسطة
''' علامة * في مصفوفة الحقول
''' او تحديد الحقول التي تريدها
''' </summary>
''' <param name="Command">كائن الكوماند</param>
''' <param name="Columns">مصفوفة نصية تحتوي على الحقول</param>
''' <returns>يعود بكائن كوماند يحمل جملة التحديد</returns>
''' <remarks></remarks>
Private Function Create_Select_For_Command(ByVal Command As SqlCommand, ByVal ParamArray Columns() As String) As SqlCommand
If _TableName = "" Or _TableName Is Nothing Then
MsgBox("حدد اسم الجدول اولا", , "From Create_Select_For_Command")
Return Nothing
Exit Function
End If
'**********************************************
Dim SelectColumns As String = "Select " '& "("
Dim filed As String = ""
Dim sa As Integer = 0
Dim qf As Integer = 0
Dim qfiled As String = ""
'-----------------------------------
Command.Connection = GetSqlConnection
'
If Columns(0) = "*" Then
For ic = 0 To InsUpSel.GetLength(1) - 1
If qf = InsUpSel.GetLength(1) - 1 Then
qfiled += InsUpSel(0, ic)
Else
qfiled += InsUpSel(0, ic) & ","
End If
qf += 1
Next
SelectColumns += qfiled & " From " & _TableName
qfiled = ""
qf = 0
ElseIf Columns(0) <> "*" And Columns.Length >= 0 Then
Columns = Columns
If checkfileds(Columns) = True Then
Return Nothing
Exit Function
End If
For Each Str As String In Columns
For ic = 0 To InsUpSel.GetLength(1) - 1
If Str = InsUpSel(0, ic) Then
If qf = Columns.Length - 1 Then
qfiled += InsUpSel(0, ic)
Else
qfiled += InsUpSel(0, ic) & ","
End If
End If
Next
qf += 1
Next
SelectColumns += qfiled & " From " & _TableName
End If
'
Command.CommandText = SelectColumns
Return Command
End Function
اذا دققت في الكود السابق ستجد ان لديك الاجراء checkfileds
هذا الاجراء مهمته تفحص تواجد الحقول المدخلة من قبل المستخدم و مطابقتها مع مصفوفة الحقول لدينا
لكي لا يدخل المستخدم اسم حقل غير موجود لدينا
PHP كود :
''' <summary>
''' ''اجراء يقوم بفحص الحقول الممرة وفق مصفوفة الحقول
''' ويختبر تواجدها في الجدول
''' </summary>
''' <param name="ColCheck">البارميتر هو مصفوفة من الحقول </param>
Private Function checkfileds(ByVal ParamArray ColCheck() As String) As Boolean
Dim flds(0) As String
Dim check As Boolean
For m = 0 To InsUpSel.GetLength(1) - 1
ReDim Preserve flds(m)
flds.SetValue(InsUpSel(0, m), m)
Next
For Each t As String In ColCheck
If Not (flds.Contains(t)) Then
MsgBox("لا يوجد حقل بالاسم(" & t & ") في الجدول(" & _TableName & ")", , "الرسالة قادمة من الاجراء checkfileds")
Return check = True
Exit Function
End If
Next
Return check
End Function
الان ننتقل الى UPDATE
عملية تحديث البيانات في القاعدة تعتمد على شيئ اساسي الا و هو عمود المفتاح الرئيسي اذا ان جملة التحديث تبقى عمياء بدون هذا الحقل ولا تعرف اي حقل تريد ان تحدث لذا وجب ان يكون البارميتر الخاص بهذا الحقل اساسي يعني يحمل القيمة الحقيقة
عملية تحديد الحقول كما سابقها في جملة SELECT
PHP كود :
''' <summary>
''' 'يقوم هذا الاجراء بانشاء جملة تحديث للجدول المحدد
''' و يقوم باسنادها الى الكوماند المطلوب
''' يحتاج الى بارميترين الاول هو كائن الكوماند
''' و الثاني هو مصفوفة الحقول بامكانك تمرير علامة * في الاشارة الى كافة الحقول
''' او تمرير الحقول حسب الرغبة كما يلي
''' </summary>
''' <param name="Command">
''' كائن الكوماند
''' </param>
''' <param name="Columns">مصفوفة نصية تحتوي على اسماء الحقول</param>
''' <returns>يعود بكائن كوماند يحمل جملة التحديث</returns>
''' <remarks>
''' </remarks>
Private Function Create_update_For_Command(ByVal Command As SqlCommand, ByVal ParamArray Columns() As String) As SqlCommand
If _TableName = "" Or _TableName Is Nothing Then
MsgBox("حدد اسم الجدول اولا", , "From Create_update_For_Command ")
Return Nothing
Exit Function
End If
'----------------------------------------------------------------
Dim Updatest As String = ""
Dim qfiled As String = ""
Dim CurrentKey As String = ""
Dim OrginalKey As String = ""
Dim qf As Integer = 0
Dim qparm As New SqlParameter
'***********************************************
Command.Connection = GetSqlConnection
Command.Parameters.Clear()
'---------------------------------------------------------------------------------------
'''''''''
If Columns(0) = "*" Then
For ic = 0 To InsUpSel.GetLength(1) - 1
qparm = New SqlParameter
If Not (InsUpSel(3, ic) = "prim") Then
If qf = InsUpSel.GetLength(1) - 1 Then
qfiled += InsUpSel(0, ic) & "=" & InsUpSel(2, ic)
qparm.ParameterName = InsUpSel(2, ic)
qparm.SqlDbType = InsUpSel(1, ic)
qparm.SourceColumn = InsUpSel(0, ic)
Command.Parameters.Add(qparm)
Else
qfiled += InsUpSel(0, ic) & "=" & InsUpSel(2, ic) & ","
qparm.ParameterName = InsUpSel(2, ic)
qparm.SqlDbType = InsUpSel(1, ic)
qparm.SourceColumn = InsUpSel(0, ic)
Command.Parameters.Add(qparm)
End If
Else
CurrentKey = InsUpSel(0, ic)
OrginalKey = InsUpSel(2, ic)
qparm.ParameterName = InsUpSel(2, ic)
qparm.SqlDbType = InsUpSel(1, ic)
qparm.SourceColumn = InsUpSel(0, ic)
Command.Parameters.Add(qparm)
'''''''
qparm = New SqlParameter
qparm.ParameterName = "@Orginal_" & InsUpSel(0, ic)
qparm.SqlDbType = InsUpSel(1, ic)
qparm.SourceColumn = InsUpSel(0, ic)
qparm.SourceVersion = DataRowVersion.Original
Command.Parameters.Add(qparm)
End If
qf += 1
Next
Updatest = "Update " & _TableName & " Set " & qfiled & " Where " & CurrentKey & " = " & OrginalKey
'
qfiled = ""
CurrentKey = ""
OrginalKey = ""
qf = 0
'
ElseIf Columns(0) <> "*" And Columns.Length >= 1 Then
Columns = Columns
'
If checkfileds(Columns) = True Then
Return Nothing
Exit Function
End If
'
For Each Str As String In Columns
For ic = 0 To InsUpSel.GetLength(1) - 1
If Not (InsUpSel(3, ic) = "prim") Then
If Str = InsUpSel(0, ic) Then
qparm = New SqlParameter
If qf = Columns.Length - 1 Then
qfiled += InsUpSel(0, ic) & "=" & InsUpSel(2, ic)
qparm.ParameterName = InsUpSel(2, ic)
qparm.SqlDbType = InsUpSel(1, ic)
qparm.SourceColumn = InsUpSel(0, ic)
Command.Parameters.Add(qparm)
Else
qfiled += InsUpSel(0, ic) & "=" & InsUpSel(2, ic) & ","
qparm.ParameterName = InsUpSel(2, ic)
qparm.SqlDbType = InsUpSel(1, ic)
qparm.SourceColumn = InsUpSel(0, ic)
Command.Parameters.Add(qparm)
End If
End If
ElseIf InsUpSel(3, ic) = "prim" And Not (Command.Parameters.Contains(OrginalKey)) Then
CurrentKey = ""
OrginalKey = ""
CurrentKey = InsUpSel(0, ic)
OrginalKey = InsUpSel(2, ic)
qparm.ParameterName = InsUpSel(2, ic)
qparm.SqlDbType = InsUpSel(1, ic)
Command.Parameters.Add(qparm)
''''''''''
If Not (Command.Parameters.Contains("@Orginal_" & CurrentKey)) Then
qparm = New SqlParameter
qparm.ParameterName = "@Orginal_" & CurrentKey
qparm.SqlDbType = InsUpSel(1, ic)
qparm.SourceColumn = InsUpSel(0, ic)
qparm.SourceVersion = DataRowVersion.Original
qparm.Direction = ParameterDirection.Output
Command.Parameters.Add(qparm)
End If
End If
Next
qf += 1
Next
Updatest = "Update " & _TableName & " Set " & qfiled & " Where " & CurrentKey & " = " & OrginalKey
' MsgBox(Updatest)
End If
Command.CommandText = Updatest
Return Command
End Function
الادخال INSERT
لا شيئ جديد حددنا الحقول كما سابقه و قمنا فقط باستثناء البارميتر الخاص بالمفتاح الرئيسي اذا كان الحقل الذي تتعامل معه من النوع ترقيم تلقائي او قم باضافته اذا كنت تستخدم حقل خاص بك لكن تذكر ان تفحص قيمة الحقل قبل الارسال لكي لا تنشئ لديك قيم مكررة
PHP كود :
''' <summary>
''' اجراء يقوم بانشاء جملة ادخال للكوماند المحدد
''' يتم استخدام اسم الجدول المحدد
''' يتم من خلاله انشاء بارميترات للكوماند المحدد
''' توافق اسماء الحقول في الجدول
''' </summary>
''' <param name="Command">مرر اسم الكوماند فقط</param>
''' <param name="Columns">مرر مصفوفة نصية تحتوي على اسماء الحقول بامكانك استخدام علامة * للاشارة الى كل الحقول</param>
''' <returns>يعيد كائن كوماند يحمل جملة الادخال</returns>
''' <remarks>
''' ان اي خطأ في اسماء الحقول لن يعمل الاجراء بشكل صحيح
''' <example>
''' <code>
''' Dim Cols() As String = {"name","phone"}
''' </code>
''' </example>
''' </remarks>
Private Function Create_Insert_For_Command8(ByVal Command As SqlCommand, ByVal ParamArray Columns() As String) As SqlCommand
If _TableName = "" Or _TableName Is Nothing Then
MsgBox("حدد اسم الجدول اولا", , "from Create_Insert_For_Command ")
Return Nothing
Exit Function
End If
'-----------------------------------------------------------------
Command = Command
Command.Connection = GetSqlConnection
Command.Parameters.Clear()
'=============================================================
Dim insertall As String = ""
Dim select1 As String = "Select "
Dim qfiled As String = ""
Dim qvalue As String = ""
Dim qf As Integer = 0
Dim qparm As New SqlParameter
If Columns(0) = "*" Then
For ic = 0 To InsUpSel.GetLength(1) - 1
qparm = New SqlParameter
If Not (InsUpSel(3, ic) = "prim") Then
If qf = InsUpSel.GetLength(1) - 1 Then
qfiled += InsUpSel(0, ic)
qvalue += InsUpSel(2, ic)
qparm.ParameterName = InsUpSel(2, ic)
qparm.SqlDbType = InsUpSel(1, ic)
qparm.SourceColumn = InsUpSel(0, ic)
Command.Parameters.Add(qparm)
Else
qfiled += InsUpSel(0, ic) & ","
qvalue += InsUpSel(2, ic) & ","
qparm.ParameterName = InsUpSel(2, ic)
qparm.SqlDbType = InsUpSel(1, ic)
qparm.SourceColumn = InsUpSel(0, ic)
Command.Parameters.Add(qparm)
End If
End If
qf += 1
Next
If InsUpSel(3, 0) = "prim" Then
Dim keyorginal As String
keyorginal = InsUpSel(0, 0)
select1 += keyorginal & "," & qfiled & " from " & _TableName & " Where " & keyorginal & " = " & " SCOPE_IDENTITY()"
Else
select1 += qfiled & " from " & _TableName
End If
insertall = "INSERT INTO " & _TableName & vbCrLf & " (" & qfiled & ")" & vbCrLf & "Values " & vbCrLf & "(" & qvalue & ")" & vbCrLf & select1
Command.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord
qfiled = ""
qf = 0
ElseIf Columns(0) <> "*" And Columns.Length >= 1 Then
Columns = Columns
If checkfileds(Columns) = True Then
Return Nothing
Exit Function
End If
For Each Str As String In Columns
For ic = 0 To InsUpSel.GetLength(1) - 1
If Not (InsUpSel(3, ic) = "prim") Then
If Str = InsUpSel(0, ic) Then
qparm = New SqlParameter
If qf = Columns.Length - 1 Then
qfiled += InsUpSel(0, ic)
qvalue += InsUpSel(2, ic)
qparm.ParameterName = InsUpSel(2, ic)
qparm.SqlDbType = InsUpSel(1, ic)
qparm.SourceColumn = InsUpSel(0, ic)
Command.Parameters.Add(qparm)
' Exit For
Else
qfiled += InsUpSel(0, ic) & ","
qvalue += InsUpSel(2, ic) & ","
qparm.ParameterName = InsUpSel(2, ic)
qparm.SqlDbType = InsUpSel(1, ic)
qparm.SourceColumn = InsUpSel(0, ic)
Command.Parameters.Add(qparm)
End If
Else
End If
End If
Next
qf += 1
Next
insertall = "INSERT INTO " & _TableName & vbCrLf & " (" & qfiled & ")" & vbCrLf & "Values " & vbCrLf & "(" & qvalue & ")"
End If
Command.CommandText = insertall
Return Command
End Function
عملية الحذف DELETE
الحذف يجري بطريقة معتادة وفق قيمة المفتاح الرئيسي و هو معروف لديكم جميعا
كما انني اردت ان اعمل طريقة اخرى لحذف كل محتويات الجدول
الحذف وفق معيار محدد
PHP كود :
''' <summary>
''' اجراء يقوم بانشاء جملة استعلام لعملية حذف صف محدد
''' وفق قيمة المفتاح الرئيسي
''' </summary>
''' <param name="Command">كائن الكوماند</param>
''' <returns>يعود بكائن الكوماند المرسل</returns>
''' <remarks></remarks>
Private Function Create_Delete_For_Command(ByVal Command As SqlCommand) As SqlCommand
If _TableName = "" Or _TableName Is Nothing Then
MsgBox("حدد اسم الجدول اولا", , "From Create_Delete_For_Command ")
Return Nothing
Exit Function
End If
'-----------------------------------------------------------------------
Command = Command
Command.Connection = GetSqlConnection
Command.Parameters.Clear()
Dim Deletest As String = "Delete From " & _TableName & " Where "
Dim parm As New SqlParameter
'
Dim OrginalKye As String = ""
For ic = 0 To InsUpSel.GetLength(1) - 1
If InsUpSel(3, ic) = "prim" Then
OrginalKye = InsUpSel(0, ic)
parm.ParameterName = InsUpSel(2, ic)
parm.SqlDbType = InsUpSel(1, ic)
parm.SourceColumn = InsUpSel(0, ic)
parm.SourceVersion = DataRowVersion.Original
Command.Parameters.Add(parm)
End If
Next
Deletest += "(" & OrginalKye & "=" & "@" & OrginalKye & ")"
'
Command.CommandText = Deletest
Return Command
End Function
حذف كامل الصفوف في الجدول المحدد
PHP كود :
''' <summary>
''' اجراء يقوم بانشاء جملة استعلام لعملية حذف
''' كل الصفوف في الجدول المحدد
''' </summary>
''' <param name="Command">كائن كوماند</param>
''' <returns>يعود بكائن الكوماند المرسل</returns>
''' <remarks></remarks>
Private Function Create_DeleteAll_For_Command(ByVal Command As SqlCommand) As SqlCommand
If _TableName = "" Or _TableName Is Nothing Then
MsgBox("From Create_DeleteAll_For_Command " & "حدد اسم الجدول اولا")
Return Nothing
Exit Function
End If
'-----------------------------------------------------------------------
Command = Command
Command.Connection = GetSqlConnection
'--------------------------------------------------------------------------
Dim Deletest As String = "Delete From " & _TableName
Command.CommandText = Deletest
Return Command
End Function
ماذا بعد ذلك
احببت ان اضمن كل عملنا السابق و اضافة كل كائنات SQL COMMANDS الى كائن SQL DATA ADAPTER
ليتكفل هو بالعملية كاملة يمكنك تخطيها اذا احببت
PHP كود :
''' <summary>
''' اجراء يقوم بتمهيد كائن الادبتر وفق الجدول المحدد
''' و يقوم بتجهيز كائنات الكوماند المناسبة مع البارمترات اللازمة
''' </summary>
''' <param name="Columns"> * مصفوفة الحقول يمكنك استخدام علامة </param>
''' <returns>يعيد كائن ادبتر </returns>
''' <remarks></remarks>
Public Function Creat_Adapter(ByVal ParamArray Columns() As String) As SqlDataAdapter
Dim table1 As String = TableName
LoadTxtFiled()
'----------------
Me._adapter = New SqlClient.SqlDataAdapter()
Dim tableMapping As DataTableMapping = New DataTableMapping()
tableMapping.SourceTable = table1 ' "Table"
tableMapping.DataSetTable = table1 '"class"
'------------------------------------------------------------------
If Dt.Columns.Count > 0 Then
For Each dc As DataColumn In Dt.Columns
tableMapping.ColumnMappings.Add(dc.ColumnName, dc.ColumnName)
Next
Me._adapter.TableMappings.Add(tableMapping)
End If
'---------------------------------------------------------------------------
Dim SelCommand As New SqlClient.SqlCommand
Dim UpCommand As New SqlClient.SqlCommand
Dim InsCommand As New SqlClient.SqlCommand
Dim DelCommand As New SqlClient.SqlCommand
'--------------------
SelCommand = Me.Create_Select_For_Command(SelCommand, Columns)
'-------------------
UpCommand = Me.Create_update_For_Command(UpCommand, Columns)
'-------------------
InsCommand = Me.Create_Insert_For_Command8(InsCommand, Columns)
'-----------------
DelCommand = Me.Create_Delete_For_Command(DelCommand)
'----------------------
Me._adapter.SelectCommand = SelCommand
Me._adapter.InsertCommand = InsCommand
Me._adapter.UpdateCommand = UpCommand
Me._adapter.DeleteCommand = DelCommand
Me._adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
Return Me._adapter
End Function
(25-06-16, 04:29 AM)khodor1985 كتب : بتصور فينا نكتب الكلاس بطريقة أسهل من هيك، هيدا رأيي طبعا.
مشكور على جهودك
مشكور اخي خضر على المشاركة اكيد فيك تكتبه بطرق سهلة اكثر و حسب مزاجك
الموضوع برمته كان على عجالة و الكلاس سيتم تجريبه اكثر للتاكد من عمله
و يمكن الاستفادة من الالية لتطويرها بما يتناسب مع تصورك للهدف
بعد ذلك لم يتبقى لدينا الى عملية تخريج الكلاس BUILD لنحصل على ملف Dll نستخدمه في مشروعنا
ساقوم بوضع تجريب بسيط للتعامل مع الكلاس لاحقا
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال


