Использование типов ДАННЫХ XML в собственных клиентах SQL Server

Применимо к:SQL ServerAzure SQL DatabaseAzure Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Внимание

Собственный клиент SQL Server (часто сокращенный SNAC) был удален из SQL Server 2022 (16.x) и SQL Server Management Studio 19 (SSMS). Собственный клиент SQL Server (SQLNCLI или SQLNCLI11) и устаревший поставщик Microsoft OLE DB для SQL Server (SQLOLEDB) не рекомендуется для разработки новых приложений. Перейдите на новый драйвер Microsoft OLE DB (MSOLEDBSQL) для SQL Server или последний драйвер Microsoft ODBC для SQL Server . Сведения о SQLNCLI, которые поставляется в качестве компонента ядра СУБД SQL Server (версии 2012–2019), см. в этом исключении жизненного цикла поддержки.

SQL Server 2005 (9.x) представил тип данных XML , позволяющий хранить XML-документы и фрагменты в базе данных SQL Server. Тип данных XML — это встроенный тип данных в SQL Server, который аналогичен другим встроенным типам, таким как int и varchar. Как и другие встроенные типы данных, тип данных xml можно использовать как тип столбца при создании таблицы, как тип переменной, параметра, тип возвращаемого функцией значения, а также в инструкциях CAST и CONVERT.

Замечания по программированию

Язык XML может описывать сам себя в том смысле, что он может по желанию включать заголовок XML, описывающий кодировку документа, например:

<?xml version="1.0" encoding="windows-1252"?><doc/>

Стандарт языка XML описывает, как обработчик XML определяет кодировку, использованную в документе, по первым нескольким байтам документа. Существует возможность, что кодировка, заданная приложением, не совпадет с кодировкой, заданной в документе. Для документов, передаваемых как привязанные параметры, XML обрабатывается как двоичные данные SQL Server, поэтому преобразование не выполняется, а средство синтаксического анализа XML может использовать кодировку, указанную в документе без проблем. Однако для XML-данных, привязанных как WSTR, приложение должно проверить, что документ имеет кодировку Юникод. Возможно, придется загрузить документ в модель DOM, изменить кодировку на Юникод и сериализовать документ. Если этого не сделать, может произойти порча данных, в результате чего образуется недопустимый или испорченный XML-документ.

Возможен также конфликт, если XML задается в виде литерала. Например, приведенные ниже инструкции являются недопустимыми.

INSERT INTO xmltable(xmlcol) VALUES('<?xml version="1.0" encoding="UTF-16"?><doc/>')

INSERT INTO xmltable(xmlcol) VALUES(N'<?xml version="1.0" encoding="UTF-8"?><doc/>')

Поставщик OLE DB для собственного клиента SQL Server

DBTYPE_XML — это новый тип данных, характерный для XML в поставщике OLE DB собственного клиента SQL Server. Кроме того, к XML-данным можно получить доступ через существующие типы OLE DB: DBTYPE_BYTES, DBTYPE_WSTR, DBTYPE_BSTR, DBTYPE_XML, DBTYPE_STR, DBTYPE_VARIANT и DBTYPE_IUNKNOWN. Данные, хранящиеся в столбцах типа XML, можно получить из столбца в наборе строк поставщика OLE DB собственного клиента SQL Server в следующих форматах:

  • Текстовая строка.

  • Интерфейс ISequentialStream

Заметка

Поставщик OLE DB собственного клиента SQL Server не включает средство чтения SAX, но ISequentialStream можно легко передать в объекты SAX и DOM в MSXML.

ISequentialStream следует использовать для получения больших XML-документов. При работе с типами больших значений в XML используются те же технологии, что и для работы с другими типами больших значений. Дополнительные сведения см. ниже в разделе Using Large Value Types (Использование типов большого объема).

Приложение может также получать, вставлять и изменять данные, хранящиеся в столбцах типа XML в наборе строк, через обычные интерфейсы, такие как IRow::GetColumns, IRowChange::SetColumns и ICommand::Execute. Как и в случае извлечения, программа приложения может передать текстовую строку или ISequentialStream поставщику OLE DB собственного клиента SQL Server.

Заметка

Для отправки данных XML в строковом формате через интерфейс ISequentialStream нужно получить этот интерфейс ISequentialStream, задав DBTYPE_IUNKNOWN и установив в привязке аргумент pObject, равный NULL.

