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

Einführung in Data Shaping mit ADO

Geschrieben von: Christoph Wille
Kategorie: Datenbank

This printed page brought to you by AlphaSierraPapa

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:

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).

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000627.zip

Verwandte Artikel

Installation der neuesten ADO Version (ADO 2.5)
http:/www.aspheute.com/artikel/20000328.htm

 

©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.