Não é possível criar um formulário a partir de um serviço Web que devolve um conjunto de dados do ADO.NET no InfoPath 2003

Traduções de Artigos Traduções de Artigos
Artigo: 822020 - Ver produtos para os quais este artigo se aplica.
Para obter uma Microsoft Visual Basic .NET versão deste artigo, consulte 831795.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando um formulário do InfoPath é criado a partir de um serviço Web que devolve um DataSet ADO.NET (System.Data.DataSet), poderá receber a seguinte mensagem de erro do InfoPath:
O ficheiro de dados XML contém informações de esquema XML, que não é permitido.

Causa

O InfoPath directamente não é possível utilizar o ADO.NET DataSets. O InfoPath funciona com payloads XML genéricos. ADO.NET DataSets retornadas pelo Web services são serializados como um formato XML especial que impede que o ADO.NET DataSets trabalhar directamente com o InfoPath.
  • No ficheiro Web Service Description Language) que define os métodos e as propriedades de um serviço Web, o tipo de DataSet é representado por uma tag de esquema abrir < xsd: qualquer / >. O InfoPath pode sugerir o esquema de um documento XML que é devolvido por um serviço Web. No entanto, O InfoPath tem de certificar uma amostra de chamada para fazer o serviço Web esta.
  • Um DataSet ADO.NET contém um esquema inline que descreve os dados armazenados na mesma. Esta versão do InfoPath não suporta esquemas inline.
  • Os dados de um DataSet ADO.NET são moldados num elemento XML <diffgr:diffgram> que não esteja descrito no esquema inline. Os elementos XML que contêm os dados do DataSet ADO.NET também têm atributos adicionais que não são descritos no esquema. Porque os dados não coincide com o esquema, não não possível validar os dados no formulário do InfoPath.
  • O InfoPath não tem suporte incorporado para alterações semelhante a um DataSet ADO.NET. Por exemplo, um DataSet ADO.NET controla os campos e as linhas que tenham sido adicionadas, alteradas ou eliminadas desde que as alterações foram últimos aceite. (Este é o objectivo do elemento diffgram e o espaço de nomes "diffgr" na sequência XML.) Para suportar alterações, o InfoPath teria que quer enviar o .NET Framework e hospedar um objecto de DataSet para gerir os dados XML ou implementar novamente a funcionalidade. Nenhuma destas opções está disponível nesta versão do InfoPath.

Resolução

Este problema foi resolvido no Microsoft Office InfoPath 2003 Service Pack 1 (SP1). Para resolver este problema, obtenha o service pack mais recente do Microsoft Office 2003. O InfoPath 2003 SP1 totalmente suporta conjuntos de dados introduzidos e permite-lhe criar um formulário a partir de um serviço Web que devolve um DataSet ADO.NET no InfoPath 2003.

Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
870924Como obter o service pack mais recente do Office 2003
Para contornar este problema, crie um novo método de serviço Web que utiliza o ADO.NET DataSet que é devolvido do método de serviço Web original. Remova o esquema inline, os elementos diffgram e os atributos. Devolver o XML limpos InfoPath. Consulte a secção "Mais informação" para duas implementações possíveis desta solução alternativa.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