Если полученные XML-данные усечены из-за недостаточного размера буфера потребителя, возвращаемое значение длины может быть равно 0xffffffff — это означает, что длина данных неизвестна. Это согласуется с реализацией в виде типа данных, передаваемого клиенту в потоке без пересылки информации о длине до пересылки самих данных. В некоторых случаях фактическая длина может быть возвращена, когда поставщик буферизовал целое значение, например IRowset::GetData и где выполняется преобразование данных.

XML-данные, переданные в SQL Server, сервер обрабатывает как двоичные данные. Таким образом предотвращается преобразование данных, и это позволяет средству синтаксического анализа XML автоматически обнаружить кодировку XML. Это позволяет принимать в качестве входных данных в SQL Server более широкий диапазон XML-документов (например, закодированных в UTF-8).

Если входные данные XML привязаны как тип DBTYPE_WSTR, приложение должно убедиться, что данные уже находятся в кодировке Юникод, чтобы предотвратить всякую возможность повреждения данных ненужными преобразованиями.

Привязки данных и приведение типов

В следующей таблице описаны привязка и приведение, возникающие при использовании перечисленных типов данных с типом xml-данных SQL Server.

Тип данных На сервер

XML
На сервер

Не XML
С сервера

XML
С сервера

Не XML
DBTYPE_XML Передать6,7 Ошибка1 ОК11, 6 Error8
DBTYPE_BYTES Передать6,7 Н/Д2 ОК 11, 6 Н/Д 2
DBTYPE_WSTR Передать6,10 Н/Д 2 ОК4, 6, 12 Н/Д 2
DBTYPE_BSTR Передать6,10 Н/Д 2 ОК 3 Н/Д 2
DBTYPE_STR ОК6, 9, 10 Н/Д 2 ОК5, 6, 12 Н/Д 2
DBTYPE_IUNKNOWN Байтовый поток через интерфейс ISequentialStream7 Н/Д 2 Байтовый поток через интерфейс ISequentialStream11 Н/Д 2
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) Передать6,7 Н/Д 2 Неприменимо Н/Д 2
DBTYPE_VARIANT (VT_BSTR) Передать6,10 Н/Д 2 ОК3 Н/Д 2

1Если вместе с интерфейсом ICommandWithParameters::SetParameterInfo указан тип сервера, отличный от DBTYPE_XML, а в качестве типа метода доступа задан DBTYPE_XML, при выполнении инструкции произойдет ошибка (DB_E_ERRORSOCCURRED, состояние параметра будет равно DBSTATUS_E_BADACCESSOR). В противном случае данные будут отправлены на сервер, но сервер вернет ошибку, указывающую, что неявного преобразования из XML в тип данных параметра не существует.

2За пределами этой статьи.

3Формат UTF-16, метка порядка байтов (BOM) отсутствует, кодировка не указана, данные не завершаются нулем.

4Формат UTF-16, метка порядка байтов (BOM) отсутствует, кодировка не указана, данные завершаются нулем.

5Формат многобайтовый, кодировка совпадает с кодовой страницей клиента, данные завершаются нулем. Преобразование из переданной с сервера кодировки Юникод может вызвать повреждение данных, поэтому такую привязку крайне не рекомендуется использовать.

6Может использоваться BY_REF.

7Данные в формате UTF-16 должны начинаться с метки порядка байтов (BOM). Если метка отсутствует, то кодировка может быть неправильно распознана сервером.

8Проверка может происходить во время создания метода доступа или во время получения данных. Значение ошибки — DB_E_ERRORSOCCURRED, для привязки устанавливается состояние DBBINDSTATUS_UNSUPPORTEDCONVERSION.

9Данные преобразуются в кодировку Юникода с помощью клиентской кодовой страницы до отправки данных на сервер. Если кодировка документа не соответствует клиентской кодовой странице, это может вызвать повреждение данных, поэтому такую привязку крайне не рекомендуется использовать.

10Метка порядка байтов (BOM) всегда добавляется к данным, отправляемым на сервер. Если в начале данных уже стоит метка порядка следования байтов, то в начале буфера будет две метки порядка следования байтов. Сервер использует первую метку для распознавания кодировки как UTF-16, а затем отбрасывает ее. Вторая метка порядка следования байтов рассматривается как символ неразрывного пробела нулевой ширины.

11Данные в формате UTF-16, кодировка не указана, метка порядка байтов (BOM) добавляется к данным, полученным с сервера. Если сервер вернул пустую строку, метка порядка байтов все равно будет возвращена приложению. Если длина буфера составляет нечетное число байтов, данные усекаются правильно. Если все значение возвращается по фрагментам данных, их можно объединить для восстановления правильного значения.

