Sie können ein Formular von einem Webdienst nicht erstellen, der ein Ado.net-dataset in InfoPath 2003 zurückgibt

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 822020 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Sehen Sie für eine Version dieses Artikels Microsoft Visual Basic .NET 831795 .
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Wenn von einem Webdienst, der ein Ado.net-dataset (System.Data.DataSet) zurückgibt, ein InfoPath-Formular erstellt wird, wird folgende Fehlermeldung Ihnen möglicherweise von InfoPath angezeigt:
Die XML-Datendatei enthält nicht zulässiges XML Schema Information.

Ursache

Nicht zu direkt kann Ado.net-datasets InfoPath verwenden. InfoPath funktioniert mit allgemeinen XML-Nutzlasten. Als ein spezielles XML-Format, das das Ado.net-datasets von dem Funktionieren direkt mit InfoPath verhindert, wird ADO.NET-DataSets serialisiert, das von Webdiensten zurückgegeben wird.
  • Der Typ DataSet wird von einem geöffneten Schematag in der Web Service Descripton Language-Datei, die die Methoden und die Eigenschaften eines Webdiensts definiert, dargestellt < Xsd: all/ >. InfoPath kann das Schema eines XML-Dokuments, das von einem Webdienst zurückgegeben wird, herleiten. InfoPath muss jedoch vornehmen, ein Beispiel das zu dem Webdienstdos aufzurufen.
  • Ein ADO.NET-DataSet enthält ein Inline-Schema, das das Daten beschreibt, gespeichert in es ist. Diese Version von InfoPath unterstützt Inlineschema nicht.
  • Das Daten in einem ADO.NET-DataSet wird in einem XML-Element <diffgr:diffgram> eingebunden, das dem Inlineschema nicht beschrieben wird. Die XML-Elemente, die die Daten von dem ADO.NET-DataSet enthalten, besitzen ebenfalls zusätzliche Attribute, die dem Schema nicht beschrieben werden. Die Daten können in dem InfoPath-Formular nicht überprüft werden, weil das Daten nicht mit dem Schema übereinstimmt.
  • InfoPath bietet integrierte Unterstützung von Änderungsprotokollierung, die einem ADO.NET-DataSet ähnelt, nicht. Beispielsweise überwacht ein ADO.NET-DataSet die Felder, die hinzugefügt werden, verändert werden oder gelöscht werden, seit Änderungen zuletzt angenommen wurden, und die Zeilen, die hinzugefügt werden, geändert werden oder gelöscht werden, seit Änderungen zuletzt angenommen wurden. (Dazu dienen das Element Diffgram und das Namespace "Diffgr" in dem XML Stream das). InfoPath musste das FRAMEWORK, um Änderungsprotokollierung zu unterstützen, liefern werden %1?\nWorks und ein DataSet -Objekt musste InfoPath, um die XML-Daten zu verwalten, oder die Funktionalität zu re-implement, hostet werden %1?\nWorks. Kein dieser Optionen in dieser Version von InfoPath verfügbar ist.

Lösung

Dieses Problem wird von Microsoft Office InfoPath 2003 Service Pack 1 ( 1) behoben. Installieren Sie den neusten Service Pack für Microsoft Office 2003, um dieses Problem zu beheben. InfoPath 2003 SP1 unterstützt typisiertes Datasets vollständig und ermöglicht Ihnen, Sie ein Formular von einem Webdienst zu erstellen, der ein Ado.net-dataset in InfoPath 2003 zurückgibt.

Klicken Sie auf die folgende Artikelanzahl, um weitere Informationen zu erhalten, um den Artikel der Microsoft Knowledge Base zu lesen:
870924 Wie Installieren des neusten Service Pack für Office 2003
Erstellen Sie eine neue Webdienstmethode, die das Ado.net-dataset akzeptiert, das von der ursprünglichen Webdienstmethode zurückgegeben wird, um dieses Problem umzugehen. Entfernen Sie das Inlineschema, die Diffgram-Element und die Attribute. Geben Sie an InfoPath das gesäuberte XML zurück. In dem Abschnitt "Weitere Informationen" zu beiden möglichen Implementierungen dieser Problemumgehung siehe.

Status

