Глава 12. Руководство по удаленной службе данных (RDS)
Область применения: Access 2013, Office 2013
В этом руководстве показано использование модели программирования RDS для запроса и обновления источника данных. Во-первых, в нем описаны шаги, необходимые для выполнения этой задачи. Затем учебник повторяется в Microsoft Visual Basic Scripting Edition и Microsoft Visual J++, включая ADO для классов Windows Foundation (ADO/WFC).
Это руководство кодируется на разных языках по двум причинам:
В документации по RDS предполагается, что коды чтения в Visual Basic. Это делает документацию удобной для программистов Visual Basic, но менее полезной для программистов, использующих другие языки.
Если вы не уверены в конкретной функции RDS и знаете немного другой язык, возможно, вы сможете решить свой вопрос, найдите ту же функцию, выраженную на другом языке.
Это руководство основано на модели программирования RDS. Каждый шаг модели программирования рассматривается отдельно. Кроме того, он иллюстрирует каждый шаг фрагментом кода Visual Basic.
Пример кода повторяется на других языках с минимальным обсуждением. Каждый шаг в данном учебнике по языку программирования помечается соответствующим шагом в модели программирования и описательном руководстве. Используйте номер шага, чтобы сослаться на обсуждение в описательном руководстве.
Ниже описана модель программирования RDS. Используйте его в качестве стратегии при работе с руководством.
Модель программирования RDS с объектами
Укажите программу, которую необходимо вызвать на сервере, и получите способ (прокси-сервер) для ссылки на нее от клиента.
Вызов серверной программы. Передайте параметры в серверную программу, которая идентифицирует источник данных и выдающуюся команду.
Серверная программа получает объект Recordset из источника данных, как правило, с помощью ADO. При необходимости объект Recordset обрабатывается на сервере.
Серверная программа возвращает окончательный объект Recordset клиентскому приложению.
На клиенте объект Recordset при необходимости помещается в форму, которую можно легко использовать визуальными элементами управления.
Изменения объекта Recordset отправляются обратно на сервер и используются для обновления источника данных.
Шаг 1. Указание серверной программы
В самом общем случае используйте RDS. Метод CreateObject объекта DataSpace для указания серверной программы по умолчанию, RDSServer.DataFactory или собственной пользовательской серверной программы (бизнес-объекта). На сервере создается экземпляр серверной программы, и возвращается ссылка на серверную программу или прокси-сервер.
В этом руководстве используется серверная программа по умолчанию:
Sub RDSTutorial1()
Dim DS as New RDS.DataSpace
Dim DF as Object
Set DF = DS.CreateObject("RDSServer.DataFactory", "https://yourServer")
...
Шаг 2. Вызов серверной программы
При вызове метода на прокси-сервере клиента фактически программа на сервере выполняет метод . На этом шаге вы выполните запрос на сервере.
Часть А
Если вы не использовали RDSServer.DataFactory в этом руководстве, наиболее удобным способом выполнения этого шага было бы использование RDS. Объект DataControl . RDS. DataControl объединяет предыдущий шаг создания прокси-сервера, а этот шаг — выдачу запроса.
Задайте RDS. Свойство Server объекта DataControl, определяющее, где должен быть создан экземпляр серверной программы.
Задайте свойство Connect , чтобы указать строку подключения для доступа к источнику данных.
Задайте свойство SQL , чтобы указать текст команды запроса.
Вызовите метод Refresh , чтобы серверная программа подключилась к источнику данных, извлекла строки, указанные в запросе, и возвращала клиенту объект Recordset .
В этом руководстве не используется RDS. DataControl, но вот как он будет выглядеть, если бы он сделал:
Sub RDSTutorial2A()
Dim DC as New RDS.DataControl
DC.Server = "https://yourServer"
DC.Connect = "DSN=Pubs"
DC.SQL = "SELECT * FROM Authors"
DC.Refresh
...
В этом руководстве также не вызывается RDS с объектами ADO, но в этом случае он будет выглядеть следующим образом:
Dim rs as New ADODB.Recordset
rs.Open "SELECT * FROM Authors","Provider=MS Remote;Data Source=Pubs;" & _
"Remote Server=https://yourServer;Remote Provider=SQLOLEDB;"
Часть Б
Общий метод выполнения этого шага заключается в вызове метода query объекта RDSServer.DataFactory. Этот метод принимает строку подключения, которая используется для подключения к источнику данных, и текст команды, который используется для указания строк, возвращаемых из источника данных.
В этом руководстве используется метод запроса объекта DataFactory:
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")
...
Шаг 3. Сервер получает набор записей
Серверная программа использует строку подключения и текст команды для запроса источника данных на нужные строки. ADO обычно используется для получения этого набора записей, хотя можно использовать другие интерфейсы доступа к данным Майкрософт, такие как OLE DB.
Настраиваемая серверная программа может выглядеть следующим образом:
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
Шаг 4. Сервер возвращает набор записей
RDS преобразует полученный объект Recordset в форму, которая может быть отправлена обратно клиенту (то есть маршалируетнабор записей). Точная форма преобразования и способ его отправки зависит от того, находится ли сервер в Интернете или интрасети, локальной сети или является библиотекой динамической компоновки. Однако эта информация не является критической; Все, что имеет значение, это то, что RDS отправляет набор записей обратно клиенту.
На стороне клиента возвращается объект Recordset и назначается локальной переменной.
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")
...
Шаг 5. DataControl становится доступным для использования
Возвращенный объект Recordset доступен для использования. Вы можете просматривать, перемещаться по нему или изменять его так же, как и любой другой набор записей. Действия, которые можно сделать с набором записей , зависят от вашей среды. Visual Basic и Visual C++ имеют визуальные элементы управления, которые могут прямо или косвенно использовать набор записей с помощью включения элемента управления данными.
Например, если веб-страница отображается в интернет-Обозреватель, может потребоваться отобразить данные объекта Recordset в визуальном элементе управления. Визуальные элементы управления на веб-странице не могут напрямую получить доступ к объекту Recordset . Однако они могут получить доступ к объекту Recordset через RDS. DataControl. RDS. DataControl становится доступным для использования визуальным элементом управления, если его свойству SourceRecordset присвоено значение объекта Recordset.
Объект визуального элемента управления должен иметь параметр DATASRC , равный RDS. DataControl и его свойству DATAFLD присвоено поле объекта Recordset (столбец).
В этом руководстве задайте свойство SourceRecordset :
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.
...
Шаг 6. Изменения отправляются на сервер
Если объект Recordset изменен, все изменения (т. е. добавленные, измененные или удаленные строки) могут быть отправлены обратно на сервер.
Поведение RDS по умолчанию может вызываться неявно с помощью объектов ADO и поставщика удаленного взаимодействия Microsoft OLE DB. Запросы могут возвращать наборы записей, а измененные наборы записей — обновлять источник данных. В этом руководстве не вызывается RDS с объектами ADO, но в этом случае он будет выглядеть следующим образом:
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.
...
Часть А
Предположим, что в этом случае вы использовали только RDS. DataControl и, что объект Recordset теперь связан с RDS. DataControl. Метод SubmitChanges обновляет источник данных с любыми изменениями в объекте Recordset , если свойства Server и Connect по-прежнему заданы.
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
...
Часть Б
Кроме того, можно обновить сервер с помощью объекта RDSServer.DataFactory , указав подключение и объект Recordset .
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
Приложение A. Руководство по RDS (VBScript)
Это руководство по RDS, написанное в Microsoft Visual Basic Scripting Edition. Описание целей этого руководства см. в статье Введение в этот раздел.
В этом руководстве описано , как RDS. DataControl и RDS. DataSpace создаются во время разработки; то есть они определяются с помощью тегов объектов. Кроме того, их можно создать во время выполнения с помощью метода Server.CreateObject .
Например, RDS. Объект DataControl можно создать следующим образом:
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
Шаг 1. Указание серверной программы
VBScript может обнаружить имя веб-сервера IIS, на котором он работает, перейдя к методу VBScript Request.ServerVariables, доступного для active Server Pages:
"https://<%=Request.ServerVariables("SERVER_NAME")%>"
Однако в этом руководстве используйте воображаемый сервер "yourServer".
Примечание.
Обратите внимание на тип данных аргументов ByRef . VBScript не позволяет указать тип переменной, поэтому необходимо всегда передавать значение Variant. При использовании HTTP RDS позволяет передать variant методу, который ожидает не Variant, если вы вызываете его с помощью RDS. Метод CreateObject объекта DataSpace. При использовании DCOM или внутрипроцессного сервера сопоставляйте типы параметров на стороне клиента и сервера, в противном случае вы получите ошибку "Несоответствие типов".
Set DF1 = DS1.CreateObject("RDSServer.DataFactory", "https://yourServer")
Шаг 2, часть А. Вызов серверной программы с помощью RDS. DataControl
Этот пример является просто комментарием, демонстрирующим поведение по умолчанию RDS. DataControl выполняет указанный запрос.
<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
...
Перейдите к следующему шагу.
Шаг 4. Сервер возвращает набор записей
Set RS = DF1.Query("DSN=Pubs;", "SELECT * FROM Authors")
Шаг 5. DataControl становится доступным для использования визуальными элементами управления
' Assign the returned recordset to the DataControl.
DC1.SourceRecordset = RS
Шаг 6, часть А. Изменения отправляются на сервер с помощью RDS. DataControl
Этот пример является просто комментарием, демонстрирующим, как работает RDS. DataControl выполняет обновления.
<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
Шаг 6, часть Б. Изменения отправляются на сервер с помощью RDSServer.DataFactory
DF.SubmitChanges"DSN=Pubs", RS
End Sub
</SCRIPT>
</BODY>
</HTML>
Приложение B. Руководство по RDS (Visual J++)
ADO/WFC не полностью соответствует объектной модели RDS, так как она не реализует RDS. Объект DataControl . ADO/WFC реализует только клиентский класс RDS. DataSpace.
Класс DataSpace реализует один метод CreateObject, который возвращает объект ObjectProxy . Класс DataSpace также реализует свойство InternetTimeout .
Класс ObjectProxy реализует один метод , вызов, который может вызвать любой серверный бизнес-объект.
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;
}
}