Nie można utworzyć formularz z usługi sieci Web, która zwraca ADO.NET zestawu danych w programie InfoPath 2003

Tłumaczenia artykułów Tłumaczenia artykułów
Numer ID artykułu: 822020 - Zobacz jakich produktów dotyczą zawarte w tym artykule porady.
Dla programu Microsoft Visual Basic.Wersja tego artykułu netto, zobacz 831795.
Rozwiń wszystko | Zwiń wszystko

Na tej stronie

Symptomy

Podczas tworzenia formularza programu InfoPath z usługi sieci Web, która zwraca ADO.Element DataSet netto (System.Data.DataSet), może pojawić następujący komunikat o błędzie programu InfoPath:
Plik danych XML zawiera informacje o schemacie XML, co jest niedozwolone.

Przyczyna

Program InfoPath nie może bezpośrednio korzystać z obiektów ADO.NET zestawów danych. Program InfoPath działa z rodzajowy ładunki XML. OBIEKTY ADO.Zestawów danych netto są zwracane przez usługi sieci Web są szeregowane jako specjalny format XML, który uniemożliwia ADO.NET zestawów danych z pracy bezpośrednio z programu InfoPath.
  • W pliku sieci Web Service Description Language, definiujący metody i właściwości usługi sieci Web, typu zestawu danych jest reprezentowana przez tag schematu Otwórz <xsd:any></xsd:any>. Program InfoPath może rozpoznać schematu dokumentu XML, który jest zwracany przez usługę sieci Web. Jednakże Program InfoPath należy próbkę wywołanie usługi sieci Web to.
  • ADO.NET DataSet zawiera wbudowany schemat, opisującą przechowywane w niej dane. Ta wersja programu InfoPath nie obsługuje schematy wbudowane.
  • Dane w modelu ADO.NET DataSet jest otoczona <diffgr:diffgram> element XML, który nie został opisany w wbudowany schemat. Elementy XML, które zawierają dane obiektów ADO.NET DataSet ma również dodatkowe atrybuty, które nie zostały opisane w schemacie. Ponieważ dane nie pasuje do schematu, dane nie mogą być sprawdzone w formularzu programu InfoPath.</diffgr:diffgram>
  • Program InfoPath nie ma wbudowaną obsługę śledzenia zmian, podobny do obiektów ADO.NET DataSet. Na przykład ADO.NET DataSet śledzi pól i wierszy, które zostały dodane, zmienione lub usunięte od czasu ostatnio zmiany zostały zaakceptowane. (Jest to cel w formacie DiffGram element i obszaru nazw "diffgr" w strumieniu XML.) Do obsługi śledzenia zmian, program InfoPath będzie musiała albo statku.NET Framework i hosta obiektu DataSet do zarządzania danymi XML lub ponownej funkcjonalność. Żadna z tych opcji jest dostępna w tej wersji programu InfoPath.

Rozwiązanie

Ten problem został rozwiązany w dodatku Microsoft Office InfoPath 2003 Service Pack 1 (SP1). Aby rozwiązać ten problem, należy uzyskać najnowszy dodatek service pack dla pakietu Microsoft Office 2003. Program InfoPath 2003 z dodatkiem SP1 w pełni obsługuje zestawów danych wpisywanych i pozwala utworzyć formularz z usługi sieci Web, która zwraca ADO.NET DataSet w programie InfoPath 2003.

Aby uzyskać dodatkowe informacje kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
870924Jak uzyskać najnowszy dodatek service pack dla pakietu Office 2003
Aby obejść ten problem, należy utworzyć nowe metody usługi sieci Web, który zajmuje ADO.Element DataSet NET zwrócone oryginalnego metody usługi sieci Web. Usunąć wbudowany schemat, w formacie diffgram elementy i atrybuty. Zwraca oczyszczonego XML do programu InfoPath. W sekcji "Więcej informacji" dwa możliwe implementacjach tej metody obejścia problemu.

Stan