Passos para reproduzir o comportamento

  1. No Microsoft Visual Studio. NET, crie um novo projecto de serviço Microsoft C# ASP.NET Web. Altere o nome deste projecto para NorthwindDataSet .

    Pode fazê-lo alterando a localização para http://localhost/NorthwindDataSet.
  2. No menu projecto , clique em Adicionar serviço Web . Nome de serviço da Web novo CustomerInfo.asmx .
  3. Adicione o seguinte código ao novo serviço CustomerInfo.asmx Web:
    /************************************************************************
       * GetCustomerInfo -- This method retrieves information from the 
       * Customer table of the Northwind database and then returns it in an
       * ADO.NET DataSet.
       * Parameters: CustomerID is the string that contains the CustomerID of the 
       *                           customer to retrieve the information for.
       * Returns: An ADO.NET DataSet that contains information about the customer.
       * *********************************************************************/
    [WebMethod]
    public System.Data.DataSet GetCustomerInfo( string CustomerID )
    {
       try
       {
          //Create a Microsoft SQL Server connection to the local SQL Server.
          System.Data.SqlClient.SqlConnection theConnection = new SqlConnection();
          theConnection.ConnectionString = "Data Source=(local);" + 
             "Integrated Security=SSPI;Initial Catalog=northwind";
          
          //Create an SQL Command to query the data.
          System.Data.SqlClient.SqlCommand theCommand = new SqlCommand();
          theCommand.Connection = theConnection;
          theCommand.CommandText = "SELECT \"CustomerID\",\"CompanyName\"," + 
             "\"ContactName\",\"ContactTitle\",\"Address\",\"City\",\"Region\"," + 
             "\"PostalCode\",\"Country\",\"Phone\",\"Fax\" FROM \"Customers\" " + 
             "WHERE CustomerID='" + CustomerID + "'";
       
          //Create an SQL DataAdapter to read the data.
          System.Data.SqlClient.SqlDataAdapter theDataAdapter = new SqlDataAdapter();
          theDataAdapter.SelectCommand = theCommand;
    
          //Open the command, and then read the data.
          theConnection.Open();
          System.Data.DataSet theCustomerInfo = new DataSet();
          theCustomerInfo.DataSetName = "CustomerInfo";
          theCustomerInfo.Namespace = "http://localhost/NorthwindDataSet/CustomerInfo";
          theDataAdapter.Fill( theCustomerInfo, "Customers" );
    
          //Clean up.
          theConnection.Close();
       
          //Return the result.
          return theCustomerInfo;
       }
       catch(Exception ex)
       {
          return null;
       }
    }
    
    o código de exemplo tenta ligar a um computador com o Microsoft SQL Server no mesmo computador como o serviço Web. Em alternativa, pode alterar a cadeia de ligação que é utilizada pelo objecto System.Data.SqlConnection para ligar a um computador diferente que esteja a executar o SQL Server. Poderá ter de configurar as permissões do SQL Server para permitir que o serviço Web para aceder à base de dados.Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
    815154COMO: Configurar a segurança do SQL Server para aplicações do .NET
  4. Na parte superior da página CustomerInfo.asmx.cs, adicione o seguinte código para as instruções ' USING :
    using System.Data.SqlClient;
  5. Compile o projecto NorthwindDataSet .
  6. Inicie o InfoPath. No menu ficheiro , clique em Estruturar um formulário .
  7. Na estrutura um painel de tarefas do formulário, clique em Novo a partir de origem de dados .
  8. Na caixa de diálogo Assistente de configuração de origens de dados , seleccione o Serviço Web como o tipo de origem de dados e, em seguida, clique em seguinte .
  9. Seleccione Receber dados e, em seguida, clique em seguinte .
  10. Escreva o URL para o serviço CustomerInfo Web (por exemplo, http://localhost/NorthwindDataSet/CustomerInfo.asmx) e, em seguida, clique em seguinte .
  11. Seleccione o método GetCustomerInfo para a operação e, em seguida, clique em seguinte .
  12. Seleccione o parâmetro s0:CustomerID e, em seguida, clique em Definir valor de exemplo... . Na caixa de diálogo Definir valor , escreva ALFKI e, em seguida, clique em OK .
  13. Clique em seguinte .

    Nota O InfoPath apresenta a mensagem de erro é na secção "Sintomas".

Soluções alternativas

Para contornar o problema, pode utilizar os passos semelhantes aos seguintes passos para adicionar um novo método de serviço Web que remove os elementos incompatíveis o XML de DataSet ADO.NET. Isto é feito para que os dados XML podem ser utilizados pelo InfoPath. O método de serviço Web pode remover as informações de esquema inline a partir dos dados XML ou o método de serviço Web pode seriar os dados XML de uma classe de wrapper tipo seguro e devolver que.

Cada método tem vantagens e desvantagens.

Solução 1

Remover o esquema de linha e os atributos XML incompatível

Esta solução é bom porque é simples de implementar. Além disso, se os dados XML que o serviço Web original devolve é alterada por qualquer motivo, esta solução alternativa requer sem alterações para trabalhar com os novos dados.

No entanto, esta solução alternativa também tem uma desvantagem. Esta solução alternativa não descreve o esquema dos dados XML. Por conseguinte, O InfoPath tem sugerir o esquema de dados de exemplo. Se os dados de exemplo não contém todos os elementos possíveis e atributos que pode devolver o método de serviço Web, o esquema que o InfoPath infere não irá conter esses elementos. Se executar uma consulta que devolva elementos ou atributos que não estão a ser a chamada de exemplo, o InfoPath apresenta um erro.

Para implementar a solução alternativa 1, siga estes passos:
  1. No Visual Studio. NET, abra o projecto NorthwindDataSet.
  2. No menu projecto , clique em Adicionar serviço Web . Nome de serviço da Web novo IPCustomerInfo.asmx .
  3. Adicione o seguinte código ao novo serviço IPCustomerInfo.asmx Web:
    /************************************************************************
       * GetCustomerInfoNoSchema: This method calls the GetCustomerInfo
       * method of the CustomerInfo.asmx Web service, and then strips the 
       * inline schema from the resulting DataSet.
       * Parameters: CustomerID is the string that contains the CustomerID of the 
       *                           customer to retrieve information for.
       * Returns: An XML Document with no inline schema.
       * *********************************************************************/
    [WebMethod]
    public System.Xml.XmlDocument GetCustomerInfoNoSchema( string CustomerID )
    {
       //Get the core data.
       CustomerInfo theCustomerInfoService = new CustomerInfo();
       System.Data.DataSet theDataSet = 
          theCustomerInfoService.GetCustomerInfo( CustomerID );
    
       //Create a new XmlDocument from the data of the dataset.
       System.Xml.XmlDocument theDocument = new System.Xml.XmlDocument();
       theDocument.LoadXml( theDataSet.GetXml() );
    
       //Return the result.
       return theDocument;
    }
    
    o código de exemplo utiliza o serviço Web original para fornecer um DataSet ADO.NET e, em seguida, cria um novo documento XML sem informações de esquema inline.
  4. Compile o projecto NorthwindDataSet.
  5. Inicie o InfoPath. No menu ficheiro , clique em Estruturar um formulário .
  6. Na estrutura um painel de tarefas do formulário, clique em Novo a partir de origem de dados .
  7. Na caixa de diálogo Assistente de configuração de origens de dados , seleccione o Serviço Web como o tipo de origem de dados e, em seguida, clique em seguinte .
  8. Seleccione Receber dados e, em seguida, clique em seguinte .
  9. Escreva o URL para o serviço IPCustomerInfo Web (por exemplo, http://localhost/NorthwindDataSet/IPCustomerInfo.asmx) e, em seguida, clique em seguinte .
  10. Seleccione o método GetCustomerInfoNoSchema para a operação e, em seguida, clique em seguinte .
  11. Seleccione o parâmetro s0:CustomerID e, em seguida, clique em Definir valor de exemplo . Na caixa de diálogo Definir valor , escreva ALFKI e, em seguida, clique em OK .
  12. Clique em seguinte e, em seguida, clique em Concluir .
  13. Mova o campo CódigoDoCliente do grupo ' queryFields ' no painel de tarefas origem de dados e, em seguida, adicione o campo CódigoDoCliente à vista de consulta .
  14. Mova o grupo de clientes do grupo ' dataFields ' no painel de tarefas origem de dados e, em seguida, adicione o grupo de clientes à vista de Introdução de dados . Clique em secção com controlos .
  15. Pré-visualizar e, em seguida, teste o formulário. Repare que para alguns ID como a RAINHA de cliente, a consulta encontra erros porque os dados de exemplo não contém todos os elementos possíveis que o serviço da Web pode devolver.

Solução 2

Criar uma classe de wrapper vivamente escritas para serializar os dados XML de DataSet ADO.NET

Esta solução alternativa é mais difícil de implementar do que a solução anterior. Além disso, esta solução alternativa deve ser adaptada para cada método de serviço Web que é utilizado com e que o método do serviço Web não tem de alterar o esquema dos dados que devolve. No entanto, esta solução descreve o esquema dos dados XML que devolve. Por este motivo, O InfoPath não é necessário que sugerir a estrutura dos dados. Como resultado, os formulários do InfoPath são criados a partir desta solução alternativa não são susceptíveis a erros causados por opcionais elementos e atributos.
  1. No Microsoft Internet Explorer, mova para o URL da página de teste de serviço CustomerInfo Web (por exemplo, http://localhost/NorthwindDataSet/CustomerInfo.asmx).
  2. Clique em GetCustomerInfo para mover para a página de teste para esse método.
  3. Na caixa de texto CódigoDoCliente , introduza ALFKI e, em seguida, clique em Invoke .
  4. O XML de resultados, copie o <xs:schema> elemento todos os respectivos subordinados e colar em seguida,-las no novo texto do documento no bloco de notas.
  5. Remova os caracteres - o texto colado e, em seguida, guarde o documento como CustomerInfo.xsd .
  6. Abra uma linha de comandos Visual Studio .NET e mover para o directório onde guardou CustomerInfo.xsd.
  7. Utilize a seguinte linha para criar uma classe de wrapper do ficheiro de esquema:
    xsd.exe CustomerInfo.xsd /c /l:cs
  8. No Visual Studio. NET, abra o projecto NorthwindDataSet.
  9. No menu projecto , clique em Add Existing Item .
  10. Mover para o ficheiro CustomerInfo.cs que criou com a ferramenta xsd.exe e, em seguida, clique em Abrir .
  11. Adicione o espaço de nomes CustomerInfoWrapper baseando-se a classe CustomerInfo e a classe CustomerInfoCustomers .
  12. Adicione o seguinte código ao serviço IPCustomerInfo.asmx Web:
    /************************************************************************
       * GetCustomerInfoWrapper: This method calls the GetCustomerInfo
       * method of the CustomerInfo.asmx Web service, and then strips the 
       * inline schema from the resulting DataSet.
       * Parameters: CustomerID is the string that contains the CustomerID of the 
       *                           customer to retrieve information for.
       *                        exampleData is the wrapper class to fill with the data from the
       *                           ADO.NET DataSet.
       * Returns: none
       * *********************************************************************/
    [WebMethod]
    public void GetCustomerInfoWrapper( string CustomerID, 
       out CustomerInfoWrapper.CustomerInfo exampleData )
    {
       //Get the core data.
       CustomerInfo theCustomerInfoService = new CustomerInfo();
       System.Data.DataSet theDataSet = 
          theCustomerInfoService.GetCustomerInfo( CustomerID );
       theDataSet.Namespace = "http://localhost/NorthwindDataSet/CustomerInfo";
    
       //Create an in-memory stream to write the DataSet to.
       System.IO.MemoryStream theStream = new System.IO.MemoryStream();
    
       //Write the DataSet to the stream.
       theDataSet.WriteXml( theStream, XmlWriteMode.IgnoreSchema );
    
       //Move the streams seek pointer back to the beginning, or 
       //deserialization will fail.
       theStream.Seek(0, System.IO.SeekOrigin.Begin );
    
       //Create an XML Serializer to read the DataSet.
       System.Xml.Serialization.XmlSerializer ser = new
          System.Xml.Serialization.XmlSerializer(
             typeof(CustomerInfoWrapper.CustomerInfo));
    
       //Deserialize a CustomerInfo wrapper from the stream.
       exampleData = ((CustomerInfoWrapper.CustomerInfo)
          (ser.Deserialize( theStream )));
       return;
    }
    
    o código de exemplo utiliza o serviço Web original para fornecer um DataSet ADO.NET e, em seguida, cria um novo documento XML sem informações de esquema inline.
  13. Compile o projecto NorthwindDataSet.
  14. Inicie o InfoPath. No menu ficheiro , clique em Estruturar um formulário .
  15. No design um painel de tarefas do formulário, clique em Novo a partir da origem de dados.. .
  16. Na caixa de diálogo Assistente de configuração de origens de dados , seleccione o Serviço Web como o tipo de origem de dados e, em seguida, clique em seguinte .
  17. Seleccione Receber dados e, em seguida, clique em seguinte .
  18. Escreva o URL para o serviço IPCustomerInfo Web (por exemplo, http://localhost/NorthwindDataSet/IPCustomerInfo.asmx) e, em seguida, clique em seguinte .
  19. Para a operação, seleccione o método GetCustomerInfoWrapper e, em seguida, clique em seguinte .

    Repare que o InfoPath não lhe pede para especificar valores de exemplo para o método de serviço Web.
  20. Clique em Concluir .
  21. Mova o campo CódigoDoCliente do grupo ' queryFields ' no painel de tarefas origem de dados e, em seguida, adicione o campo CódigoDoCliente à vista de consulta.
  22. Mova o grupo de clientes do grupo ' dataFields ' no painel de tarefas origem de dados e, em seguida, adicione o grupo de clientes à vista de Introdução de dados .
  23. Pré-visualizar e, em seguida, teste o formulário.

    Repare que qualquer ID de cliente válido funciona neste formulário.

Propriedades

Artigo: 822020 - Última revisão: 28 de julho de 2006 - Revisão: 2.4
A informação contida neste artigo aplica-se a:
  • Microsoft Office InfoPath 2003
Palavras-chave: 
kbmt kbtshoot kbxml kbprb KB822020 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 822020

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com