Не удается создать формы с веб-службы, который возвращает набор данных ADO.NET в InfoPath 2003

Переводы статьи Переводы статьи
Код статьи: 822020 - Vizualiza?i produsele pentru care se aplic? acest articol.
Версия для a Microsoft Visual Basic .NET в данной статье содержатся в разделе831795.
Развернуть все | Свернуть все

В этой статье

Проблема

An InfoPath, если форма создается на основе веб-службы, возвращающей набор данных ADO.NET (System.Data.DataSet), InfoPath может появиться следующее сообщение об ошибке:
XML-файл данных содержит сведения О схеме XML, что не допускается.

Причина

InfoPath нельзя напрямую использовать наборы данных ADO.NET. InfoPath работает с универсальным полезных данных XML. Наборы данных ADO.NET, возвращаемые веб-служб, сериализуются как специальный формат XML, наборы данных ADO.NET из непосредственной работы с InfoPath.
  • Файл в Web Service Description Language, который определяет методы и свойства веб-службы, представленного типа тега открытой схемы набора данных < xsd: все / >. InfoPath можно определить схему XML-документа, возвращаемого функцией веб-службы. Тем не менее, InfoPath, необходимо вызвать, чтобы сделать службу Web этот пример.
  • An ADO.NET DataSet содержит встроенную схему, которая описывает данные, хранящиеся в нем. Эта версия InfoPath не поддерживает встроенные схемы.
  • Данных в набор данных ADO.NET упаковывается в элемент XML <diffgr:diffgram>, которая не описана в встроенной схемы. Элементы XML с данными ADO.NET DataSet также иметь дополнительные атрибуты, которые не описаны в схеме. Поскольку данные не соответствуют схеме, данные не могут быть проверены в форме InfoPath.
  • InfoPath не имеет встроенной поддержки для отслеживания изменений, похожее на набор данных ADO.NET. Например набор данных ADO.NET отслеживает поля и принятия строки, которые были добавлены, изменены или удалены с момента изменения были в последний. (Это цельDiffGramэлемент и пространство имен «diffgr» в потоке XML.) Для поддержки отслеживания изменений, InfoPath необходимо отгрузить .NET Framework и для размещения в объекте набора данных управлять XML-данных или повторно реализовать функциональные возможности. Ни один из этих параметров будет доступен в данной версии InfoPath.

Решение

Эта проблема устранена в Office InfoPath 2003 с пакетом обновления 1 (SP1). Чтобы решить эту проблему, получите последний пакет обновления для Microsoft Office 2003. InfoPath 2003 с пакетом обновления 1 полностью поддерживает типизированных наборов данных и позволяет создавать формы с веб-службы, возвращающей набор данных ADO.NET в InfoPath 2003.

Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:
870924Как получить последний пакет обновления для Office 2003
Обойти эту проблему, создайте новый метод веб-службы, принимающей объект ADO.NET DataSet, которое возвращается из исходного метода веб-службы. Удалите встроенную схему diffgram элементы и атрибуты. Возвращает очищенных XML в InfoPath. Два возможных реализаций метода обхода. в разделе «Дополнительная информация»

Статус

Такое поведение предусмотрено при разработке.

Дополнительная информация