To zachowanie jest zgodne z projektem.

Więcej informacji

Kroki do odtworzenia problemu

  1. W programie Microsoft Visual Studio.NET, tworzenie nowych Microsoft C# ASP.Projekt, usługi sieci Web. Zmiana nazwy projektu NorthwindDataSet.

    W tym celu należy zmienić lokalizację na http://localhost/NorthwindDataSet.
  2. Na Projekt menu, kliknij przycisk Dodaj usługę sieci Web. Nazwa nowej usługi sieci Web CustomerInfo.asmx.
  3. Dodaj następujący kod do nowej usługi sieci 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;
       }
    }
    
    Przykładowy kod próbuje połączyć się z komputera, na którym jest uruchomiona Microsoft SQL Server na tym samym komputerze co usługi sieci Web. Alternatywnie, można zmienić ciąg połączenia, który jest używany przez System.Data.SqlConnection obiekt, aby połączyć się z innym komputerem z programem SQL Server. Może być konieczne skonfigurowanie uprawnień programu SQL Server, aby zezwolić na dostęp do bazy danych usługi sieci Web.Aby uzyskać dodatkowe informacje kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
    815154Konfigurowanie zabezpieczeń serwera SQL.Aplikacje netto
  4. U góry strony CustomerInfo.asmx.cs Dodaj poniższy kod do ZA POMOCĄ oświadczenia:
    using System.Data.SqlClient;
  5. Kompilacja NorthwindDataSet Projekt.
  6. Uruchom program InfoPath. Na Plik menu, kliknij przycisk Projektowanie formularza.
  7. W projekcie okienko zadań formularz kliknij przycisk Nowy ze źródła danych.
  8. W Kreator konfiguracji źródła danych Wybierz pozycję Usługa sieci Web jako typ źródła danych, a następnie kliknij Dalej.
  9. Wybierz Otrzymywanie danych, a następnie kliknij przycisk Dalej.
  10. Wpisz adres URL usługi sieci CustomerInfo Web (na przykład http://localhost/NorthwindDataSet/CustomerInfo.asmx), a następnie kliknij przycisk Dalej.
  11. Wybierz GetCustomerInfo Metoda dla operacji, a następnie kliknij Dalej.
  12. Wybierz s0:CustomerID parametr, a następnie kliknij Ustaw przykładową wartość.... W Ustaw wartość okno dialogowe, typ ALFKI, a następnie kliknij przycisk OK.
  13. Kliknij przycisk Dalej.

    Uwaga Program InfoPath wyświetli komunikat o błędzie, który znajduje się w sekcji "Symptomy".

Obejścia problemu

Aby obejść ten problem, można użyć kroki, które są podobne do następujących kroki, aby dodać nowe metody usługi sieci Web, która usuwa elementy niezgodne z XML ADO.NET DataSet. Aby to zrobić, aby dane XML mogą być używane przez program InfoPath. Metody usługi sieci Web można usunąć wbudowanego schematu informacje z danych XML lub metody usługi sieci Web można serializować dane XML w klasy otoki jednoznacznie i który powrócić.

Każda metoda ma wady i zalety.

Rozwiązanie 1

Usuwanie atrybutów XML niezgodne i wbudowany schemat

Obejść to jest dobry, ponieważ jest łatwy do zaimplementowania. Ponadto jeśli dane XML, które zwraca oryginalną usługi sieci Web ulegnie zmianie dowolnej przyczyny, to rozwiązanie wymaga żadnych zmian do pracy z nowymi danymi.

To rozwiązanie ma również niedogodność. Ta metoda obejścia problemu nie opisano schemat danych XML. W związku z tym Program InfoPath musi rozpoznać schematu z przykładowych danych. Przykładowe dane nie zawiera wszystkich możliwych elementów i atrybutów, zwracające metody usługi sieci Web, schematu, który ustala program InfoPath nie będzie zawierać te elementy. Jeśli uruchomisz kwerendę, która zwraca elementów lub atrybutów, które nie są w wywołaniu próbki, program InfoPath wyświetli błąd.

Aby zaimplementować obejście 1, wykonaj następujące kroki:
  1. W Programie Visual Studio.NET, otwórz projekt NorthwindDataSet.
  2. Na Projekt menu, kliknij przycisk Dodaj usługę sieci Web. Nazwa nowej usługi sieci Web IPCustomerInfo.asmx.
  3. Dodaj następujący kod do nowej usługi sieci 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;
    }
    
    Kod przykładowy używa oryginalnego usługi sieci Web w celu zapewnienia ADO.NET zestawu danych, a następnie tworzy nowy dokument XML bez wbudowanego schematu informacji.
  4. Skompiluj projekt NorthwindDataSet.
  5. Uruchom program InfoPath. Na Plik menu, kliknij przycisk Projektowanie formularza.
  6. W projekcie okienko zadań formularz kliknij przycisk Nowy ze źródła danych.
  7. W Kreator konfiguracji źródła danych Wybierz pozycję Usługa sieci Web jako typ źródła danych, a następnie kliknij Dalej.
  8. Wybierz Otrzymywanie danych, a następnie kliknij przycisk Dalej.
  9. Wpisz adres URL usługi sieci IPCustomerInfo Web (na przykład http://localhost/NorthwindDataSet/IPCustomerInfo.asmx), a następnie kliknij przycisk Dalej.
  10. Wybierz GetCustomerInfoNoSchema Metoda dla operacji, a następnie kliknij Dalej.
  11. Wybierz s0:CustomerID parametr, a następnie kliknij Ustaw przykładową wartość. W Ustaw wartość okno dialogowe, typ ALFKI, a następnie kliknij przycisk OK.
  12. Kliknij przycisk Dalej, a następnie kliknij przycisk Zakończ.
  13. Przenoszenie IDKlienta pola z queryFields grupy w źródle danych okienko zadań, a następnie dodaj IDKlienta pola do Kwerendy Widok.
  14. Przenoszenie Klienci grupy dataFields grupy w źródle danych okienko zadań, a następnie dodaj Klienci grupę Wprowadzanie danych Widok. Kliknij przycisk Sekcja z formantami.
  15. Podgląd i przetestuj formularz. Należy zauważyć że dla niektórych identyfikatorów nabywcy takich jak DAMA, kwerenda napotka błędy, ponieważ nie zawiera wszystkich możliwych elementów, które usługa sieci Web może zwracać dane przykładowe.

Obejście 2

Tworzenie klasy otoki jednoznacznie określony serializować danych XML ADO.NET zestawu danych

To obejście jest trudniejsza niż w poprzednim rozwiązaniu. Ponadto tego rozwiązania muszą być dostosowane do każdej metody usługi sieci Web używany z i metody usługi sieci Web nie mogą zmieniać schemat zwraca dane. Jednak tego obejścia opisano schemat zwraca dane XML. W związku z tym Program InfoPath nie rozpoznać strukturę danych. W efekcie formularzy programu InfoPath, które są tworzone na podstawie tego rozwiązania nie są podatne na błędy, które są powodowane przez opcjonalne elementy i atrybuty.
  1. W programie Microsoft Internet Explorer przejście do adresu URL strony testowej usługi sieci CustomerInfo Web (na przykład http://localhost/NorthwindDataSet/CustomerInfo.asmx).
  2. Kliknij przycisk GetCustomerInfo Aby przejść do strony testowej dla tej metody.
  3. W IDKlienta Tekst wprowadź ALFKI, a następnie kliknij przycisk Wywoływanie.
  4. XML, która powstaje, kopiowanie <xs:schema></xs:schema> element i wszystkie jego dzieci, a następnie wklej je w nowym tekście dokumentu w programie Notatnik.
  5. Usuń - znaki z wklejonego tekstu, a następnie zapisz dokument jako CustomerInfo.xsd.
  6. Otwórz program Visual Studio.Wiersz polecenia NET i przenieść do katalogu, w którym zapisano CustomerInfo.xsd.
  7. Aby utworzyć klasy otoki z pliku schematu, użyj następującego wiersza:
    xsd.exe CustomerInfo.xsd /c /l:cs
  8. W Programie Visual Studio.NET, otwórz projekt NorthwindDataSet.
  9. Na Projekt menu, kliknij przycisk Dodaj istniejący element.
  10. Przenieś plik CustomerInfo.cs, który został utworzony za pomocą narzędzia Xsd.exe, a następnie kliknij przycisk Otwórz.
  11. Dodawanie nazw CustomerInfoWrapper wokół CustomerInfo Klasa i CustomerInfoCustomers Klasa.
  12. Dodaj następujący kod do usługi sieci 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;
    }
    
    Kod przykładowy używa oryginalnego usługi sieci Web w celu zapewnienia ADO.NET zestawu danych, a następnie tworzy nowy dokument XML bez wbudowanego schematu informacji.
  13. Skompiluj projekt NorthwindDataSet.
  14. Uruchom program InfoPath. Na Plik menu, kliknij przycisk Projektowanie formularza.
  15. W projekcie okienko zadań formularz kliknij przycisk Nowy ze źródła danych....
  16. W Kreator konfiguracji źródła danych Wybierz pozycję Usługa sieci Web jako typ źródła danych, a następnie kliknij Dalej.
  17. Wybierz Otrzymywanie danych, a następnie kliknij przycisk Dalej.
  18. Wpisz adres URL usługi sieci IPCustomerInfo Web (na przykład http://localhost/NorthwindDataSet/IPCustomerInfo.asmx), a następnie kliknij przycisk Dalej.
  19. Dla operacji, wybierz GetCustomerInfoWrapper Metoda, a następnie kliknij Dalej.

    Należy zauważyć, że program InfoPath nie monitować o określenie wartości próbki dla metody usługi sieci Web.
  20. Kliknij przycisk Zakończ.
  21. Przenoszenie IDKlienta pola z queryFields grupy w źródle danych okienko zadań, a następnie dodaj IDKlienta pole do widoku kwerendy.
  22. Przenoszenie Klienci grupy dataFields grupy w źródle danych okienko zadań, a następnie dodaj Klienci grupę Wprowadzanie danych Widok.
  23. Podgląd i przetestuj formularz.

    Należy zauważyć, że każdy identyfikator klienta prawidłowego działania w tym formularzu.

Właściwości

Numer ID artykułu: 822020 - Ostatnia weryfikacja: 22 września 2011 - Weryfikacja: 3.0
Informacje zawarte w tym artykule dotyczą:
  • Microsoft Office InfoPath 2003
Słowa kluczowe: 
kbtshoot kbxml kbprb kbmt KB822020 KbMtpl
Przetłumaczone maszynowo
WAŻNE: Ten artykuł nie został przetłumaczony przez człowieka, tylko przez oprogramowanie do tłumaczenia maszynowego firmy Microsoft. Firma Microsoft oferuje zarówno artykuły tłumaczone przez ludzi, jak i artykuły tłumaczone maszynowo, dzięki czemu każdy użytkownik może uzyskać dostęp do całej zawartości bazy wiedzy Knowledge Base we własnym języku. Prosimy jednak pamiętać, że artykuły przetłumaczone maszynowo nie zawsze są doskonałe. Mogą zawierać błędy słownictwa, składni i gramatyki, przypominające błędy robione przez osoby, dla których język użytkownika nie jest językiem ojczystym. Firma Microsoft nie odpowiada za wszelkie nieścisłości, błędy lub szkody spowodowane nieprawidłowym tłumaczeniem zawartości oraz za wykorzystanie tej zawartości przez klientów. Oprogramowanie do tłumaczenia maszynowego jest często aktualizowane przez firmę Microsoft.
Anglojęzyczna wersja tego artykułu to:822020

Przekaż opinię

 

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