12Если длина буфера меньше двух символов, то есть недостаточно места для завершения null- сообщается ошибка переполнения.

Заметка

Для XML-данных со значением NULL не возвращаются никакие данные.

Согласно стандарту XML, XML-документы в кодировке UTF-16 должны начинаться с метки порядка следования байтов (BOM); в UTF-16 это код символа 0xFEFF. При работе с привязками WSTR и BSTR собственный клиент SQL Server не требует или добавляет BOM, так как кодировка подразумевается привязкой. При работе с привязками типов BYTES, XML и IUNKNOWN целью является предоставить возможности для наиболее простого взаимодействия с другими обработчиками XML и хранилищами данных. В этом случае в XML с кодировкой UTF-16 нужно включить метку порядка байтов, и приложение может не заботиться о том, какова на самом деле кодировка данных, потому что большинство обработчиков XML (в том числе SQL Server) вычислят кодировку по нескольким первым байтам данных. XML-данные, полученные от собственного клиента SQL Server с помощью привязок BYTES, XML или IUNKNOWN, всегда кодируются в UTF-16 с BOM и без внедренного объявления кодировки.

Преобразование данных, выполняемое основными службами OLE DB (IDataConvert), неприменимо к типу DBTYPE_XML.

Проверка производится при отсылке данных на сервер. Проверку с клиентской стороны и изменение кодировки должно проводить приложение. Обрабатывать непосредственно XML-данные не рекомендуется. Для обработки данных лучше использовать функции чтения DOM или SAX.

Типы DBTYPE_NULL и DBTYPE_EMPTY могут быть привязаны только для входных параметров. Они не могут быть привязаны для выходных параметров или результатов. При привязке входных параметров следует установить состояние DBSTATUS_S_ISNULL или DBSTATUS_S_DEFAULT.

DBTYPE_XML можно преобразовать в DBTYPE_EMPTY и DBTYPE_NULL, DBTYPE_EMPTY можно преобразовать в DBTYPE_XML, но DBTYPE_NULL нельзя преобразовать в DBTYPE_XML. Это согласуется с DBTYPE_WSTR.

Привязка DBTYPE_IUNKNOWN поддерживается, как показано в приведенной таблице, но преобразований между типами DBTYPE_XML и DBTYPE_IUNKNOWN не существует. DBTYPE_IUNKNOWN нельзя использовать с DBTYPE_BYREF.

Добавления и изменения для наборов строк OLE DB

Sql Server Native Client добавляет новые значения или изменения во многих основных наборах строк схемы OLE DB.

Наборы строк схем COLUMNS и PROCEDURE_PARAMETERS

К наборам строк схем COLUMNS и PROCEDURE_PARAMETERS добавлены следующие столбцы.

Имя столбца Type Description
SS_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Имя каталога, в котором определена коллекция схем XML. Значение NULL для столбцов, отличных от XML или нетипизированных XML-столбцов.
SS_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Имя схемы, в которой определена коллекция схем XML. Значение NULL для столбцов, отличных от XML или нетипизированных XML-столбцов.
SS_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR Имя коллекции схем XML. Значение NULL для столбцов, отличных от XML или нетипизированных XML-столбцов.

Набор строк схемы PROVIDER_TYPES

В наборе строк схемы PROVIDER_TYPES значение параметра COLUMN_SIZE для типа данных xml равно 0, а DATA_TYPE равен DBTYPE_XML.

Набор строк схемы SS_XMLSCHEMA

Для клиентов добавлен новый набор строк схемы SS_XMLSCHEMA для получения информации о схеме XML. Набор строк SS_XMLSCHEMA содержит следующие столбцы.

Имя столбца Type Description
SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Каталог, которому принадлежит коллекция XML.
SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Схема, которой принадлежит коллекция XML.
SCHEMACOLLECTIONNAME DBTYPE_WSTR Имя коллекции схем XML для типизированных XML-столбцов, NULL для всех остальных столбцов.
TARGETNAMESPACEURI DBTYPE_WSTR Имя целевого пространства имен схемы XML.
SCHEMACONTENT DBTYPE_WSTR Содержимое схемы XML.

Для каждой схемы XML область действия ограничивается именем каталога, именем схемы, именем коллекции схем и URI-идентификатором целевого пространства имен. Кроме того, задан новый идентификатор GUID с именем DBSCHEMA_XML_COLLECTIONS. Количество ограничений и столбцы с ограничениями для набора строк схемы SS_XMLSCHEMA определены следующим образом.

