الكود التالي يوضح الشكل المبدئي للكلاس الذي تحدثت عنه
عليك أن تضيف له أي من الدوال التي تريدها
و يمكنك هنا ان تستخدم جملة Using و أنت مطمئن تماما أن Connection يتم اغلاقها
كود :
Imports System.Data.SqlClient
Public Class DisposableConnection
Implements IDisposable
Private _disposed As Boolean
Private _conn As SqlConnection
Private _command As SqlCommand
Public Sub New(connectionString As String)
_conn = New SqlConnection(connectionString)
_command = New SqlCommand
End Sub
Public ReadOnly Property Connection As SqlConnection
Get
Return _conn
End Get
End Property
Public ReadOnly Property Command As SqlCommand
Get
Return _command
End Get
End Property
Private Sub Flush()
_conn.Close()
End Sub
Private Sub CleanSqlObjects()
Flush()
If _conn IsNot Nothing Then
_conn.Dispose()
_conn = Nothing
End If
If _command IsNot Nothing Then
_command.Dispose()
_command = Nothing
End If
End Sub
Protected Overridable Sub Dispose(disposing As Boolean)
If _disposed Then
Return
End If
If disposing Then
CleanSqlObjects()
End If
_disposed = True
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
' GC.SuppressFinalize(Me)
End Sub
End Class
الكود التالي يوضح كيف يتم استخدام الكلاس
طبعا يمكنك ان تكتب اي إجراءات او تكتب اي دوال و تضيفها للكلاس كيفما شئت
أو تقوم بتعديل الكود كيفما شئت للتأكد من أن Connection تم إغلاقها
أنا فقط كتبت لك الفكرة المبدئية للكلاس
كود :
Dim s As String ' read connection fromm ConfigurationManager
Using conn As New DisposableConnection(s)
' do something
End Using
ملحوظة أخيرة
أعلم جيدا أن ما سوف أقوله سيزعج بعض الإخوة هنا
لكن انا ضد استخدام SQL او MS Access و أري أن كتابة بعض الكلاسات لحفظ البيانات باستخدام Stream أفضل كثيرا من الإعتماد علي قواعد البيانات التقليدية لأنه سيوفر الكثير من الصداع و سيعطي المبرمج قدرة أكبر علي التحكم بالبيانات كيفما يشاء
لكن الكثير من المبرمجين غالبا ما تختار الحلول الأسهل عموما وكما يقول المثل الشعبي عندنا في مصر كل شيخ و له طريقة