Самый эффективный способ чтения XML в ADO.net из столбца типа XML на сервере SQL? - PullRequest
3 голосов
/ 20 января 2012

С помощью столбца типа XML на сервере SQL, каков наиболее эффективный способ считывания этого обратно в XmlDocument в ADO.Net?

?

Для этого конкретного использования XmlDocument необходим для произвольного доступа к загруженному документу. Использование .Net 4.0 (C #) и SQL Server 2008 R2.

Первоначально у нас была хранимая процедура, которая возвращала набор результатов. При вызове SqlDataAdapter.Fill(DataTable) для получения результатов XML возвращается только как string.

Затем я изменил это, чтобы T-SQL возвращал выходной параметр типа 'XML', и зарегистрировал его в .Net как выходной параметр типа SqlDbType.Xml. После выполнения результирующий выходной параметр имеет значение .DbType и .SqlDbType, равное DbType.Xml, но вызов .Value возвращает тип System.String.

I может вызвать .SqlValue на этом, который возвращает тип SqlTypes.SqlXml. Отсюда я могу назвать его .Value - который просто возвращает string или CreateReader - который возвращает XmlReader. Так что я мог бы использовать это для заполнения XmlDocument, используя XmlDocument.Load(XmlReader).

Главный вопрос - есть ли какая-то польза от этого, или я должен просто вернуться к получению строки - затем передать это new XmlDocument().LoadXml(string)? Позволит ли использование подхода SqlXml более эффективно передавать XML между SQL и уровнем .Net или же XML будет просто прозрачно передаваться в виде строки в любом случае «по проводам»? Даже если позже, я предполагаю, что подход SqlXml.CreateReader может быть более эффективным, так как строка, содержащая всю структуру XML, никогда не потребуется создавать сразу в памяти - и на данный момент планирую использовать это .

(В качестве альтернативы я рассматривал использование SqlDataReader и его метода GetSqlXml. Интересно, что в настоящее время есть только 3 других результата для SO для "GetSqlXml" и пока Как получить данные XML из столбец в таблице SQL? представляется наиболее релевантным результатом, он ищет решение другой проблемы.)

Обратное было довольно простым: создайте XmlDocument, добавьте входной параметр типа SqlDbType.Xml, передайте в качестве значения экземпляр XmlDocument - и все готово.

Я понимаю, что могу сам профилировать различия между этими методами - и планирую сделать это, как только будет время. Просто ищу кого-то, у кого уже могут быть ответы или кто-то может предложить альтернативы, которые я еще не рассматривал или с которыми я не знаком.

1 Ответ

4 голосов
/ 20 января 2012

Какой бы выбор вы не сделали, следует использовать XmlReader. Не заставляйте SQL Server сериализовать XML в текстовую форму.


Обновление:

SQL Server хранит XML в эффективном двоичном формате. SqlXml.CreateReader создает объекты XmlNode из этого двоичного формата. В противном случае эффективный XML-код должен быть сериализован в строку, а поверх него - снова проанализирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...