السلام عليكم ورحمة الله وبركاته
إشارة إلى موضوعي كيف يمكنني حفظ Object في قاعدة بيانات ؟ .
فقد توصلنا إلى الحل و الحمد لله .
Imports System.IO
Imports System.Data.OleDb
Imports System.Runtime.Serialization.Formatters.Binary
Public Class Form
Dim Con As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\db.mdb"
Dim MyConnection As New System.Data.OleDb.OleDbConnection(Con)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'====================
' نحذف أي سجلات في الجدول كي تظهر البيانات من دون وضع شروط في الاستعلام
Dim strDelete As String = "DELETE * FROM MyPP;"
Dim cmdDelete As New OleDbCommand(strDelete, MyConnection)
MyConnection.Open()
cmdDelete.ExecuteNonQuery()
cmdDelete.Cancel()
MyConnection.Close()
'====================
' إعلان عن الكائن الخاص بنا و المطلوب تخزينه من الذاكرة إلى قاعدة البيانات مباشرة
Dim MSVS_object As New MSVS
MSVS_object.Name = TextBox1.Text
MSVS_object.Input = TextBox2.Text
MSVS_object.Output = TextBox3.Text
'====================
' عملية إدخال الكائن في ميموري ستريم
Dim bf As New BinaryFormatter
Dim ms As New MemoryStream
bf.Serialize(ms, MSVS_object)
'====================
' تحويل الميموري ستريم إلى مصفوفة من نوع بايت
Dim ByteArray() As Byte
ByteArray = ms.GetBuffer
' إغلاق الميموري ستريم
ms.Close()
'====================
' إنشاء الاستعلام
Dim str As String = "INSERT INTO MyPP (PP) VALUES (@pic);"
Dim cmd As New OleDbCommand(str, MyConnection)
' إتشاء باراميتر و تحديد نوعه باينري
Dim pic As OleDbParameter = New OleDbParameter("@pic", OleDbType.Binary)
' اسناد قيمة مصفوفة البايت إلى الباراميتر
pic.Value = ByteArray
' إضافة الباراميتر إلى كائن الإستعلام
cmd.Parameters.Add(pic)
' فتح الاتصال
MyConnection.Open()
' تنفيذ الاستعلام
cmd.ExecuteNonQuery()
cmd.Cancel()
MyConnection.Close()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim str As String = "select * from MyPP;"
Dim cmd As New OleDbCommand(str, MyConnection)
MyConnection.Open()
cmd.ExecuteNonQuery()
' إعلان عن متغير نوعه كائن
Dim ReturnObject As New Object
' إسناد القيمة العائدة من الإستعلام إلى كائن
ReturnObject = cmd.ExecuteScalar
cmd.Cancel()
MyConnection.Close()
' تحويل الكائن إلى مصفوفة من نوع بايت
Dim ArryByte() As Byte
ArryByte = CType(ReturnObject, Byte())
' تحويل المصفوفة إلى ميموري ستريم
Dim mem As New MemoryStream(ArryByte)
Dim br As New BinaryFormatter
Dim MSVS_object As New MSVS
' إعادة إدخال قيمة الميموري ستريم إلى الكائن
MSVS_object = br.Deserialize(mem)
' إغلاق الميموري ستريم
mem.Close()
' عرض النتائج
MsgBox("Name : " & MSVS_object.Name & " , Input : " & MSVS_object.Input.ToString & " , OutPut : " & MSVS_object.Output.ToString)
End Sub
End Classالكلاس الذي سيشتق منه الكائن هو :
<System.Serializable()> Public Class MSVS ' يجب أن تكون الفئة قابلة ' Serializable Public Name As String Public Input As Integer Public Output As Integer End Class
تنبه يجب أن يكون الكلاس قابل للسريله :lol: (مصطلح جديد)
شكراً لمن ساهم في الوصول للحل و أخص الأخ حازم .
أخيراً ، أحس أن المشاركة خاصة بقسم الـ VB.net أكثر من الـ ADO.net لهذا وضعتها هنا .
والسلام عليكم ورحمة الله وبركاته