GUID Количество ограничений Столбцы с ограничениями
DBSCHEMA_XML_COLLECTIONS 4 SCHEMACOLLECTION_CATALOGNAME

SCHEMACOLLECTION_SCHEMANAME

SCHEMACOLLECTIONNAME

TARGETNAMESPACEURI

Добавления и изменения для наборов свойств OLE DB

SQL Server Native Client добавляет новые значения или изменения во многих основных наборах свойств OLE DB.

Набор свойств DBPROPSET_SQLSERVERPARAMETER

Для поддержки типа данных XML с помощью OLE DB sql Server Native Client реализует новый набор свойств DBPROPSET_SQLSERVERPARAMETER, содержащий следующие значения.

Имя Type Description
SSPROP_PARAM_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Имя каталога (базы данных), где определена коллекция схем XML. Часть идентификатора трехкомпонентного имени SQL.
SSPROP_PARAM_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Имя схемы XML в коллекции схемы XML. Часть идентификатора трехкомпонентного имени SQL.
SSPROP_PARAM_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR Имя коллекции схем XML в каталоге, представляющее собой часть трехчастного идентификатора имени SQL.

Набор свойств DBPROPSET_SQLSERVERCOLUMN

Для поддержки создания таблиц в интерфейсе ITableDefinition SQL Server Native Client добавляет три новых столбца в набор свойств DBPROPSET_SQLSERVERCOLUMN.

Имя Type Description
SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME VT_BSTR Для типизированных столбцов XML данное свойство содержит строку, представляющую имя каталога, где хранится схема XML. Для других типов столбцов это свойство содержит пустую строку.
SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME VT_BSTR Для типизированных столбцов XML данное свойство содержит строку, представляющую имя схемы XML, задающей этот столбец.
SSPROP_COL_XML_SCHEMACOLLECTIONNAME VT_BSTR Для типизированных столбцов XML данное свойство содержит строку, представляющую имя коллекции схем XML, определяющей значение.

Подобно значениям SSPROP_PARAM, все эти свойства являются необязательными и по умолчанию пусты. SSPROP_COL_XML_SCHEMACOLLECTION_CATALOGNAME и SSPROP_COL_XML_SCHEMACOLLECTION_SCHEMANAME можно задавать только при заданном свойстве SSPROP_COL_XML_SCHEMACOLLECTIONNAME. При передаче данных в формате XML на сервер, если эти значения включены, они будут проверены на существование (допустимость) в текущей базе данных, а экземпляр данных проверяется по схеме. Во всех случаях, чтобы данные были допустимыми, эти столбцы должны быть все одновременно пусты или все одновременно заполнены.

Добавления и изменения для интерфейсов OLE DB

Sql Server Native Client добавляет новые значения или изменения во многих основных интерфейсах OLE DB.

Интерфейс ISSCommandWithParameters

Для поддержки типа данных XML с помощью OLE DB sql Server Native Client реализует ряд изменений, включая добавление интерфейса ISSCommandWithParameters . Этот новый интерфейс наследует основной интерфейс OLE DB — ICommandWithParameters. Помимо трех методов, унаследованных от ICommandWithParameters; GetParameterInfo, MapParameterNames и SetParameterInfo; ISSCommandWithParameters предоставляет методы GetParameterProperties и SetParameterProperties, используемые для обработки определенных типов данных сервера.

Заметка

Интерфейс ISSCommandWithParameters также задействует возможности новой структуры SSPARAMPROPS.

Интерфейс IColumnsRowset

SQL Server Native Client добавляет следующие столбцы SQL Server в набор строк, возвращаемый методом IColumnRowset::GetColumnsRowset . Эти столбцы содержат трехчастное имя коллекции схем XML. Для столбцов не в формате XML и нетипизированных столбцов XML все три данных столбца по умолчанию имеют значение NULL.

Имя столбца Type Description
DBCOLUMN_SS_XML_SCHEMACOLLECTION_CATALOGNAME DBTYPE_WSTR Каталог, которому принадлежит коллекция схем XML.

В противном случае — значение NULL.
DBCOLUMN_SS_XML_SCHEMACOLLECTION_SCHEMANAME DBTYPE_WSTR Схема, которой принадлежит коллекция схем XML. В противном случае — значение NULL.
DBCOLUMN_SS_XML_SCHEMACOLLECTIONNAME DBTYPE_WSTR Имя коллекции схем XML для типизированных XML-столбцов, NULL — для всех остальных столбцов.