Es handelt sich hierbei um ein beabsichtigtes Verhalten.

Weitere Informationen

Schritte, das Verhalten zu reproduzieren

  1. Erstellen Sie in dem Microsoft Visual Studio .NET ein neues Microsoft C# ASP.NET Web Dienstprojekt. Ändern Sie den Name dieses Projekts To NorthwindDataSet.

    Sie können das tun, indem Sie den Speicherort zu http://localhost/NorthwindDataSet ändern.
  2. Klicken Sie in dem Menü Projekt auf Webdienst hinzufügen. Benennen Sie den neuen Webdienst CustomerInfo.asmx.
  3. Fügen Sie dem neuen CustomerInfo.asmx Web Dienst den folgenden Code hinzu:
    /************************************************************************
       * 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;
       }
    }
    
    Der Beispielcode versucht, eine Verbindung auf einem Computer herzustellen, auf dem Microsoft SQL Server auf demselben Computer als den Webdienst ausgeführt wird. In alternativ können Sie die Verbindungszeichenfolge, die von dem Objekt System.Data.SqlConnection zu dem Herstellen einer Verbindung auf einem verschiedenen Computer verwandt wird, auf dem SQL Server ausgeführt wird, ändern. Sie müssen SQL Server-Berechtigungen konfigurieren kann, zuzulassen, den Webdienst auf die Datenbank zuzugreifen. Klicken Sie auf die folgende Artikelanzahl, um weitere Informationen zu erhalten, um den Artikel der Microsoft Knowledge Base zu lesen:
    815154 SO WIRD'S GEMACHT: Konfigurieren von SQL Server-Sicherheit für .NET-Anwendunge
  4. Fügen Sie den folgenden Code an dem Anfang der CustomerInfo.asmx.cs-Seite den Anweisungen USING hinzu:
    using System.Data.SqlClient;
  5. Kompilieren Sie das NorthwindDataSet Projekt.
  6. Starten Sie InfoPath. Klicken Sie in dem Menü Datei auf Ein Formular entwerfen.
  7. Klicken Sie in dem Entwurf Formularaufgabenbereich auf Neues Formular aus Datenquelle.
  8. Wählen Sie in dem Dialogfeld Assistent zum Einrichten der Datenquelle Webdienst als den Datenquellentypen aus, und klicken Sie dann auf Weiter.
  9. Wählen Sie Receive Data aus, und klicken Sie dann auf Weiter.
  10. Geben Sie die URL an dem Dienst CustomerInfo Web (beispielsweise http://localhost/NorthwindDataSet/CustomerInfo.asmx) ein, und klicken Sie dann auf Weiter.
  11. Wählen Sie die GetCustomerInfo Methode für den Vorgang aus, und klicken Sie dann auf Weiter.
  12. Wählen Sie den s0:CustomerID Parameter aus, und klicken Sie dann auf Set Sample Value.... Geben Sie Wert in dem eingestellten Dialogfeld ein ALFKI, Und dann klicken Sie auf OK.
  13. Klicken Sie auf Weiter.

    Hinweis: InfoPath zeigt die Fehlermeldung an, die sich in dem "Symptom" Abschnitt befindet.

Problemumgehungen

Um das Problem umzugehen, können Sie Schritte, die den folgenden eine neue Webdienstmethode hinzufügenden Schritten ähneln, die die inkompatiblen Elemente aus dem XML von dem ADO.NET-DataSet entfernt, verwenden. Sie führen das aus, damit die XML-Daten von InfoPath verwandt werden können. Die Webdienstmethode kann die Inline-Schemainformation aus den XML-Daten entfernen oder die Webdienstmethode den XML-Daten in einer Wrapper-Klasse mit strikter Typenbindung serialisieren kann und kann das zurückgeben.

Jede Methode hat Vorteile und Nachteile.

1. Umgehungsmöglichkeit

Entfernen Sie das Inline Schema und die inkompatiblen XML-Attribute

Diese Arbeit um ist gut, da das Implementieren einfach ist. Darüber hinaus erfordert diese Problemumgehung, keine Änderungen mit den neuen Daten zu arbeiten, wenn das XML-Daten aus beliebigem Grund ändert, das der ursprüngliche Webdienst zurückgibt.

Diese Problemumgehung verfügt jedoch außerdem über einen Nachteil. Diese Problemumgehung beschreibt das Schema von den XML-Daten nicht. Daher muss das Schema aus Beispieldaten InfoPath herleiten. Wenn das Beispieldaten alle mögliche Elemente und Attribute nicht enthält, die die Webdienstmethode zurückgeben kann, wird das Schema, das InfoPath herleitet, die Elemente nicht enthalten. Wenn Sie eine Abfrage ausführen, die Elemente oder Attribute zurückgibt, die sich nicht in dem Beispielaufruf befinden, zeigt InfoPath einen Fehler an.

Gehen Sie folgendermaßen vor, um Workaround 1 zu implementieren:
  1. Öffnen Sie in dem Visual Studio .NET das NorthwindDataSet-Projekt.
  2. Klicken Sie in dem Menü Projekt auf Webdienst hinzufügen. Benennen Sie den neuen Webdienst IPCustomerInfo.asmx.
  3. Fügen Sie dem neuen IPCustomerInfo.asmx Web Dienst den folgenden Code hinzu:
    /************************************************************************
       * 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;
    }
    
    Der Code verwendet den ursprünglichen Webdienst, um ein Ado.net-dataset bereitzustellen, und anschließend erstellt der Beispielcode ein neues XML-Dokument mit keiner Inline-Schemainformation.
  4. Kompilieren Sie das NorthwindDataSet-Projekt.
  5. Starten Sie InfoPath. Klicken Sie in dem Menü Datei auf Ein Formular entwerfen.
  6. Klicken Sie in dem Entwurf Formularaufgabenbereich auf Neues Formular aus Datenquelle.
  7. Wählen Sie in dem Dialogfeld Assistent zum Einrichten der Datenquelle Webdienst als den Datenquellentypen aus, und klicken Sie dann auf Weiter.
  8. Wählen Sie Receive Data aus, und klicken Sie dann auf Weiter.
  9. Geben Sie die URL an dem Dienst IPCustomerInfo Web (beispielsweise http://localhost/NorthwindDataSet/IPCustomerInfo.asmx) ein, und klicken Sie dann auf Weiter.
  10. Wählen Sie die GetCustomerInfoNoSchema Methode für den Vorgang aus, und klicken Sie dann auf Weiter.
  11. Wählen Sie den s0:CustomerID Parameter aus, und klicken Sie dann auf Set Sample Value. Geben Sie Wert in dem eingestellten Dialogfeld ein ALFKI, Und dann klicken Sie auf OK.
  12. Klicken Sie auf Weiter, und klicken Sie dann auf Fertig stellen.
  13. Verschieben Sie das Feld CustomerID aus der Gruppe von QueryFields in dem Datenquellenvorgangsbereich und fügen Sie der Ansicht Abfrage dann das Feld CustomerID hinzu.
  14. Verschieben Sie die Gruppe Customers aus der Gruppe DataFields in dem Datenquellenvorgangsbereich und fügen Sie der Eingabe Datenansicht dann die Gruppe Customers hinzu. Klicken Sie auf Section with controls.
  15. Zeigen Sie das Formular an, und testen Sie dann das Formular. Beachten Sie, dass die Abfrage Fehler für einigen Kunden IDS wie QUEEN feststellt, weil das Beispieldaten alle mögliche Elemente nicht enthält, die der Webdienst zurückgeben kann.

Problemumgehung 2

Erstellen Sie starke Wrapper-Klasse, um die XML-Daten von dem ADO.NET-DataSet zu serialisieren

Das Implementieren dieser Problemumgehung als die vorherige Problemumgehung ist schwieriger. Diese Problemumgehung muss darüber hinaus an jeder Webdienstmethode angepasst werden, mit dem es verwandt wird und Webdienstmethode das Schema der Daten, die es zurückgibt, nicht ändern muss. Diese Problemumgehung beschreibt jedoch das Schema der XML-Daten, die es zurückgibt. Daher muss die Struktur der Daten InfoPath nicht herleiten. Daher sind InfoPath-Formulare, die aus dieser Problemumgehung erstellt werden, nicht zu Fehlern anfällig, die von optionalen Elementen und Attributen verursacht werden.
  1. Wechseln Sie in dem Microsoft Internet Explorer zu der URL der CustomerInfo Web Diensttestseite (beispielsweise http://localhost/NorthwindDataSet/CustomerInfo.asmx).
  2. Klicken Sie auf GetCustomerInfo, um für die Methode zu der Testseite zu gelangen.
  3. Geben Sie in dem Textfeld CustomerID ein ALFKI, Und dann klicken Sie auf Aufruf.
  4. Kopieren Sie aus dem XML, das sich ergibt, das Element &lt;xs:schema&gt; und seinen alle Kinder und fügen Sie anschließend in einem neuen Textdokument in Editor sie ein, das sich ergibt.
  5. Entfernen Sie aus dem eingefügten Text die Zeichen - und speichern Sie wie dann das Dokument CustomerInfo.xsd.
  6. Öffnen Sie eine Eingabeaufforderung von Visual Studio .NET und verschieben Sie in dem Verzeichnis wo Sie, um CustomerInfo.xsd zu speicherten.
  7. Verwenden Sie die folgende Zeile, um eine Wrapper-Klasse aus der Schemadatei zu erstellen:
    xsd.exe CustomerInfo.xsd /c /l:cs
  8. Öffnen Sie in dem Visual Studio .NET das NorthwindDataSet-Projekt.
  9. Klicken Sie in dem Menü Projekt auf Vorhandenes Element hinzufügen.
  10. Verschieben Sie in der CustomerInfo.cs-Datei, die Sie mit dem Tool Xsd.exe erstellten, und klicken Sie dann auf Öffnen.
  11. Fügen Sie das Namespace CustomerInfoWrapper, um die Klasse CustomerInfo und die Klasse CustomerInfoCustomers hinzu.
  12. Fügen Sie dem IPCustomerInfo.asmx Web Dienst den folgenden Code hinzu:
    /************************************************************************
       * 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;
    }
    
    Der Code verwendet den ursprünglichen Webdienst, um ein Ado.net-dataset bereitzustellen, und anschließend erstellt der Beispielcode ein neues XML-Dokument mit keiner Inline-Schemainformation.
  13. Kompilieren Sie das NorthwindDataSet-Projekt.
  14. Starten Sie InfoPath. Klicken Sie in dem Menü Datei auf Ein Formular entwerfen.
  15. Klicken Sie auf den Entwurf Formularaufgabenbereich auf New from Data Source...
  16. Wählen Sie in dem Dialogfeld Assistent zum Einrichten der Datenquelle Webdienst als den Datenquellentypen aus, und klicken Sie dann auf Weiter.
  17. Wählen Sie Receive Data aus, und klicken Sie dann auf Weiter.
  18. Geben Sie die URL an dem Dienst IPCustomerInfo Web (beispielsweise http://localhost/NorthwindDataSet/IPCustomerInfo.asmx) ein, und klicken Sie dann auf Weiter.
  19. Wählen Sie für den Vorgang die GetCustomerInfoWrapper Methode aus, und klicken Sie dann auf Weiter.

    Beachten Sie, dass InfoPath Sie nicht auffordert, Beispielwerte für die Webdienstmethode anzugeben.
  20. Klicken Sie auf Fertig stellen.
  21. Verschieben Sie das Feld CustomerID aus der Gruppe von QueryFields in dem Datenquellenvorgangsbereich und fügen Sie der Abfrage-Ansicht dann das Feld CustomerID hinzu.
  22. Verschieben Sie die Gruppe Customers aus der Gruppe DataFields in dem Datenquellenvorgangsbereich und fügen Sie der Eingabe Datenansicht dann die Gruppe Customers hinzu.
  23. Zeigen Sie das Formular an, und testen Sie dann das Formular.

    Beachten Sie, dass gültiger beliebiger Kunde ID in diesem Formular arbeitet.

Eigenschaften

Artikel-ID: 822020 - Geändert am: Freitag, 28. Juli 2006 - Version: 2.4
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Office InfoPath 2003
Keywords: 
kbtshoot kbxml kbprb KB822020 KbMtde kbmt
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 822020
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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