Formulář nelze vytvořit z webové služby, který vrací datové sady ADO.NET v aplikaci InfoPath 2003

Překlady článku Překlady článku
ID článku: 822020 - Produkty, které se vztahují k tomuto článku.
Microsoft Visual Basic .NET verzi tohoto článku naleznete 831795.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Při vytvoření formuláře aplikace InfoPath z webová služba vrátí objekt ADO.NET DataSet (System.Data.DataSet) obdržet následující chybovou zprávu z aplikace InfoPath:
Datový soubor XML obsahuje informace schématu XML, což není povoleno.

Příčina

Aplikace InfoPath nemůže použít přímo objektech ADO.NET DataSet. Aplikace InfoPath spolupracuje s obecný payloads XML. Jako speciální formát XML, který brání objektech ADO.NET DataSet práci s aplikací InfoPath jsou serializovat objektech ADO.NET DataSet, které jsou vráceny webové služby.
  • V souboru Web Service Description Language definuje metody a vlastnosti webové služby, je typ DataSet reprezentován značku otevřené schématu < xsd: libovolné / >. InfoPath lze odvodit schématu dokumentu XML, která je vrácena webové služby. Však InfoPath musí provádět ukázkové volání webové služby proveďte to.
  • ADO.NET DataSet obsahuje vložené schéma, které popisuje je v něm uložená data. Tuto verzi aplikace InfoPath nepodporuje vložená schémata.
  • Data v ADO.NET DataSet zalomený v prvku XML <diffgr:diffgram> popsaný v vložené schéma. Prvky XML obsahují data ADO.NET DataSet mít také další atributy, které nejsou popsány ve schématu. Protože data neodpovídá schématu, data nelze ověřit v formulář.
  • InfoPath nemá vestavěnou podporu pro sledování změn, který je podobný ADO.NET DataSet. Například ADO.NET DataSet sleduje pole a řádky, které byly přidány, změněny nebo odstraněny od poslední změny byly přijaty. (Toto je účel prvek diffgram a oboru názvů "diffgr" v proudu XML). Podporu sledování změn InfoPath musel expedovat .NET Framework a hostitele objekt DataSet ke správě dat XML nebo re-implement funkce. Žádná z těchto možností je k dispozici v této verzi aplikace InfoPath.

Řešení

Tento problém je vyřešen v Microsoft Office InfoPath 2003 Service Pack 1 (SP1). Problém vyřešíte instalací nejnovější aktualizace Service Pack pro sadu Microsoft Office 2003. InfoPath 2003 SP1 plně podporuje zadaný datasets a umožňuje vytvořit formulář z webová služba vrátí objekt ADO.NET DataSet v aplikaci InfoPath 2003.

Další informace získáte v následujícím článku znalostní báze Microsoft Knowledge Base:
870924Jak získat nejnovější aktualizaci service pack pro sadu Office 2003
Tento problém vyřešit, vytvořte novou metodu webové služby, které trvá ADO.NET DataSet vrácená z původní metodu webové služby. Odebrání vložené schéma, diffgram prvky a atributy. Vrátit vyčištěné XML InfoPath. Naleznete v části "Další informace" dva možné implementací tohoto řešení.

Prohlášení

Toto chování je záměrné.

Další informace