Интерфейс IRowset

Метод IRowset::GetData служит для получения экземпляра XML в столбце XML. В зависимости от привязки, указанной клиентом, экземпляр XML может быть получен в виде типа DBTYPE_BSTR, DBTYPE_WSTR, DBTYPE_VARIANT, DBTYPE_XML, DBTYPE_STR, DBTYPE_BYTES или как интерфейс через DBTYPE_IUNKNOWN. Если потребитель задает тип DBTYPE_BSTR, DBTYPE_WSTR или DBTYPE_VARIANT, поставщик преобразует экземпляр XML в запрошенный пользователем тип и помещает в местонахождение, заданное соответствующей привязкой.

Если потребитель задает DBTYPE_IUNKNOWN и устанавливает аргумент pObject равным NULL или задает для аргумента pObject значение IID_ISequentialStream, поставщик возвращает потребителю интерфейс ISequentialStream, чтобы потребитель мог получить из столбца данные XML в виде потока. Затем интерфейс ISequentialStream возвращает данные XML в виде потока символов в формате Юникода.

При возврате значения XML, привязанного к DBTYPE_IUNKNOWN, поставщик передает значение размера sizeof (IUnknown *). Следует заметить, что это согласуется с подходом, который используется при передаче привязанного столбца как DBTYPE_IUnknown или DBTYPE_IDISPATCH, а также при передаче в формате DBTYPE_IUNKNOWN/ISequentialStream, когда точный размер столбца установить не удается.

Интерфейс IRowsetChange

Потребитель может изменить экземпляр XML в столбце двумя способами. Первый способ использует объект хранилища с интерфейсом ISequentialStream, созданный поставщиком. Потребитель может вызвать метод ISequentialStream::Write для непосредственного изменения экземпляра XML, возвращенного поставщиком.

Второй подход использует методы IRowsetChange::SetData или IRowsetChange::InsertRow. При таком подходе экземпляр XML в буфере потребителя можно задать привязкой типа DBTYPE_BSTR, DBTYPE_WSTR, DBTYPE_VARIANT, DBTYPE_XML или DBTYPE_IUNKNOWN.

В случае DBTYPE_BSTR, DBTYPE_WSTR или DBTYPE_VARIANT поставщик сохраняет экземпляр XML из буфера потребителя в соответствующий столбец.

В случае DBTYPE_IUNKNOWN/ISequentialStream, если потребитель не задает объект хранилища, потребитель должен заранее создать объект ISequentialStream , привязать XML-документ к объекту, а затем передать объект поставщику через метод IRowsetChange::SetData . Потребитель может также создать объект хранилища, установить аргумент pObject равным IID_ISequentialStream, создать объект ISequentialStream, а затем передать этот объект ISequentialStream в метод IRowsetChange::SetData. В обоих случаях поставщик может получить объект XML через объект ISequentialStream и вставить в нужный столбец.

Интерфейс IRowsetUpdate

Интерфейс IRowsetUpdate предоставляет функциональность отсроченных изменений. Данные, предоставляемые наборам строк, недоступны другим транзакциям, пока потребитель не вызывает метод IRowsetUpdate:Update .

Интерфейс IRowsetFind

Метод IRowsetFind::FindNextRow не работает с типом xml. При вызове IRowsetFind::FindNextRow, если в аргументе hAccessor передается столбец типа DBTYPE_XML, будет возвращен результат DB_E_BADBINDINFO. Это происходит независимо от типа столбца, в котором производится поиск данных. Для любого другого типа привязки вызов FindNextRow возвращает результат DB_E_BADCOMPAREOP, если столбец, в котором производится поиск данных, имеет тип xml.

Драйвер ODBC для собственного клиента SQL Server

В драйвере ODBC собственного клиента SQL Server были внесены ряд изменений в различные функции для поддержки типа данных XML .

SQLColAttribute

Функция SQLColAttribute имеет три новых идентификатора поля, включая SQL_CA_SS_XML_SCHEMACOLLECTION_CATALOG_NAME, SQL_CA_SS_XML_SCHEMACOLLECTION_SCHEMA_NAME и SQL_CA_SS _XML_SCHEMACOLLECTION_NAME.

Драйвер ODBC собственного клиента SQL Server сообщает SQL_SS_LENGTH_UNLIMITED для столбцов SQL_DESC_DISPLAY_SIZE и SQL_DESC_LENGTH.

