Capítulo 12: Tutorial do Serviço de Dados Remoto (RDS)

Aplica-se ao: Access 2013, Office 2013

Este tutorial ilustra o uso do modelo de programação RDS para consultar e atualizar uma fonte de dados. Primeiramente, ele descreve as etapas necessárias para realizar essa tarefa. Em seguida, o tutorial é repetido no Microsoft Visual Basic Scripting Edition e no Microsoft Visual J++, com o ADO for Windows Foundation Classes (ADO/WFC).

Este tutorial é codificado em diferentes linguagens por dois motivos:

  • A documentação do RDS assume os códigos do leitor no Visual Basic. Isso torna a documentação conveniente para programadores do Visual Basic, mas menos útil para os programadores que utilizam outras linguagens.

  • Se você não estiver certo quanto a um determinado recurso RDS e conhecer um pouco de outra linguagem, pode conseguir resolver sua questão para o mesmo recurso expresso em outra linguagem.

Esse tutorial é baseado no modelo de programação RDS. Ele discute cada etapa do modelo de programação individualmente. Além disso, ilustra cada etapa com um fragmento do código do Visual Basic.

O exemplo do código é repetido em outras linguagens com a discussão mínima. Cada etapa em um determinado tutorial de linguagem de programação está marcado com a etapa correspondente no modelo de programação e tutorial descritivo. Utilize o número da etapa para se referir à discussão no tutorial descritivo.

O modelo de programação RDS está indicado abaixo. Utilize-o como um roteiro conforme avança no tutorial.

Modelo de programação do RDS com objetos

  • Especifique o programa a ser chamado no servidor e obtenha uma maneira (proxy) de se referir a ele a partir do cliente.

  • Chame o programa do servidor. Transmita os parâmetros ao programa do servidor que identifica a fonte de dados e o comando a ser emitido.

  • O programa do servidor obtém um objeto Recordset da fonte de dados, geralmente usando o ADO. Opcionalmente, o objeto Recordset é processado no servidor.

  • O programa do servidor retorna o objeto Recordset final ao aplicativo cliente.

  • No cliente, o objeto Recordset é colocado opcionalmente em um formulário que pode ser facilmente usado por controle visuais.

  • As alterações ao objeto Recordset são enviadas de volta ao servidor e utilizadas para atualizar a fonte de dados.

Passo 1: Especificar um programa de servidor

No caso mais geral, use o objeto RDS.DataSpace do método CreateObject para especificar o programa do servidor padrão, RDSServer.DataFactory, ou seu próprio programa de servidor personalizado (objeto de negócios). Um programa de servidor é instanciado no servidor e uma referência ao programa do servidor, ou proxy, é retornada.

Este tutorial usa o programa do servidor padrão:

 
Sub RDSTutorial1() 
 Dim DS as New RDS.DataSpace 
 Dim DF as Object 
 Set DF = DS.CreateObject("RDSServer.DataFactory", "https://yourServer") 
... 

Passo 2: Invocar o programa de servidor

Ao chamar um método no proxy do cliente, o programa real no servidor executa o método. Nessa etapa, você executará uma consulta no servidor.

Parte A

Se você não não usou o RDSServer.DataFactory nesse tutorial, a maneira mais conveniente de executar essa etapa seria usar o objeto RDS.DataControl. O RDS.DataControl combina a etapa anterior da criação de um proxy, com essa etapa, emitindo a consulta.

  1. Defina o RDS. Propriedade servidor de objetos DataControl para identificar onde o programa de servidor deve ser instanciado.

  2. Defina a propriedade Ligar para especificar a cadeia de ligação para aceder à origem de dados.

  3. Defina a propriedade SQL para especificar o texto do comando de consulta.

  4. Emita o método Refresh para fazer com que o programa de servidor se ligue à origem de dados, obtenha as linhas especificadas pela consulta e devolva um objeto Conjunto de registos ao cliente.

Este tutorial não usa o RDS.DataControl, mas veja como seria se o fizesse:

 
Sub RDSTutorial2A() 
 Dim DC as New RDS.DataControl 
 DC.Server = "https://yourServer" 
 DC.Connect = "DSN=Pubs" 
 DC.SQL = "SELECT * FROM Authors" 
 DC.Refresh 
... 

Ele também não invoca RDS com objetos ADO, mas veja como seria se o fizesse:

 
Dim rs as New ADODB.Recordset 
rs.Open "SELECT * FROM Authors","Provider=MS Remote;Data Source=Pubs;" & _ 
"Remote Server=https://yourServer;Remote Provider=SQLOLEDB;" 

Parte B

O método geral para executar esta etapa é invocar o método Query do objetoRDSServer.DataFactory. Esse método assume uma cadeia de conexão, que é usada para se conectar a uma origem de dados e um texto de comando, que é usada para especificar as linhas a serem retornadas a partir da origem de dados.

Este tutorial usa o método Query do objeto 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") 
... 

Passo 3: o servidor obtém um Conjunto de Registos

O programa do servidor usa a sequência de conexão e o texto de comando para consultar a fonte de dados para as linhas desejadas. O ADO geralmente é usado para recuperar esse Recordset, embora outras interfaces de acesso a dados da Microsoft, como o OLE DB, podem ser usadas.

Um programa de servidor personalizado pode parecer com:

 
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 

Passo 4: O servidor devolve o Conjunto de Registos

O RDS converte o objeto Recordset recuperado para um formato que pode ser enviado de volta ao cliente (ou seja, ele empacota o Recordset). O formato exato da conversão e como ele é gasto depende de o servidor estar na Internet ou na intranet, uma rede local ou é uma biblioteca de vínculos dinâmicos. Contudo, este detalhe não é crítico; o que importa é que o RDS envia o Recordset de volta ao cliente.

