Kapitel 12: RdS-Tutorial (Remote Data Service)
Gilt für: Access 2013, Office 2013
Dieses Lernprogramm zeigt, wie eine Datenquelle mit dem RDS-Programmiermodell abgefragt und aktualisiert wird. Zunächst werden die Schritte beschrieben, die für diese Aufgabe nötig sind. Anschließend wird das Tutorial in Microsoft Visual Basic Scripting Edition und Microsoft Visual J++ mit ADO für Windows Foundation-Klassen (ADO/WFC) wiederholt.
Aus zwei Gründen enthält dieses Lernprogramm Code in verschiedenen Sprachen:
Die Dokumentation für RDS setzt voraus, dass der Leser Visual Basic-Code verwendet. Dadurch eignet sich die Dokumentation besonders für Visual Basic-Programmierer, für Programmierer anderer Sprachen ist sie jedoch weniger praktisch.
Wenn Sie bei einem bestimmten Feature von RDS unsicher sind und gewisse Sprachkenntnisse in einer anderen Sprache haben, finden Sie vielleicht eine Lösung zu Ihrer Frage, indem Sie nach demselben Feature in einer anderen Sprache suchen.
Dieses Lernprogramm basiert auf dem RDS-Programmiermodell. Die jeweiligen Schritte des Programmiermodells werden dabei einzeln vorgestellt. Darüber hinaus wird jeder Schritt durch einen Ausschnitt eines Visual Basic-Codes veranschaulicht.
Das Codebeispiel wird ohne ausführliche Erläuterungen in weiteren Sprachen wiederholt. Jeder Schritt in einem Lernprogramm einer bestimmten Sprache ist mit dem entsprechenden Schritt im Programmiermodell und dem erläuternden Lernprogramm gekennzeichnet. Anhand der Schrittnummer finden Sie die Erläuterungen im Lernprogramm.
Das RDS-Programmiermodell wird unten aufgeführt. Verwenden Sie es als Leitfaden, wenn Sie das Lernprogramm durchgehen.
RDS-Programmiermodell mit Objekten
Geben Sie das auf dem Server aufzurufende Programm an, und ermitteln Sie eine Möglichkeit (Proxy), vom Client darauf zu verweisen.
Aufrufen des Serverprogramms. Übergeben von Parametern an das Serverprogramm, die die Datenquelle und den auszugebenden Befehl identifizieren.
Das Serverprogramm ruft ein Recordset-Objekt aus der Datenquelle ab, in der Regel unter Verwendung von ADO. Das Recordset-Objekt kann optional auf dem Server verarbeitet werden.
Das Serverprogramm gibt das endgültige Recordset-Objekt an die Clientanwendung zurück.
Auf dem Client wird das Recordset-Objekt optional in eine Form gebracht, die leicht von visuellen Steuerelementen verwendet werden kann.
Änderungen am Recordset-Objekt werden zurück an den Server gesendet und zur Aktualisierung der Datenquelle verwendet.
Schritt 1: Angeben eines Serverprogramms
Verwenden Sie im Allgemeinen den RDS. DataSpace-ObjektCreateObject-Methode zum Angeben des Standardserverprogramms , RDSServer.DataFactory oder Ihres eigenen benutzerdefinierten Serverprogramms (Geschäftsobjekt). Ein Serverprogramm wird auf dem Server instanziiert, und ein Verweis auf das Serverprogramm bzw. den Proxy wird zurückgegeben.
In diesem Lernprogramm wird das Standardserverprogramm verwendet:
Sub RDSTutorial1()
Dim DS as New RDS.DataSpace
Dim DF as Object
Set DF = DS.CreateObject("RDSServer.DataFactory", "https://yourServer")
...
Schritt 2: Aufrufen des Serverprogramms
Wenn Sie auf dem Clientproxy eine Methode aufrufen, wird die Methode vom tatsächlichen Programm auf dem Server ausgeführt. In diesem Schritt führen Sie eine Abfrage auf dem Server durch.
Teil A
Wenn Sie in diesem Lernprogramm nicht RDSServer.DataFactory verwenden würden, wäre die Verwendung des RDS.DataControl-Objekts bei diesem Schritt am praktischsten. Das RDS.DataControl-Objekt verbindet den vorherigen Schritt des Erstellens eines Proxys mit diesem Schritt des Erstellens einer Abfrage.
Legen Sie den RDS fest. DataControl-ObjektServereigenschaft , um zu identifizieren, wo das Serverprogramm instanziiert werden soll.
Legen Sie die Connect-Eigenschaft fest, um die Verbindungszeichenfolge für den Zugriff auf die Datenquelle anzugeben.
Legen Sie die SQL-Eigenschaft fest, um den Abfragebefehlstext anzugeben.
Geben Sie die Refresh-Methode aus, damit das Serverprogramm eine Verbindung mit der Datenquelle herstellt, von der Abfrage angegebene Zeilen abruft und ein Recordset-Objekt an den Client zurückgibt.
In diesem Lernprogramm wird zwar kein RDS.DataControl -Objekt verwendet, es würde jedoch folgendermaßen auftreten:
Sub RDSTutorial2A()
Dim DC as New RDS.DataControl
DC.Server = "https://yourServer"
DC.Connect = "DSN=Pubs"
DC.SQL = "SELECT * FROM Authors"
DC.Refresh
...
In diesem Lernprogramm wird RDS auch nicht mit ADO-Objekten aufgerufen, was folgendermaßen aussehen würde:
Dim rs as New ADODB.Recordset
rs.Open "SELECT * FROM Authors","Provider=MS Remote;Data Source=Pubs;" & _
"Remote Server=https://yourServer;Remote Provider=SQLOLEDB;"
Teil B
Im Allgemeinen wird dieser Schritt ausgeführt, indem die Query-Methode des RDSServer.DataFactory-Objekts aufgerufen wird. In diese Methode wird anhand einer Verbindungszeichenfolge eine Verbindung mit der Datenquelle hergestellt, und mit einem Befehlstext werden die Zeilen angegeben, die aus der Datenquelle zurückgegeben werden sollen.
In diesem Lernprogramm wird die Query -Methode des DataFactory -Objekts verwendet:
Sub RDSTutorial2B()
Dim DS as New RDS.DataSpace
Dim DF
Dim RS as ADODB.Recordset
Set DF = DS.CreateObject("RDSServer.DataFactory", "https://yourServer")
Set RS = DF.Query ("DSN=Pubs", "SELECT * FROM Authors")
...
Schritt 3: Server ruft ein Recordset ab
Das Serverprogramm verwendet die Verbindungszeichenfolge und den Befehlstext, um die gewünschten Zeilen in der Datenquelle abzufragen. In der Regel wird ADO zum Abrufen dieses Recordset-Objekts verwendet, obwohl auch andere Datenzugriffsschnittstellen verwendet werden könnten (z. B. OLE DB).
Ein benutzerdefiniertes Serverprogramm kann folgendermaßen aussehen:
Public Function ServerProgram(cn as String, qry as String) as Object
Dim rs as New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Open qry, cn
rs.ActiveConnection = Nothing
Set ServerProgram = rs
End Function
Schritt 4: Der Server gibt das Recordset zurück
RDS konvertiert das abgerufene Recordset-Objekt in ein Formular, das an den Client zurückgesendet werden kann (d. a. es marshallt das Recordset-Objekt). Die genaue Form der Konvertierung und wie sie gesendet wird, hängt davon ab, ob sich der Server im Internet oder in einem Intranet, in einem lokalen Netzwerk oder in einer Dynamic Link-Bibliothek befindet. Dieses Detail ist jedoch nicht kritisch. Wichtig ist nur, dass RDS das Recordset zurück an den Client sendet.
Auf dem Client wird ein Recordset -Objekt an eine lokale Variable zurückgegeben und dieser Variablen zugewiesen.
Sub RDSTutorial4()
Dim DS as New RDS.DataSpace
Dim RS as ADODB.Recordset
Dim DF as Object
Set DF = DS.CreateObject("RDSServer.DataFactory", "https://yourServer")
Set RS = DF.Query("DSN=Pubs", "SELECT * FROM Authors")
...
Schritt 5: DataControl wird nutzbar gemacht
Das zurückgegebene Recordset-Objekt kann verwendet werden. Sie können es wie jedes andere Recordset-Objekt überprüfen, bearbeiten oder darin navigieren. Die Bearbeitungsmöglichkeiten des Recordset-Objekts hängen von der Umgebung ab. Visual Basic und Visual C++ besitzen visuelle Steuerelemente, die ein Recordset-Objekt direkt oder indirekt mithilfe eines aktivierenden Datensteuerelements verwenden können.
Wenn Sie beispielsweise eine Webseite in Internet Explorer anzeigen, können Sie die Recordset-Objektdaten in einem visuellen Steuerelement anzeigen. Visuelle Steuerelemente auf einer Webseite können nicht direkt auf ein Recordset-Objekt zugreifen. Der Zugriff auf das Recordset ist jedoch über das RDS.DataControl-Objekt möglich. Das RDS.DataControl-Objekt kann von einem visuellen Steuerelement verwendet werden, wenn seine SourceRecordset-Eigenschaft auf das Recordset-Objekt festgelegt ist.
Der DATASRC-Parameter eines visuellen Steuerelements muss auf RDS.DataControl und seine DATAFLD-Eigenschaft auf ein Recordset-Objektfeld (Spalte) festgelegt sein.
In diesem Lernprogramm legen Sie die SourceRecordset-Eigenschaft fest:
Sub RDSTutorial5()
Dim DS as New RDS.DataSpace
Dim RS as ADODB.Recordset
Dim DC as New RDS.DataControl
Dim DF as Object
Set DF = DS.CreateObject("RDSServer.DataFactory", "https://yourServer")
Set RS = DF.Query ("DSN=Pubs", "SELECT * FROM Authors")
DC.SourceRecordset = RS ' Visual controls can now bind to DC.
...
Schritt 6: Änderungen werden an den Server gesendet
Beim Bearbeiten eines Recordset -Objekts können alle Änderungen (d. h. hinzugefügte, geänderte oder gelöschte Zeilen) zurück an den Server gesendet werden.
[!HINWEIS] Das Standardverhalten von RDS kann implizit mit ADO-Objekten und dem Microsoft OLE DB-Anbieter für Remoting aufgerufen werden. Abfragen können Recordsets zurückgeben, und bearbeitete Recordsets können die Datenquelle aktualisieren. In diesem Lernprogramm wird RDS nicht mit ADO-Objekten aufgerufen, was folgendermaßen aussehen würde:
Dim rs as New ADODB.Recordset
rs.Open "SELECT * FROM Authors","Provider=MS Remote;Data Source=Pubs;" & _
"Remote Server=https://yourServer;Remote Provider=SQLOLEDB;"
... ' Edit the Recordset.
rs.UpdateBatch ' The equivalent of SubmitChanges.
...
Teil A
Gehen Sie in diesem Fall davon aus, dass Sie nur das RDS.DataControl-Objekt verwendet haben und dass ein Recordset-Objekt nun mit dem RDS.DataControl-Objekt verknüpft ist. Die Datenquelle wird durch die SubmitChanges-Methode mit allen Änderungen am Recordset-Objekt aktualisiert, wenn die Eigenschaften Server und Connect noch festgelegt sind.
Sub RDSTutorial6A()
Dim DC as New RDS.DataControl
Dim RS as ADODB.Recordset
DC.Server = "https://yourServer"
DC.Connect = "DSN=Pubs"
DC.SQL = "SELECT * FROM Authors"
DC.Refresh
...
Set RS = DC.Recordset
' Edit the Recordset.
...
DC.SubmitChanges
...
Teil B
Sie können alternativ den Server mit dem RDSServer.DataFactory-Objekt aktualisieren und eine Verbindung sowie ein Recordset-Objekt angeben.
Sub RDSTutorial6B()
Dim DS As New RDS.DataSpace
Dim RS As ADODB.Recordset
Dim DC As New RDS.DataControl
Dim DF As Object
Dim blnStatus As Boolean
Set DF = DS.CreateObject("RDSServer.DataFactory", "https://yourServer")
Set RS = DF.Query ("DSN=Pubs", "SELECT * FROM Authors")
DC.SourceRecordset = RS ' Visual controls can now bind to DC.
' Edit the Recordset.
blnStatus = DF.SubmitChanges "DSN=Pubs", RS
End Sub
Anhang A: RDS-Tutorial (VBScript)
Dies ist das RDS-Tutorial, das in Microsoft Visual Basic Scripting Edition geschrieben wurde. Eine Beschreibung des Zwecks dieses Tutorials finden Sie in der Einführung in dieses Thema.
In diesem Tutorial wird RDS verwendet. DataControl und RDS. DataSpaces werden zur Entwurfszeit erstellt. Das heißt, sie werden mit Objekttags definiert. Alternativ können diese Objekte auch zur Laufzeit mit der Server.CreateObject -Methode erstellt werden.
Sie können das RDS.DataControl -Objekt beispielsweise folgendermaßen erstellen:
Set DC = Server.CreateObject("RDS.DataControl")
<!-- RDS.DataControl -->
<OBJECT
ID="DC1" CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E33">
</OBJECT>
<!-- RDS.DataSpace -->
<OBJECT
ID="DS1" WIDTH=1 HEIGHT=1
CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
</OBJECT>
<SCRIPT LANGUAGE="VBScript">
Sub RDSTutorial()
Dim DF1
Schritt 1: Angeben eines Serverprogramms
VBScript kann den Namen des IIS-Webservers ermitteln, auf dem es ausgeführt wird, indem auf die VBScript Request.ServerVariables-Methode zugegriffen wird, die für Active Server Pages verfügbar ist:
"https://<%=Request.ServerVariables("SERVER_NAME")%>"
Verwenden Sie für dieses Tutorial jedoch den imaginären Server "yourServer".
Hinweis
Pay attention to the data type of ByRef arguments. VBScript does not let you specify the variable type, so you must always pass a Variant. When using HTTP, RDS will allow you to pass a Variant to a method that expects a non-Variant if you invoke it with the RDS.DataSpace object CreateObject method. When using DCOM or an in-process server, match the parameter types on the client and server sides or you will receive a "Type Mismatch" error.
Set DF1 = DS1.CreateObject("RDSServer.DataFactory", "https://yourServer")
Schritt 2, Teil A: Aufrufen des Serverprogramms mit RDS. DataControl
Das folgende Beispiel dient lediglich zur Veranschaulichung, dass das Standardverhalten des RDS.DataControl -Objekts im Ausführen der angegebenen Abfrage besteht.
<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="DC1">
<PARAM NAME="SQL" VALUE="SELECT * FROM Authors">
<PARAM NAME="Connect" VALUE="DSN=Pubs;">
<PARAM NAME="Server" VALUE="https://yourServer/">
</OBJECT>
...
<SCRIPT LANGUAGE="VBScript">
Sub RDSTutorial2A()
Dim RS
DC1.Refresh
Set RS = DC1.Recordset
...
Fahren Sie mit dem folgenden Schritt fort.
Schritt 4: Der Server gibt das Recordset zurück
Set RS = DF1.Query("DSN=Pubs;", "SELECT * FROM Authors")
Schritt 5: DataControl wird durch visuelle Steuerelemente nutzbar gemacht
' Assign the returned recordset to the DataControl.
DC1.SourceRecordset = RS
Schritt 6, Teil A: Änderungen werden mit RDS an den Server gesendet. DataControl
Das folgende Beispiel dient lediglich zur Veranschaulichung, wie das RDS.DataControl -Objekt Aktualisierungen ausführt.
<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="DC1">
<PARAM NAME="SQL" VALUE="SELECT * FROM Authors">
<PARAM NAME="Connect" VALUE="DSN=Pubs;">
<PARAM NAME="Server" VALUE="https://yourServer/">
</OBJECT>
...
<SCRIPT LANGUAGE="VBScript">
Sub RDSTutorial6A()
Dim RS
DC1.Refresh
...
Set RS = DC1.Recordset
' Edit the Recordset object...
' The SERVER and CONNECT properties are already set from Step 2A.
Set DC1.SourceRecordset = RS
...
DC1.SubmitChanges
Schritt 6, Teil B: Änderungen werden mit RDSServer.DataFactory an den Server gesendet
DF.SubmitChanges"DSN=Pubs", RS
End Sub
</SCRIPT>
</BODY>
</HTML>
Anhang B: RDS-Tutorial (Visual J++)
ADO/WFC entspricht insofern, als das RDS.DataControl-Objekt nicht implementiert wird, nicht vollständig dem RDS-Objektmodell. ADO/WFC implementiert lediglich die clientseitige Klasse RDS.DataSpace.
Die DataSpace -Klasse implementiert eine CreateObject-Methode, die wiederum ein ObjectProxy-Objekt zurückgibt. Die DataSpace -Klasse implementiert auch die InternetTimeout-Eigenschaft.
The ObjectProxy class implements one method, call, which can invoke any server-side business object.
import com.ms.wfc.data.*;
public class RDSTutorial
{
public void tutorial()
{
// Step 1: Specify a server program.
ObjectProxy obj =
DataSpace.createObject(
"RDSServer.DataFactory",
"https://YourServer");
// Step 2: Server returns a Recordset.
Recordset rs = (Recordset) obj.call(
"Query",
new Object[] {"DSN=Pubs;", "SELECT * FROM Authors"});
// Step 3: Changes are sent to the server.
... // Edit Recordset.
obj.call(
"SubmitChanges",
new Object[] {"DSN=Pubs;", rs});
return;
}
}