Sie sind hier: Startseite
 Liste aller Codebeispiele

Objektpersistenz in Datenbank

Ein Beispiel zum Einsatz der Klasse System.IO.MemoryStream aus der .NET-Klassenbibliothek.

Autor: Dr. Holger Schwichtenberg 

Beschreibung

Das folgende Beispiel speichert ein Person-Objekt in ein BLOB-Feld in einer Datenbank-Tabelle ab. Zuvor wird das Objekt mit der Hilfsroutine bin_serialize() in eine Byte-Folge umgewandelt.

Es wird eine Tabelle "Personen" in der Access-Datenbank Lieferanten.mdb benutzt. Neben dem BLOB-Feld (in Access Feldtyp "OLE-Objekt") wurden die Felder für Nachname und Vorname angelegt, um nach einer bestimmten Person suchen zu können.

Als Verbindungszeichenfolge kommt zum Einsatz:

Public Const CONNSTRING As String = _
"Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=..\_DATEN\adonet\Lieferanten.mdb;"

Programmcodebeispiele Visual Basic .NET (VB.NET)

' ============================
' .NET-Code-Beispiel in Visual Basic .NET
' Klassendefinition für einfache Serialisierungs-Beispiele
' (C) Holger@Schwichtenberg.de
' ============================
<Serializable()> Public Class Person
Public Name As String
Public Vorname As String
Public Geb As Date
Public Geschlecht As Char
Public Kinderanzahl As Byte
Public Taetigkeiten As String()
End Class

' ### Serialisieren in Byte-Folge
Function bin_serialize(ByVal o) As Byte()
Dim form As New BinaryFormatter()
Dim stream As New MemoryStream()
form.Serialize(stream, o)
stream.Close()
out("Objekt serialisiert!")
Return (stream.ToArray)
End Function

' ============================
' .NET-Code-Beispiel in Visual Basic .NET
' Objektpersistenz in Datenbank
' (C) Holger@Schwichtenberg.de
' ============================
Sub DB_Persistenz1()

outtitle( _
"Objekt in Datenbank persistent machen")

' --- Objektdefinition
Dim p As New Person()
p.Vorname = "Holger"
p.Name = "Schwichtenberg"
p.Geb = #8/1/1972#
p.Geschlecht = "m"
p.Kinderanzahl = 0
p.Taetigkeiten = New String() _
{"Berater", "Entwickler", "Journalist", _
"Dozent"}

' --- Serialisieren in binäre Byte-Folge
Dim ba As Byte()
ba = bin_serialize(p)

Dim DS As System.Data.DataSet
Dim DT As System.Data.DataTable
Dim DR As System.Data.DataRow
Dim DA As System.Data.OleDb.OleDbDataAdapter
Dim CB As _
System.Data.OleDb.OleDbCommandBuilder

' --- DataSet erzeugen
DS = New System.Data.DataSet()
' --- Adapter definieren
Const SQL As String = _
"SELECT * FROM Personen where ID = 0"
DA = New OleDbDataAdapter(SQL, CONNSTRING)
' --- SQL-DML-Befehle erzeugen
CB = New OleDbCommandBuilder(DA)

out("INSERT-Befehl: " & _
CB.GetInsertCommand.CommandText())
' --- Tabelle einlesen
DA.Fill(DS, "Personen")

' --- Zugriff auf Tabelle
DT = DS.Tables("Personen")

' --- ANFÜGEN EINES DATENSATZES
DR = DT.NewRow()
' Füllen der Spalten
DR("Name") = p.Name
DR("Vorname") = p.Vorname
DR("BIN") = ba

' Anfügen der Zeile
DT.Rows.Add(DR)
' Speichern der Änderungen
DA.Update(DS, "Personen")
DS.Dispose()

out("Objekt wurde in Datenbank gespeichert!")
End Sub

Programmcodebeispiele CSharp (C#)

using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.IO;
using System.Xml.Serialization;

using FCL_Buch;

namespace FCLBuch._System_RuntimeSerialization {

[Serializable]
public class Person {

// Klassendefinition für einfache Serialisierung-Beispiele
public string Name;
public string Vorname;
public DateTime Geb;
public char Geschlecht;
public byte Kinderanzahl;
public string[] Taetigkeiten;

public Person() {

// Konstruktor
FclOutput.PrintOut("Kontruktor von Person aufgerufen...");
}
}
}

using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization.Formatters.Soap;
using System.Runtime.Serialization;
using System.IO;
using System.Xml.Serialization;
using System.Xml;
using System.Data;

namespace FCLBuch._System_RuntimeSerialization {

// Hilfsfunktionen für Serialisierung
public class SerializationHelper {
public static byte[] Bin_Serialize(object o) {

// Serialisieren in Bytefolge
BinaryFormatter form = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
form.Serialize(stream, o);
stream.Close();
FclOutput.PrintOut("Objekt serialisiert!");
return (stream.ToArray());
}
}
}
using System;
using System.Data;
using System.Data.OleDb;

namespace FCLBuch._System_RuntimeSerialization {

public class SamplesSerialisierenDatenbank {

public static string CONNSTR = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\_DATEN\adonet\lieferanten.mdb;";

public void DB_Persistenz1() {

// Objektpersistenz in Datenbank
FclOutput.PrintOutSubHeader("Objekt in Datenbank persistent machen");

// Objektdefinition
Person p = new Person();
p.Vorname = "Holger2";
p.Name = "Schwichtenberg";
p.Geb = DateTime.Parse("08/01/1972");
p.Geschlecht = 'm';
p.Kinderanzahl = 0;
p.Taetigkeiten = new String[] {"Berater", "Entwickler", "Journalist", "Dozent"};

// Serialisieren in XML-String
string s = SerializationHelper.Xml_Serialize(p);

// Serialisieren in binäre Bytefolge
byte[] ba = SerializationHelper.Bin_Serialize(p);

// DataSet erzeugen
DataSet ds = new DataSet();

// Adapter definieren
string sql = "SELECT * FROM Personen where ID = 0";

OleDbDataAdapter da = new OleDbDataAdapter(sql, CONNSTR);

// sql-DML-Befehle erzeugen
OleDbCommandBuilder cb = new OleDbCommandBuilder(da);

FclOutput.PrintOut("INSERT-Befehl: " + cb.GetInsertCommand().CommandText);

// Tabelle einlesen
da.Fill(ds, "Personen");

// Zugriff auf Tabelle
DataTable dt = ds.Tables["Personen"];

// ANFÜGEN EINES DATENSATZES
DataRow dr = dt.NewRow();

// Füllen der Spalten
dr["Name"] = p.Name;
dr["Vorname"] = p.Vorname;
dr["BIN"] = ba;
dr["XML"] = s;

// Anfügen der Zeile
dt.Rows.Add(dr);

// Speichern der Änderungen
da.Update(ds, "Personen");
ds.Dispose();

FclOutput.PrintOut("Objekt wurde in Datenbank gespeichert!");
}
}
}

Querverweise

 Definition '.NET Framework Class Library'  Verfügbarkeit der Klasse 'System.IO.MemoryStream'  Übersicht über den FCL-Namensraum 'System.IO'  .NET & Visual Studio Community Portal