No lado cliente, um objeto Recordset é retornado e atribuído a uma variável local.

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

Passo 5: o DataControl torna-se utilizável

O objeto Recordset retornado está disponível para uso. Você pode examinar, navegar ou editá-lo como faria com qualquer outro Recordset. As possibilidades de uso do Recordset dependem do seu ambiente. O Visual Basic e o Visual C++ possuem controles visuais que podem utilizar um Recordset diretamente ou indiretamente com a ajuda de um controle de dados de ativação.

Por exemplo, se estiver a apresentar uma página Web na Internet Explorer, poderá querer apresentar os dados do objeto Conjunto de registos num controlo visual. Os controlos visuais numa página Web não conseguem aceder diretamente a um objeto Conjunto de registos . No entanto, podem acessar o objeto Recordset através do RDS.DataControl. O RDS.DataControl torna-se utilizável por um controle visual quando sua propriedade SourceRecordset for definida como o objeto Recordset.

O objeto de controle visual deve ter seu parâmetro DATASRC definido como RDS.DataControl e sua propriedade DATAFLD definida como um campo de objeto Recordset (coluna).

Nesse tutorial, defina a propriedade 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. 
... 

Passo 6: as alterações são enviadas para o servidor

Se o objeto Recordset for editado, todas as alterações (ou seja, linhas que são incluídas, alteradas ou excluídas) poderão ser enviadas de volta ao servidor.

[!OBSERVAçãO] O comportamento padrão do RDS pode ser chamado implicitamente com os objetos ADO e o Microsoft OLE DB Remoting Provider. As consultas podem devolver Conjuntos de registos e os Conjuntos de registos editados podem atualizar a origem de dados. Esse tutorial não chama o RDS com objetos ADO, mas veja como seria se o fizesse:

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

Parte A

Para esse caso assuma que você tenha usado apenas RDS.DataControl e que um objeto Recordset agora esteja associado ao RDS.DataControl. O método SubmitChanges atualiza a origem de dados com todas as alterações ao objeto Recordset se as propriedades Server e Connect ainda estiverem definidas.

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

Parte B

Como alternativa, você poderia atualizar o servidor com o objeto RDSServer.DataFactory, especificando uma conexão e um objeto 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 

Apêndice A: Tutorial de RDS (VBScript)

Este é o tutorial de RDS, escrito no Microsoft Visual Basic Scripting Edition. Para obter uma descrição da finalidade deste tutorial, veja a introdução a este tópico.

Neste tutorial, RDS. DataControl e RDS. O DataSpace é criado no momento da conceção; ou seja, são definidos com etiquetas de objeto. Como alternativa, eles podem ser criados no momento da execução com o método Server.CreateObject.

Por exemplo, o objeto RDS.DataControl pode ser criado dessa forma:

    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 

Passo 1: Especificar um programa de servidor

O VBScript pode detetar o nome do servidor Web do IIS no qual está a ser executado ao aceder ao método VBScript Request.ServerVariables disponível para As Páginas do Active Server:

 
"https://<%=Request.ServerVariables("SERVER_NAME")%>" 

No entanto, neste tutorial, utilize o servidor imaginário "yourServer".

Observação

[!OBSERVAçãO] Preste atenção nos tipos de dados dos argumentos ByRef. O VBScript não permite que você especifique o tipo de variável, então, você deve sempre transmitir uma Variant. Quando HTTP for utilizado, o RDS permitirá a transmissão de uma Variant para um método que espera uma non-Variant, se você chamá-lo com o método CreateObject do objeto RDS.DataSpace. Ao utilizar DCOM ou um servidor em execução, corresponda os tipos de parâmetros no cliente e no servidor; caso contrário, receberá um erro "Incompatibilidade de tipo".

 
Set DF1 = DS1.CreateObject("RDSServer.DataFactory", "https://yourServer") 

Passo 2, Parte A: Invocar o programa de servidor com RDS. DataControl

Esse exemplo é meramente um comentário para demonstrar que o comportamento padrão do RDS.DataControl destina-se a executar a consulta especificada.

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

Avance para o passo seguinte.

Passo 4: O servidor devolve o Conjunto de Registos

 
Set RS = DF1.Query("DSN=Pubs;", "SELECT * FROM Authors") 

Passo 5: o DataControl torna-se utilizável através de controlos visuais

 
' Assign the returned recordset to the DataControl. 
 
DC1.SourceRecordset = RS 

Passo 6, Parte A: as alterações são enviadas para o servidor com RDS. DataControl

Esse exemplo é meramente um comentário que demonstra como o RDS.DataControl executa as atualizações.

 
<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 

Passo 6, Parte B: as alterações são enviadas para o servidor com RDSServer.DataFactory

 
DF.SubmitChanges"DSN=Pubs", RS 
 
End Sub 
</SCRIPT> 
</BODY> 
</HTML> 

Apêndice B: Tutorial de RDS (Visual J++)

O ADO/WFC não segue completamente o modelo de objeto RDS porque não implementa o objeto RDS.DataControl. O ADO/WFC apenas implementa a classe do lado do cliente, RDS.DataSpace.

A classe DataSpace implementa um método, CreateObject, que retorna um objeto ObjectProxy. A classe DataSpace também implementa a propriedade InternetTimeout.

A classe ObjectProxy implementa um método, call, que pode chamar qualquer objeto de negócios do lado do servidor.

 
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; 
 } 
}