16.5 Ein DataSet-Objekt übertragen
 
Der einzige Datentyp von ADO.NET, der über einen Web Service übertragen werden kann, ist der Typ DataSet. Im Prinzip funktioniert das Verfahren ganz analog zur Übertragung des Strings Hallo und soll kurz demonstriert werden.
Als Übung soll die Tabelle Versandfirmen aus der Nordwind-Datenbank über einen Web Service übertragen werden. Die Beispieldatei db_08.aspx zeigt diese Tabelle im Browser an, ohne dass die Daten über einen Web Service übertragen werden. Im Prinzip teilt die folgende Übung die Funktionalität von db_08.aspx in zwei Teile. Der eine Server besorgt die Daten und schickt sie per Web Service zum zweiten Server, der die Daten in seine aspx-Seite einbaut und diese dann zum Browser schickt.
Wenn Sie den Code eigenhändig nachvollziehen, werden Sie bemerken, dass Sie den Code von db_08.aspx fast vollständig übernehmen können, und zwar die eine Hälfte für den Web Service und die andere Hälfte für die aspx-Datei, die die Daten anzeigt. Dazwischen steht »nur« die Übertragung, die für einen Entwickler damit fast vollständig transparent wird.
16.5.1 Den Web Service in einer asmx-Datei erstellen
 
Dieser Web Service wird in der Datei webservice03.asmx implementiert. Die Datei enthält die Methode getVersandfirmen. Diese Methode liefert ein DataSet-Objekt mit der Tabelle Versandfirmen. webservice03.asmx hat diese Form:
<!-- webservice03.asmx -->
<%@ WebService Language="VB" Class="webservice03" %>
Imports System.Data
Imports System.Data.OleDb
Imports System.Web.Services
<WebService( _
Description := _
"Bietet Zugriff auf die Nordwind-Datenbank.", _
Namespace := "http://mlohrer.de/services")> _
Public Class webservice03 : Inherits WebService
<WebMethod( _
Description := _
"Liefert die Tabelle Versandfirmen.", _
EnableSession := False)> _
Public Function getVersandfirmen() As DataSet
' Verbindungszeichenfolge zusammensetzen
Dim connStr As String
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;"
connStr += "Data Source="
connStr += "E:\ASPdotNETBuch\Listings\"
connStr += "Nordwind.mdb;"
' Verbindung zur Datenbank herstellen
Dim conn As New OleDbConnection(connStr)
conn.Open()
' SQL-Kommando erstellen und ausführen
Dim sql As String
sql = "SELECT * FROM Versandfirmen"
Dim cmd As New OleDbCommand(sql, conn)
Dim myAdapter As New OleDbDataAdapter()
myAdapter.SelectCommand = cmd
Dim myDS As New DataSet()
myAdapter.Fill (myDS)
conn.Close()
Return (myDS) ' DataSet-Objekt zurückgeben
End Function
End Class
webservice03.asmx enthält keine neuen Merkmale. Die Funktion getVersandfirmen() erhält das Attribut WebMethod. In der Deklaration wird festgelegt, dass die Methode ein Objekt vom Typ DataSet zurückgibt. Der Code innerhalb dieser Funktion entspricht haargenau dem Code, den auch die Beispieldatei db_08.aspx in ihrer Prozedur Page_Load verwendet. Damit wird deutlich, dass auf der Seite des Web Services keinerlei Besonderheiten zu berücksichtigen sind, wenn statt eines einfachen Strings der komplexe Datentyp DataSet ausgeliefert werden soll.
16.5.2 Die Proxyklasse erzeugen
 
Gedanklich springen Sie jetzt wieder zum zweiten Rechner, der diesen Web Service nutzen will. Hier benötigen Sie eine Proxyklasse, um den Service ansprechen zu können. Den VB-Quellcode für diese Proxyklasse erzeugen Sie mit diesem Aufruf:
wsdl /l:vb /n:DBWebServices
http://localhost/ASPdotNETBuch/Listings/webservice03.asmx?WSDL
Diesen Code kompilieren Sie mit diesem Aufruf:
vbc /t:library /out:../bin/DBWebServices.dll /r:System.dll
/r:System.Data.dll /r:System.Xml.dll /r:System.Web.Services.dll webservice03.vb
Beim Kompilieren müssen Sie zusätzlich die Bibliothek System.Data.dll referenzieren. Damit steht Ihnen die Proxyklasse zur Verfügung. webservice03.aspx verwendet diese Klasse, ruft das DataSet ab und stellt es in einem DataGrid-Steuerelement dar.
<!-- webservice03.aspx -->
<%@ Page language="VB" strict="true" debug="true" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.OleDb" %>
<script runat="server">
Sub Page_Load (ByVal Sender As Object, _
ByVal E As EventArgs)
Dim w As new DBWebServices.webservice03
Dim myDS As New DataSet()
myDS = w.getVersandfirmen()
myGrid.DataSource = myDS
DataBind()
End Sub
</script>
<html><head>
<title>Datenbank-Webservice</title>
</head><body>
<p>
Die Tabelle Versandfirmen aus der Nordwind-Datenbank:
</p>
<asp:DataGrid id="myGrid" runat="server" />
</body></html>
Abbildung 16.7 zeigt das Endergebnis im Browser. Im Browser ist nicht mehr zu erkennen, dass die dargestellten Daten nicht von dem direkt angesprochenen Webserver, sondern von einem anderen Server stammen. Genau dieser Effekt ist erwünscht. Die übertragenen Daten fügen sich nahtlos ein und können vom Webserver genau so verarbeitet werden, als wenn es »eigene« Daten wären.
 Hier klicken, um das Bild zu Vergrößern
Abbildung 16.7 Im Browser ist nicht mehr zu erkennen, dass das dargestellte DataSet über einen Web Service ermittelt wurde
|