Обработка XML-данных и пользовательских типов данных среды CLR
В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется.
В собственных веб-службах с поддержкой XML, начиная с SQL Server 2005, передача типов, таких как тип данных xml или пользовательские типы данных CLR, требует решения некоторых дополнительных задач разработки. В этом разделе описываются задачи, которые нужно выполнить, чтобы обеспечить приложениям на основе веб-служб XML возможность работать с типом xml и пользовательскими типами данных CLR в веб-методах и параметризованных запросах.
Примечание |
---|
Предполагается наличие базовых знаний о развертывании собственных веб-служб с поддержкой XML в SQL Server. Сюда входит знакомство с такими задачами, как создание конечных точек, возможность программирования SQL в виде веб-методов и написание базовых клиентских веб-приложений для SQL Server, использующих встроенные типы SQL. Если необходимо заново просмотреть сведения об этом, обратитесь к разделам Основные понятия о собственных веб-службах с поддержкой XML, Развертывание собственных веб-служб с поддержкой XML и Оптимальные методы использования собственных веб-служб с поддержкой XML. |
Обработка XML-данных в клиентских веб-приложениях
Некоторые детали корректной обработки клиентским веб-приложением типа данных xml зависят от того, какой применяется сценарий:
Работа с хранимой процедурой, представленной в качестве веб-метода в конечной точке.
Использование возможностей пакетного режима SQL (sqlbatch) конечной точки для выполнения параметризованного запроса.
Оба этих сценария требуют обработки параметризованных экземпляров типа данных xml посредством использования и заполнения структуры myEndpoint**::xml**. В этой структуре myEndpoint представляет реальное имя конечной точки, используемой при проведении экземпляров типа данных xml через код стороны клиента. Эта структура объявляется в классе конечной точки веб-прокси.
Структура myEndpoint**::xml** создается при добавлении или обновлении веб-ссылки на конечную точку, представляющую веб-метод в проекте Visual Studio. Однако необходимо будет заполнить исходную созданную структуру myEndpoint**::xml** в пользовательском веб-классе учетной записи-посредника соответствующим образом, основываясь на том, используется ли типизированный XML или нетипизированный XML в коде приложения на стороне клиента.
Экземпляры аргументов нетипизированного типа данных xml в веб-методах структура myEndpoint**::xml** представляет как упорядоченную последовательность типа System.Xml.XmlNode в классе учетной записи-посредника. Следовательно, чтобы передать экземпляр аргумента типа данных xml, необходимо вручную построить и заполнить последовательность узлов XML либо, что предпочтительнее, использовать с этой целью System.Xml.XmlDocumentFragment. Дополнительные сведения см. в разделе Работа с типом данных xml в клиентских приложениях Visual Studio.
Для типизированного xml в веб-методах создается пользовательский тип в веб-классе учетной записи-посредника, получающий имя в соответствии с нижеследующим форматом: имя метода объединяется со словом Type и затем с именем аргумента. Например, если веб-метод представлен с использованием имени GetXmlInfo и принимает аргумент типа данных xml с T для передачи типизированного XML в качестве входных данных, именем представленного пользовательского типа в веб-классе учетной записи-посредника будет GetXmlInfoTypeT. Этот пользовательский тип наследует из структуры myEndpoint**::xml**, следовательно, он таким же образом представляет типизированный XML в виде упорядоченной последовательности System.Xml.XmlNode.
Обработка типа данных xml в параметризованных запросах подобна работе с типом данных xml в веб-методах, за одним исключением: типизированный XML должен быть передан от клиента с использованием того же типа (myEndpoint**::xml**), который используется с нетипизированным XML.
После подготовки структуры myEndpoint**::xml** экземпляр типа данных xml может быть представлен в виде упорядоченной последовательности System.Xml.XmlNode внутри определенной структуры, а она, в свою очередь, включена в объект SqlParameter.Value.
Для параметризованного запроса необходимо использование функциональной возможности пакетного режима SQL. Могут понадобиться следующие дополнительные приготовления:
В конечной точке должно быть активировано использование SQL. Это означает, что BATCHES=ENABLED было использовано при создании или изменении конечной точки.
В классе веб-прокси метод sqlbatch() включается при добавлении или обновлении веб-ссылки на конечную точку с активированным пакетным режимом.
В случае с аргументами типизированного XML метод sqlbatch() в классе веб-прокси обновляется для включения настройки любых дополнительных свойств (XmlSchemaCollectionDatabase, XmlSchemaCollectionName, XmlSchemaCollectionOwningSchema), связанных с регистрацией коллекции XML-схем для объекта System.Data.SqlClient.SqlParameter.
Примечание |
---|
И для веб-методов, и для параметризованных запросов, представляющих тип данных xml, где System.Data.DataSet возвращается в выходных данных (в виде части упорядоченной последовательности объектов), и его содержимое помещается в DataGrid для визуализации результатов в клиентском приложении, DataSet не использует тип веб-прокси (myEndpoint::xml), а вместо него использует тип данных CLR System.Data.SqlTypes.SqlXml. |
Обработка пользовательских типов данных CLR клиентскими веб-приложениями
Чтобы обрабатывать пользовательские типы данных CLR в клиентском веб-приложении, необходимо выполнить следующие шаги:
Написать пользовательский тип данных CLR и скомпилировать его в файле DLL, например MyType.dll.
В Visual Studio 2005 написать пользовательский тип данных CLR (class или struct) и скомпилировать его в сборку. Сборка типа должна отвечать требованиям SQL Server для реализации пользовательских типов. Это позволит установить и зарегистрировать сборку в экземпляре SQL Server. Дополнительные сведения см. в подразделе «Требования для реализации пользовательских типов данных» раздела Определяемые пользователем типы данных CLR.
Чтобы создать дополняющий XML Serializer файл DLL, если IXMLSerializable еще не был реализован, необходимо выполнить Sgen.exe по DLL сборки типа. Этот файл может иметь имя наподобие MyType.XmlSerializers.dll.
Помимо соответствия базовым требованиям для использования пользовательского типа данных CLR в SQL Server, пользовательский тип данных CLR также должен быть упорядочиваемым в XML, чтобы работать с собственными веб-службами с поддержкой XML в SQL Server. Дополнительные сведения см. в подразделе «Сериализация XML» раздела Определяемые пользователем типы данных CLR.
Установить файл DLL сборки типа в экземпляре SQL Server, используя CREATE ASSEMBLY.
Если интерфейс IXMLSerializable не был реализован и шаг 2 не был выполнен, необходимо также установить дополняющий XML Serializer файл DLL в экземпляре SQL Server, используя CREATE ASSEMBLY.
Сериализовать пользовательский тип данных CLR в XML и включить его в структуру myEndpoint**::xml**, подобную описанной в предыдущем разделе.
После установки пользовательского типа данных CLR на сервере, чтобы передать экземпляр этого пользовательского типа данных CLR в SQL Server из клиентского приложения собственных веб-служб с поддержкой XML, сначала необходимо последовательно сериализовать пользовательский тип данных CLR в формат XML и включить его в структуру XML.
Нижеприведенный код иллюстрирует способ сериализации пользовательского типа данных CLR в формат XML и помещения его в элемент XML (System.Xml.XmlElement).
// Create the user-defined type class on the client.SqlString s = new SqlString("0:0");UdtClientApp.Point pnt = Point.Parse(s);// Invoke the method and pass in a user-defined type.You will need// to convert this to XmlElement before you can pass it to SQL Server.System.IO.MemoryStream writer = new System.IO.MemoryStream();System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(UdtClientApp.Point));serializer.Serialize(writer, pnt);writer.Seek(0, System.IO.SeekOrigin.Begin);System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();xmlDoc.Load(writer);System.Xml.XmlElement udtXml = xmlDoc.DocumentElement;
В зависимости от наличия пользовательского типа данных CLR на клиенте, может возникнуть необходимость в обратном преобразовании выходного аргумента из формата XML пользовательского типа данных CLR в его собственный формат пользовательского типа.
Нижеприведенный код иллюстрирует способ обратного преобразования пользовательского типа данных XML в пользовательский тип данных CLR в коде на стороне клиента. В этом примере пользовательским типом данных CLR является Point.
Object[] results = proxy.GetPointUdt(Convert.ToInt16(textBox1.Text), ref udtXml);//Deserialze the XML into user-defined type.TextReader reader = new StringReader(udtXml.OuterXml);// pnt was already defined as UdtClientApp.Point pnt = Point.Parse(s);pnt = (UdtClientApp.Point) serializer.Deserialize(reader);
Обратите внимание на то, что выполнение обратного преобразования необязательно, если пользовательский тип данных CLR используется как нетипизированный XML на клиенте.
Пользовательские типы данных CLR также могут быть переданы в качестве аргументов для параметризованного запроса тем же способом, как описано для типа данных xml. Пользовательский тип данных CLR в его сериализованной в XML форме должен быть передан от клиента с использованием типа myEndpoint**::xml**.
В параметризованном запросе, использующем пользовательские типы данных CLR, различные значения устанавливаются в структуре System.Data.SqlClient.SqlParameter. Например, нижеследующие настройки свойств используются для пользовательских типов данных CLR:
Свойству SqlDbType должно быть присвоено значение Udt.
В качестве значения свойства ClrTypeName должно быть использовано специальное трехчастное имя SQL Server (MyDatabase**.MySchema.**MyUdtType) установленного пользовательского типа в том виде, как оно зарегистрировано в экземпляре SQL Server.