Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs
ASP German Homepage Homepage
 

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Einführung in Data Shaping mit ADO

Geschrieben von: Christoph Wille
Kategorie: Datenbank

Wer kennt das Szenario nicht, wo man zu einem Datensatz aus einer Mastertabelle die entsprechenden Datensätze aus der Kindtabelle abholen muß - so zum Beispiel alle Bestellungen eines Kunden. Das ist natürlich nur eines der vielen Szenarien die auf Fremdschlüsselbeziehungen aufbauen können.

Das Problem kann man nun auf einige Arten lösen:

  • Mit einem INNER JOIN zwischen den Tabellen (normales SELECT Statement über mehrere Tabellen). Der Nachteil: doppelte Daten werden geholt, und weiters kann man die Daten nicht aktualisieren - weil 2 Tabellen oder mehr gejoint sind.
  • Angesichts der Nachteile der vorherigen Lösung könnte man ja dazu übergehen, zwei Recordsets aufzumachen: eines für die Mastertabelle, eines für die Kindtabelle - und Filter setzen. Nachteil: riesige Recordsets, und mögliche Probleme bei vielen gleichzeitigen Benutzern.
  • Eine weitere Verfeinerung wäre es, die Mastertabelle aufzumachen, aber immer nur die Kindrecords zu holen, die zum aktuellen Masterrecord gehören. Nachteil: wenn oft in der Mastertabelle gemovt wird, muß man oft zur Datenbank, um die Kinddatensätze zu holen.
  • Shaped Recordsets: dieser Ansatz vereinigt das Beste der vorangehenden zwei Ansätze. Man kann Hierarchien automatisch aufbauen (auch auf Bedarf), Aggregierungen durchführen, und updaten darf man auch nach Herzenlust.

Damit steht schon fest, womit wir uns heute beschäftigen werden: Data Shaping. Als Beispiel habe ich unsere Artikeldatenbank von AspHeute "abgespeckt", und sie sieht nun wie folgt aus:

Die Hierarchie, auf die in den folgenden Beispielen hinauswill ist die, daß eine Kategorie mehrere Artikel beinhaltet. MS Access 2000 bietet einem eine Tabellenansicht, die bereits das Data Shaping Feature von ADO einsetzt - und wir werden es ähnlich für uns in ASP nachbauen:

Wie funktioniert Data Shaping

Nun da wir wissen, was wir wollen - und wie wir es anpacken wollen - steht nur noch die Frage im Raum, wie denn die Technologie funktioniert, derer wir uns bedienen wollen. Data Shaping erlaubt es, hierarchische Beziehungen aufzubauen, die nicht unbedingt auf bestehenden Schlüsselbeziehungen aufbauen müssen. Das Wichtige hierbei ist, daß ich nicht an Fremdschlüssel gebunden bin - ich kann meine Hierarchien aufbauen wie ich das gerne möchte.

Da ADO auf OLE DB aufbaut, ist es eine sichere Annahme, daß auch Data Shaping im Hintergrund durch OLE DB "gestützt" wird. Und richtig: es gibt den Data Shaping Service for OLE DB, als auch eine eigene SHAPE Sprache, die es einfach erlaubt, Hierarchien zu erzeugen.

Was macht OLE DB im Hintergrund, wenn man per ASP und ADO ein Shaped Recordset anfordert? Schaut Euch zuerst die Grafik an, die Schritte werden dann in der darauffolgenden Liste erklärt.

  1. Die ASP Seite schickt ein SHAPE Kommando an ADO, und gibt dabei den Data Shaping Provider als Service Provider an, und den JET OLE DB Treiber als Data Provider.
  2. ADO schickt das SHAPE Kommando and den Data Shaping Provider, und dieser benutzt den angegebenen Data Provider um die Daten aus der Datenbank anzufordern.
  3. Die geshapten Daten werden an den Cursor Service übergeben, der dafür zuständig ist, daß man im Recordset dann navigieren und updaten kann.
  4. Die OLE DB Ebene wird verlassen, und ADO bekommt die Recordsets zur Verwendung übergeben.
  5. Unsere ASP Applikation kann die Daten auslesen, darstellen und modifizieren.

Der Inhalt eines geshapten Recordsets besteht aus den Feldern des Masterrecordsets als auch einem weiteren Feld, dem Chapter. Ein Chapter ist nichts weiter als ein Recordset im Recordset - es enthält die Daten der Kindtabelle(n).

Ein Beispiel