SQLColumns

Функция SQLColumns имеет три новых столбца , включая SS_XML_SCHEMACOLLECTION_CATALOG_NAME, SS_XML_SCHEMACOLLECTION_SCHEMA_NAME и SS_XML_SCHEMACOLLECTION_NAME. Существующий столбец TYPE_NAME используется для обозначения имени типа XML, а значение DATA_TYPE для столбца или параметра типа XML равно SQL_SS_XML.

Драйвер ODBC собственного клиента SQL Server сообщает SQL_SS_LENGTH_UNLIMITED для значений COLUMN_SIZE и CHAR_OCTET_LENGTH.

SQLDescribeCol

Драйвер ODBC собственного клиента SQL Server сообщает SQL_SS_LENGTH_UNLIMITED, если размер столбца не может быть определен в функции SQLDescribeCol .

SQLGetTypeInfo

Драйвер ODBC собственного клиента SQL Server сообщает SQL_SS_LENGTH_UNLIMITED как максимальный COLUMN_SIZE для типа данных XML в функции SQLGetTypeInfo .

SQLProcedureColumns

Функция SQLProcedureColumns имеет те же дополнения столбцов, что и функция SQLColumns.

Драйвер ODBC собственного клиента SQL Server сообщает SQL_SS_LENGTH_UNLIMITED в качестве максимального COLUMN_SIZE для типа данных XML .

Поддерживаемые преобразования

При преобразовании данных из типа SQL в типы языка C типы SQL_C_WCHAR, SQL_C_BINARY и SQL_C_CHAR могут быть преобразованы в SQL_SS_XML, со следующими оговорками.

  • SQL_C_WCHAR: формат — UTF-16, без метки порядка байтов (BOM) с завершением null.

  • SQL_C_BINARY: формат UTF-16 без завершения null. Метка порядка байтов (BOM) добавляется к данным, получаемым с сервера. Если сервер вернул пустую строку, метка порядка байтов все равно будет возвращена приложению. Если длина буфера представляет собой нечетное число байтов, данные усекаются правильно. Если все значение возвращается по фрагментам данных, их можно объединить для восстановления правильного значения.

  • SQL_C_CHAR. Формат — это многобайтовые символы, закодированные на кодовой странице клиента с завершением null. Преобразование из переданной с сервера кодировки UTF-16 может вызвать повреждение данных, поэтому такую привязку крайне не рекомендуется использовать.

При преобразовании данных из типов языка С в типы SQL типы SQL_C_WCHAR, SQL_C_BINARY и SQL_C_CHAR могут быть преобразованы в SQL_SS_XML, со следующими оговорками.

  • SQL_C_WCHAR. BOM всегда добавляется к данным, отправленным на сервер. Если в начале данных уже стоит метка порядка следования байтов, то в начале буфера будет две метки порядка следования байтов. Сервер использует первую метку для распознавания кодировки как UTF-16, а затем отбрасывает ее. Вторая метка порядка следования байтов рассматривается как символ неразрывного пробела нулевой ширины.

  • SQL_C_BINARY. Преобразование не выполняется, а данные передаются серверу "как есть". Данные UTF-16 должны начинаться с BOM; Если это не так, кодировка может быть неправильно распознана сервером.

  • SQL_C_CHAR. Данные преобразуются в UTF-16 на клиенте и отправляются на сервер так же, как SQL_C_WCHAR (включая добавление BOM). Если кодировка XML не совпадает с клиентской кодовой страницей, это может привести к повреждению данных.

Согласно стандарту XML, XML-документы в кодировке UTF-16 должны начинаться с метки порядка следования байтов (BOM); в UTF-16 это код символа 0xFEFF. При работе с привязкой SQL_C_BINARY собственный клиент SQL Server не требует или добавляет BOM, так как кодировка подразумевается привязкой. Целью является предоставить возможности для наиболее простого взаимодействия с другими обработчиками XML и хранилищами данных. В этом случае BOM должен присутствовать в формате XML в кодировке UTF-16, и приложению не нужно беспокоиться о фактической кодировке, так как большинство XML-процессоров (включая SQL Server) выводят кодирование путем проверки первых нескольких байтов значения. XML-данные, полученные от собственного клиента SQL Server с помощью SQL_C_BINARY привязки, всегда кодируются в UTF-16 с помощью BOM и без внедренного объявления кодировки.

См. также

Компоненты собственного клиента SQL Server
ISSCommandWithParameters (OLE DB)