Kategorien:
Suchbegriffe:
Suchfelder:
Suche starten
Neue Beiträge / Top 7
Alle Artikel / Liste
Bücher zu ASP/ASP.Net
Startseite / Hilfe
Fragen zu ASP/ASP.NET
Datenschutzrichtlinen
Impressum / Kontakt
Das ASP.Net Codebook. Die unentbehrliche Referenz für alle ASP.Net-Entwickler [Autoren: Stefan Falz, Karsten Samaschke]
Active Server Pages-FAQ
Active Server Pages - FAQ (v. 1.50) © 2000 - 2020 by Stefan Falz Webconsulting

GetFile! Dynamischer Dateiupload im Browser

Datenbankzugriffe Zurück Druckversion Stefan Falz 15.05.2001
Frage: Wie kann ich Daten aus mehreren Datenbanken gleichzeitig abfragen?
Bei Anwendungen, die auf mehreren Datenbanken basieren, kommt es häufiger vor, dass
man Daten aus mehr als einer dieser Datenbank in einer einzigen Abfrage selektieren muss.

Nehmen wir als Beispiel ein kleines Shop-System, dass auf Microsoft-Access Datenbanken
basiert. Dieses System wird eine Datenbank haben, in der die Warenkörbe gespeichert sind.
Da z.B. Artikeldaten aber Bewegungsdaten sind (also sich öfters mal ändern) ist die Speicherung
dieser Daten in der gleichen Datenbank nicht sinnvoll, da in den meisten Fällen die Artikeldatenbank
downgeloadet wird, der Artikelstamm aktualisiert und die Datenbank wieder hochgeladen wird.
Wenn dies passiert, würde man sich in dieser Zwischenzeit eigegangene Bestellungen überschreiben.
Daher wird für solche Daten (auch Kundendaten) meist eine eigene Datenbank verwendet.

Das nachfolgende Beispiel selektiert zu allen Artikeln aus den Warenkörben der Datenbank
"db_wkorb.mdb" die Artikelnamen aus der Datenbank "db_artikel.mdb". Dies stellt ein
sinnvolles Beispiel dar, da im Warenkorb normalerweise nur die Artikelnummern, nicht aber
die Artikelnamen gespeichert werden. Für Auswertungen oder Auflistungen wird aber der
Artikelname benötigt (denn wer kennt alle seine Artikel schon alleine durch die Artikelnummer)

<%
' --- Zusammenstellen der Datenbankverbindungsinformationen
Dim strProvider
    strProvider = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
Dim strDatabase
    strDatabase = "DATA SOURCE=" & Server.MapPath ("./") & "\db_wkorb.mdb;"
Dim strComplete
    strComplete = strProvider & strDatabase

' --- Öffnen der Datenbankverbindung mit der Hauptdatenbank
' --- Das Datenbankobjekt muss auf jeden Fall geöffnet sein,
' --- damit die Abfragen funktionieren
Set objConn = Server.CreateObject("ADODB.Connection")
    objConn.open strComplete

' --- Ermitteln der absoluten Datenbankpfade  
' --- Die Hauptdatenbank (mit der das Connectionobjekt geöffnet wurde, muss
' --- nicht angegeben werden, aber aus Übersichtlichkeitsgründen wird empfohlen,
' --- Präfixe für alle Datenbanken anzugeben (nur bei Abfragen über mehrere
' --- Datenbanken.
    WarenkorbDB = Server.MapPath("./") & "\db_wkorb.mdb"
    ArtikelDB   = Server.MapPath("./") & "\db_artikel.mdb"

' --- Um Probleme mit evtl. Pfadangaben (Sonderzeichen, Leerzeichen, ...)
' --- zu vermeiden, sollte der Pfad dann noch in [...] eingeklammert werden.
    WarenkorbDB = "[" & WarenkorbDB & "]"
    ArtikelDB   = "[" & ArtikelDB & "]"

' --- Erstellen des SQL-Statements    
' --- Hierbei wird im Gegensatz zu "normalen" SQL-Statements der absolute
' --- Pfad der Datenbank, in der sich die Tabelle befindet, dem Tabellennamen
' --- als Präfix vorangestellt (z.B.: C:\inetpub\wwwroot\test.mdb.tabellenname)
' --- Dieser Pfad wird aus Einfachheitsgründen in Variablen geschrieben
' --- (siehe voriger Absatz)
    SQL = SQL & "SELECT tblWarenkorb.w_anzahl, tblArtikel.a_name "
    SQL = SQL & "FROM " & WarenkorbDB & ".tblWarenkorb, " & ArtikelDB & ".tblArtikel "
    SQL = SQL & "WHERE tblWarenkorb.w_a_id = tblArtikel.a_id"

' --- Ab hier wird ganz normal auf das Recordset
' --- und dessen Felder zugegriffen.
Set objRS = Server.CreateObject("ADODB.Recordset")
    objRS.Open SQL, objConn, 3, 3

    ' --- Ausgabe der Überschriften
    Response.Write "<table>" & vbCrLf
    Response.Write "<tr>" & vbCrLf
    Response.Write "<td>Artikelname</td>" & vbCrLf
    Response.Write "<td>Anzahl</td>" & vbCrLf
    Response.Write "</tr>" & vbCrLf

    ' --- Ausgabe der Datensätze
    Do While Not objRS.EOF
        Response.Write "<tr>" & vbCrLf
        Response.Write "<td>" & objRS.Fields("a_name") & "</td>" & vbCrLf
        Response.Write "<td>" & objRS.Fields("w_anzahl") & "</td>" & vbCrLf
        Response.Write "</tr>" & vbCrLf
        objRS.MoveNext
    Loop

    ' --- Abschliessen der Tabelle
    Response.Write "</table>" & vbCrLf

' --- Schliessen und zerstören der Objekte
    objRS.Close
Set objRS = Nothing
    
    objConn.Close
Set objConn = Nothing
%>

Zum Verständnis noch einmal eine kurze Zusammenfassung: Sie können Tabellen
mehrerer Datenbanken in Ihrer Anwendung fast genauso abfragen, als wenn die
Tabellen in einer Datenbank gespeichert wären. Der einzigste Unterschied ist
die Angabe des vollständigen Pfads der Datenbank als Präfix der Tabellen.

Anstatt "SELECT t1.feld1, t2.feld2 FROM t1, t2 WHERE t1.id = t2.id" schreiben Sie
"SELECT t1.feld1, t2.feld2 FROM C:\dbpfad\db1.mdb.t1, C:\dbpfad\db2.mdb.t2 WHERE t1.id = t2.id"

Da dieses Beispiel ja doch etwas umfangreicher ist, haben wir Ihnen den Quelltext
und die verwendeten Datenbank in einer Zip-Datei zum Download bereitgestellt.
Somit können Sie dieses Beispiel direkt lokal auf Ihrem Webserver ausprobieren.

artikel_95.zip [23 KB]

Sehr gut
1 2 3 4 5 6
Ungenügend
Zurück | Bisherige Aufrufe: 21824 | Bisherige Bewertungen: 31 | Durchschnitt: 1,29
Stefan Falz Webconsulting