Damit das Ganze jetzt nicht in die Theorie abgleitet, starten wir mit unserem Beispiel. Unser Data Provider ist der JET OLE DB Provider, unsere beiden Tabellen sind auch bekannt, die Hierarchie haben wir uns auch schon ausgedacht, alles was uns jetzt definitiv noch fehlt ist die Syntax der SHAPE Sprache.

In diesem ersten Artikel über Data Shaping möchte ich mich bei der Syntax noch kurz halten, und das Kommando

SHAPE { SELECT * FROM tCategories }
APPEND ({ SELECT * FROM tArticles }
RELATE CategoryID TO CategoryID) AS rsArticles

fast so stehen lassen - weil es bereits die allereinfachste Form eines SHAPE Statements ist. Die erste Zeile definiert das Masterrecordset, die zweite Zeile fügt das Kindrecordset an, und die dritte Zeile teilt ADO mit, wie ich Master und Kind in Beziehung setzen möchte - und wie das daraus entstehende Chapter heißen soll.

Bewaffnet mit dem SHAPE Kommando können wir nun den dazugehörigen Sourcecode in ASP schreiben:

<% Option Explicit %>
<%
Dim strShapeCmd, cn, rs
Dim chapter, theDate

strShapeCmd = "SHAPE { SELECT * FROM tCategories }  "
strShapeCmd = strShapeCmd & "APPEND ({ SELECT * FROM tArticles } "
strShapeCmd = strShapeCmd & "RELATE CategoryID TO CategoryID) AS rsArticles"

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Provider = "MSDataShape"
cn.Open "data provider=Microsoft.Jet.OLEDB.4.0;data source=c:\aspheute.mdb"

rs.Open strShapeCmd, cn
Response.Write "<table>"
While Not rs.EOF
    Response.Write "<tr><td><b>" 
	   & rs("CategoryName").Value & "</b><br>" & vbCrLf

    Set chapter = rs("rsArticles").Value
    Response.Write "<ul>"
    While Not chapter.EOF
      Response.Write "<li><a href=""http://www.aspheute.com/artikel/" 
      theDate = chapter("ArticleDate")
      Response.Write Year(theDate) & ZeroPad(Month(theDate)) 
           & ZeroPad(Day(theDate)) & ".htm"">"
      Response.Write chapter("ArticleTitle") & "</a>"
      chapter.MoveNext
    Wend
    Response.Write "</ul></tr>"
    rs.MoveNext
Wend
Response.Write "</table>"

Function ZeroPad(theString)
    If Len(theString) = 1 Then
        theString = "0" & theString
    End If
    ZeroPad = theString
End Function
%>

Ungewöhnlich an diesem Sourcecode verglichen zu normalen ADO Code ist, daß man sowohl den Provider (Service Provider), als auch getrennt den Data Provider (im Open Statement) angeben muß - damit wird der Data Shaping Provider aktiviert. Alles andere ist wie normaler ADO Code.

Interessant ist, wie man das Chapter anspricht:

Set chapter = rs("rsArticles").Value

Das Chapter ist ein Recordset Objekt, daher benötigt man das Set Statement. Apropos: sollte man .Value vergessen, kann das einige unschöne Fehler produzieren. Also Vorsicht Falle!

Die Ausgabe aller Daten (Master und Kind) erfolgt in einer sehr einfachen Tabelle, mit ebenso einfacher Formatierung. Das einzige besondere, das ich eingebaut habe, ist ein Link zum tatsächlichen Artikel auf AspHeute. Da unsere Linkstruktur yyyymmdd.htm ist, muß ich dafür sorgen, daß Monate und Tage mit nur einer Zahl eine führende Null bekommen - dafür ist die Funktion ZeroPad zuständig.

Der Output, der generiert wird, sieht in Internet Explorer wie folgt aus:

Mit relativ wenig Aufwand haben wir einen durchwegs ansprechenden Output erzeugt. Und das, ohne uns bei der Master-Kind Beziehung ein zusätzliches Codeproblem aufzuhalsen (zusätzliche Recordsets öffnen, JOIN's, ...).

Schlußbemerkung

In diesem Artikel ging es um ein erstes Kennenlernen der Möglichkeiten, die der Data Shaping Provider für eine Anwendung eröffnen kann. Ausgespart habe ich eine genaue Syntax der SHAPE Kommandosprache, als auch die verschiedenen Arten der Hierarchien. Wir haben nur eine verwendet, obwohl es fünf verschiedene Arten gibt - aber das ist eine andere Geschichte (Artikel).

Download des Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Installation der neuesten ADO Version (ADO 2.5)

Wenn Sie jetzt Fragen haben...

Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten.

Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.

 

Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.