Действия для воспроизведения поведения

  1. В Microsoft Visual Studio .NET, создайте новый проект Microsoft C# ASP.NET веб-службы. Измените имя проекта дляNorthwindDataSet.

    Это можно сделать, изменив расположение для http://localhost/NorthwindDataSet.
  2. НаПроектменю, нажмите кнопкуДобавление веб-службы. Назовите новый веб-службыCustomerInfo.asmx.
  3. Добавьте следующий код для нового CustomerInfo.asmx веб-службы:
    /************************************************************************
       * 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;
       }
    }
    
    Пример кода пытается подключиться к компьютеру, на котором выполняется Microsoft SQL Server на том же компьютере, как веб-службы. Кроме того, можно изменить строку подключения, используемаяSystem.Data.SqlConnectionОбъект для подключения к другому компьютеру, на котором выполняется SQL Server. Возможно, потребуется настроить разрешения SQL Server, чтобы разрешить веб-службы для доступа к базе данных.Для получения дополнительных сведений щелкните следующий номер статьи базы знаний Майкрософт:
    815154ПРАКТИЧЕСКОЕ руководство: настройка безопасности SQL Server для приложений .NET
  4. В верхней части страницы CustomerInfo.asmx.cs, добавьте следующий код дляИспользованиеминструкции:
    using System.Data.SqlClient;
  5. КомпиляцииNorthwindDataSetпроекта.
  6. Запуска InfoPath. НаФайлменю, нажмите кнопкуПроектирование формы.
  7. Область задач Макет формы, нажмите кнопкуСоздать из источника данных.
  8. ВМастер настройки источника данныхдиалоговое окно, выберите пунктВеб-службыв качестве типа источника данных, а затем нажмите кнопкуСледующий.
  9. ВыберитеПолучение данных, а затем нажмите кнопкуСледующий.
  10. Введите URL-адрес CustomerInfo веб-службы (например, http://localhost/NorthwindDataSet/CustomerInfo.asmx), а затем нажмите кнопкуСледующий.
  11. ВыберитеGetCustomerInfoметод для операции, а затем нажмите кнопкуСледующий.
  12. ВыберитеS0:CustomerIDпараметр, а затем нажмите кнопкуЗадать образец.... ВУстановка значениядиалоговое окно, типALFKI, а затем нажмите кнопкуОК.
  13. Нажмите кнопкуСледующий.

    ПримечаниеПрограмма InfoPath отобразит сообщение об ошибке, который находится в разделе «Проблема».

Методы обхода проблемы

Для временного решения проблемы, можно использовать действия, подобные приведенному ниже, чтобы добавить новый метод веб-службы, которое удаляет несовместимые элементы XML из набора данных ADO.NET. Это можно сделать так, чтобы данные XML могут использоваться в InfoPath. Метод веб-службы можно удалить встроенные сведения схемы из XML-данных, или можно сериализовать данные XML в классе строго типизированную оболочку и возврата, метод веб-службы.

Каждый способ имеет свои преимущества и недостатки.

Способ 1

Удалить встроенную схему и несовместимые XML-атрибуты

Данного решения удобно, так как он является простым в реализации. Кроме того, при изменении XML-данных, которая возвращает исходный веб-службы для какой-либо причине этот способ не требует внесения изменений для работы с новым данным.

Тем не менее, есть и недостатком этого метода обхода. Данный метод обхода проблемы не описывается схема XML-данных. Таким образом InfoPath необходимо определить схему на основе образца данных. Если образцы данных не содержит все возможные элементы и атрибуты, метод веб-службы могут возвращать, схемы, InfoPath выводит не будет содержать эти элементы. Если выполняется запрос, возвращающий элементы или атрибуты, не входящие в пример вызова, программа InfoPath отобразит об ошибке.

Реализовать решение 1, выполните следующие действия:
  1. В Visual Studio .NET откройте проект NorthwindDataSet.
  2. НаПроектменю, нажмите кнопкуДобавление веб-службы. Назовите новый веб-службыIPCustomerInfo.asmx.
  3. Добавьте следующий код для нового IPCustomerInfo.asmx веб-службы:
    /************************************************************************
       * 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;
    }
    
    Пример кода использует исходный веб-службы для предоставления набора данных ADO.NET, а затем создает новый XML-документ без встроенной схемы данных.
  4. Скомпилируйте проект NorthwindDataSet.
  5. Запуска InfoPath. НаФайлменю, нажмите кнопкуПроектирование формы.
  6. Область задач Макет формы, нажмите кнопкуСоздать из источника данных.
  7. ВМастер настройки источника данныхдиалоговое окно, выберите пунктВеб-службыв качестве типа источника данных, а затем нажмите кнопкуСледующий.
  8. ВыберитеПолучение данных, а затем нажмите кнопкуСледующий.
  9. Введите адрес URL IPCustomerInfo веб-службы (например, http://localhost/NorthwindDataSet/IPCustomerInfo.asmx), а затем нажмите кнопкуСледующий.
  10. ВыберитеGetCustomerInfoNoSchemaметод для операции, а затем нажмите кнопкуСледующий.
  11. ВыберитеS0:CustomerIDпараметр, а затем нажмите кнопкуЗадать образец. ВУстановка значениядиалоговое окно, типALFKI, а затем нажмите кнопкуОК.
  12. Нажмите кнопкуСледующий, а затем нажмите кнопкуОкончание.
  13. ПеремещениеКлиентполя изqueryFieldsгруппы в области задач Источник данных, а затем добавьтеКлиентполеЗапроспредставления.
  14. ПеремещениеКлиентыГруппа изdataFieldsгруппы в области задач Источник данных, а затем добавьтеКлиентыгруппы дляВвод данныхпредставление . Нажмите кнопкуРаздел с элементами управления.
  15. Предварительного просмотра и протестируйте форму. Обратите внимание, что для некоторых кодов клиента напримерДАМАзапрос возникли ошибки, потому что образец данных не содержит всех возможных элементов, что веб-службы можно вернуть.

Решение 2

Создайте класс-оболочку со строгим типом для сериализации XML-данных из набора данных ADO.NET

Этот способ является достаточно сложно реализовать, чем в предыдущем методе обхода уязвимости. Кроме того данный метод обхода проблемы должны быть специально для каждого метода веб-службы используется вместе с, а метод веб-службы не должны изменить схему данных, возвращаемых им. Тем не менее данный метод обхода проблемы описана схема XML-данных, возвращаемых им. Таким образом InfoPath не требуется определять структуру данных. Таким образом, формы InfoPath, созданные из этого метода обхода не являются уязвимыми для ошибок, вызванных дополнительные элементы и атрибуты.
  1. В Microsoft Internet Explorer, переход на URL-адрес CustomerInfo службой тестирования страницы (например, http://localhost/NorthwindDataSet/CustomerInfo.asmx).
  2. Нажмите кнопкуGetCustomerInfoдля перехода к странице теста для данного метода.
  3. ВКлиентполе для вводаALFKI, а затем нажмите кнопкуВызвать.
  4. Из XML, в результате,<xs:schema>элемент и все его дочерние элементы и затем вставить их в новый текстовый документ в программе «Блокнот».
  5. Удалить-символы из вставленного текста, а затем сохраните документ какCustomerInfo.xsd.
  6. Откройте командную строку Visual Studio .NET и перейдите в каталог, где вы сохранили CustomerInfo.xsd.
  7. Используйте следующую строку для создания класса-оболочки из файла схемы:
    xsd.exe CustomerInfo.xsd /c /l:cs
  8. В Visual Studio .NET откройте проект NorthwindDataSet.
  9. НаПроектменю, нажмите кнопкуДобавление существующего элемента.
  10. Переместить в CustomerInfo.cs файл, созданный с помощью инструмента XSD.exe, а затем нажмите кнопкуОткрыть.
  11. Добавить пространство имен CustomerInfoWrapper вокругCustomerInfoкласса иCustomerInfoCustomersкласса
  12. Добавьте следующий код IPCustomerInfo.asmx веб-службы:
    /************************************************************************
       * 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;
    }
    
    В примере кода используется для предоставления набора данных ADO.NET, исходный веб-службы, а затем создает новый XML-документ без встроенной схемы данных.
  13. Скомпилируйте проект NorthwindDataSet.
  14. Запуска InfoPath. НаФайлменю, нажмите кнопкуПроектирование формы.
  15. Область задач разработки формы, нажмите кнопкуСоздать из источника данных....
  16. ВМастер настройки источника данныхдиалоговое окно, выберите пунктВеб-службыв качестве типа источника данных, а затем нажмите кнопкуСледующий.
  17. ВыберитеПолучение данных, а затем нажмите кнопкуСледующий.
  18. Введите адрес URL IPCustomerInfo веб-службы (например, http://localhost/NorthwindDataSet/IPCustomerInfo.asmx), а затем нажмите кнопкуСледующий.
  19. Для данной операции необходимо выбратьGetCustomerInfoWrapperметод, а затем нажмите кнопкуСледующий.

    Обратите внимание на то, что InfoPath не предлагает указать образцы значений для веб-службы метод.
  20. Нажмите кнопкуОкончание.
  21. ПеремещениеКлиентполя изqueryFieldsгруппы в области задач Источник данных, а затем добавьтеКлиентполя в режиме запроса.
  22. ПеремещениеКлиентыГруппа изdataFieldsгруппы в области задач Источник данных, а затем добавьтеКлиентыгруппы дляВвод данныхпредставления.
  23. Предварительного просмотра и протестируйте форму.

    Обратите внимание, что любой код допустимым клиента работает в этой форме.

Свойства

Код статьи: 822020 - Последний отзыв: 4 октября 2011 г. - Revision: 5.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Office InfoPath 2003
Ключевые слова: 
kbtshoot kbxml kbprb kbmt KB822020 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:822020

Отправить отзыв

 

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