Kroky pro reprodukci tohoto chování

  1. V aplikaci Microsoft Visual Studio .NET vytvořit nový projekt C# ASP.NET webu služby. Změnit název tohoto projektu NorthwindDataSet.

    To lze provést změnou umístění http://localhost/NorthwindDataSet.
  2. V nabídce projekt klepněte na tlačítko Přidat webovou službu. Zadejte název nové webové služby CustomerInfo.asmx.
  3. Přidejte následující kód nové CustomerInfo.asmx webové služby:
    /************************************************************************
       * 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;
       }
    }
    
    ukázkový kód pokusí připojit k počítači se systémem Microsoft SQL Server ve stejném počítači jako webové služby. Případně můžete změnit řetězec připojení objektu System.Data.SqlConnection použitá k připojení k jinému počítači je spuštěn SQL Server. Můžete mít nakonfigurovat oprávnění povolit webové služby pro přístup k databázi SQL Server.Další informace získáte v následujícím článku znalostní báze Microsoft Knowledge Base:
    815154JAK Konfigurovat zabezpečení serveru SQL pro aplikace .NET
  4. V horní části stránky CustomerInfo.asmx.cs přidejte následující kód příkazy USING:
    using System.Data.SqlClient;
  5. Kompilace projektu NorthwindDataSet.
  6. Spustit aplikaci InfoPath. V nabídce soubor klepněte na tlačítko Navrhnout formulář.
  7. V návrhovém podokno úloh tvar klepněte na tlačítko Nový ze zdroje dat..
  8. V dialogovém okně Průvodce nastavením zdroje dat vyberte Webové služby jako typ zdroje dat a potom klepněte na tlačítko Další.
  9. Vyberte možnost Přijímat Data a potom klepněte na tlačítko Další.
  10. Zadejte URL CustomerInfo webové služby (například http://localhost/NorthwindDataSet/CustomerInfo.asmx) a potom klepněte na tlačítko Další.
  11. Vyberte metodu GetCustomerInfo operace a potom klepněte na tlačítko Další.
  12. Vyberte parametr s0:CustomerID a potom klepněte na tlačítko Nastavit... ukázkovou hodnotu. V dialogovém okně Nastavit hodnotu zadejte ALFKI a potom klepněte na tlačítko OK.
  13. Klepněte na tlačítko Další.

    Poznámka: Aplikace InfoPath zobrazí chybová zpráva, která je v části "Příznaky".

Řešení

Chcete-li problém vyřešit, můžete kroky, které jsou podobné následující kroky přidat novou metodu webové služby, která odebere nekompatibilní prvky z XML ADO.NET DataSet. To provedete tak, aby XML data lze InfoPath. Metodu webové služby z dat XML lze odebrat informace vložené schéma nebo lze serializovat dat XML ve třídě důrazně zadaný obálky a vrátit, metodu webové služby.

Každá má své výhody i nevýhody.

Řešení 1

Odebrání vložené schéma a atributy nekompatibilní XML

Tato práce kolem je vhodné, protože je jednoduchý implementovat. Navíc pokud původní webová služba vrátí data XML z jakéhokoli důvodu změní, toto řešení vyžaduje žádné změny pracovat s nová data.

Toto řešení však má také Nevýhodou. Toto řešení nepopisuje schématu dat XML. Proto InfoPath musí odvodit schématu z ukázková data. Pokud ukázkových dat neobsahuje všechny možné prvky a atributy lze vrátit metodu webové služby, schématu InfoPath odvodí nebude obsahovat tyto prvky. Spustit dotaz, který vrátí prvky nebo atributy, které nejsou v ukázkové volání zobrazí aplikace InfoPath k chybě.

Chcete-li implementovat řešení 1, postupujte takto:
  1. V aplikaci Visual Studio .NET otevřete projekt NorthwindDataSet.
  2. V nabídce projekt klepněte na tlačítko Přidat webovou službu. Zadejte název nové webové služby IPCustomerInfo.asmx.
  3. Přidejte následující kód nové IPCustomerInfo.asmx webové služby:
    /************************************************************************
       * 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;
    }
    
    ukázkový kód používá původní webové služby poskytnout ADO.NET DataSet a vytvoří nový dokument XML bez informací vložené schéma.
  4. Kompilace projektu NorthwindDataSet.
  5. Spustit aplikaci InfoPath. V nabídce soubor klepněte na tlačítko Navrhnout formulář.
  6. V návrhovém podokno úloh tvar klepněte na tlačítko Nový ze zdroje dat..
  7. V dialogovém okně Průvodce nastavením zdroje dat vyberte Webové služby jako typ zdroje dat a potom klepněte na tlačítko Další.
  8. Vyberte možnost Přijímat Data a potom klepněte na tlačítko Další.
  9. Zadejte URL IPCustomerInfo webové služby (například http://localhost/NorthwindDataSet/IPCustomerInfo.asmx) a potom klepněte na tlačítko Další.
  10. Vyberte metodu GetCustomerInfoNoSchema operace a potom klepněte na tlačítko Další.
  11. Vyberte parametr s0:CustomerID a potom klepněte na tlačítko Nastavit ukázkovou hodnotu. V dialogovém okně Nastavit hodnotu zadejte ALFKI a potom klepněte na tlačítko OK.
  12. Klepněte na tlačítko Další a potom klepněte na tlačítko Dokončit.
  13. Přesunout pole KódZákazníka ze skupiny queryFields v podokno úloh Data Source a potom přidejte pole ČísloZákazníka zobrazení dotazu.
  14. Přesunutí skupiny zákazníků ze skupiny dataFields v podokno úloh Data Source a přidat skupinu Zákazníci do zobrazení Zadat Data. Klepněte na oddíl s ovládacími prvky.
  15. Zobrazení náhledu a testování formuláře. Všimněte si, že pro některé odběratele ID například PIKOVOU dotazu nalezne chyby protože ukázková data obsahují všechny možné prvky, které lze vrátit webové služby.

Řešení 2

Vytvořit silnými wrapper třídu k serializaci dat XML ADO.NET DataSet

Toto řešení je složitější než předchozí řešení implementovat. Navíc musí být toto řešení přizpůsobeny každou metodu webové služby, je použit s a kterou metodu webové služby nutné změnit schéma dat vrátí. Toto řešení však popisuje schéma vrací data XML. Proto InfoPath nemá odvodit strukturu dat. V důsledku toho nejsou náchylná k chybám, které jsou způsobeny volitelné prvky a atributy formuláře aplikace InfoPath, které jsou vytvořeny z tohoto řešení.
  1. V aplikaci Microsoft Internet Explorer přesunout URL služby test CustomerInfo webovou stránku (například http://localhost/NorthwindDataSet/CustomerInfo.asmx).
  2. Klepněte na tlačítko GetCustomerInfo přesunout zkušební stránku pro danou metodu.
  3. Do textového pole ČísloZákazníka zadejte ALFKI a klepněte na tlačítko Invoke.
  4. Z XML výsledky zkopírujte <xs:schema> prvek a všechny jeho podřízené členy a potom vložit je nový text v dokumentu v poznámkovém bloku.
  5. Odebrání znaků - z vloženého textu a dokument uložit jako CustomerInfo.xsd.
  6. Otevřete příkazový řádek Visual Studio .NET a přesunout adresář, kam jste uložili CustomerInfo.xsd.
  7. Vytvořit souhrnný třídy ze souboru schématu použijte následující řádek:
    xsd.exe CustomerInfo.xsd /c /l:cs
  8. V aplikaci Visual Studio .NET otevřete projekt NorthwindDataSet.
  9. V nabídce projekt klepněte na možnost Přidat existující položku.
  10. Přesunout do souboru CustomerInfo.cs vytvořené nástrojem xsd.exe a klepněte na tlačítko Otevřít.
  11. Přidat obor názvů CustomerInfoWrapper kolem CustomerInfo třídy a třídy CustomerInfoCustomers.
  12. Přidejte následující kód IPCustomerInfo.asmx webové služby:
    /************************************************************************
       * 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;
    }
    
    ukázkový kód používá původní webové služby poskytnout ADO.NET DataSet a vytvoří nový dokument XML bez informací vložené schéma.
  13. Kompilace projektu NorthwindDataSet.
  14. Spustit aplikaci InfoPath. V nabídce soubor klepněte na tlačítko Navrhnout formulář.
  15. Na návrhu formuláře podokno úloh klepněte na tlačítko Nový ze zdroje dat....
  16. V dialogovém okně Průvodce nastavením zdroje dat vyberte Webové služby jako typ zdroje dat a potom klepněte na tlačítko Další.
  17. Vyberte možnost Přijímat Data a potom klepněte na tlačítko Další.
  18. Zadejte URL IPCustomerInfo webové služby (například http://localhost/NorthwindDataSet/IPCustomerInfo.asmx) a potom klepněte na tlačítko Další.
  19. Pro operaci vyberte metodu GetCustomerInfoWrapper a potom klepněte na tlačítko Další.

    Všimněte si, že InfoPath nezobrazí výzvu k zadání ukázkových hodnot metodu webové služby.
  20. Klepněte na tlačítko Dokončit.
  21. Přesunout pole KódZákazníka ze skupiny queryFields v podokno úloh Data Source a potom přidejte pole ČísloZákazníka zobrazení dotazu.
  22. Přesunutí skupiny zákazníků ze skupiny dataFields v podokno úloh Data Source a přidat skupinu Zákazníci do zobrazení Zadat Data.
  23. Zobrazení náhledu a testování formuláře.

    Všimněte si, že jakékoli číslo platné zákazníka pracuje v tomto formuláři.

Vlastnosti

ID článku: 822020 - Poslední aktualizace: 28. července 2006 - Revize: 2.4
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Office InfoPath 2003
Klíčová slova: 
kbmt kbtshoot kbxml kbprb KB822020 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:822020

Dejte nám zpětnou vazbu

 

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