Доступ к потоку XML из ADO против SQL Server 2008

Мы переносим код ASP, который использовал ADO для подключения к SQL Server 2000. По большей части код без проблем переносился на SQL Server 2008 после определения подключения, но один тип запроса вызывает ошибку, которая меня озадачивает.

В случае с SQL 2000 мы бы использовали такой код:

set oCommand = Server.CreateObject("ADODB.Command")
oCommand.ActiveConnection = oConn 'already established
oCommand.CommandType = adCmdText 

'This is simplified over the real code, but the wrapper is what we use.
oCommand.CommandText = "<Root xmlns:sql='urn:schemas-microsoft-com:xml-sql'><sql:query>" 
+ Server.HTMLEncode(sql) 
+ "</sql:query></Root>" 

oCommand.Dialect = "{5D531CB2-E6ED-11D2-B252-00C04F681B71}" 'SQL Dialect GUID
oCommand.Properties("Output Stream").Value = oXMLDoc 'Already created
oCommand.Execute , , adExecuteStream 'The point of error

SQL — это вызов хранимой процедуры, который работает при обычном вызове. Этот код продолжает работать с SQL 2000, но с SQL 2008 он возвращает:

Ошибка ERR_OPENSQLXML XMLDB.openSQLXML. Ошибка «-2147217898»: «Диалект команд не поддерживается этим провайдером».

Мое первое предположение состоит в том, что SQL 2008 полагается на MSXML версии 6, и мне нужен новый гид. Мои MSDN и Google-Fu подвели меня: все результаты, которые я нахожу, используют этот GUID.

Есть ли новый GUID? Есть ли способ лучше? Это лучше, чем меньше хлопот, чем перекодирование в ASP.NET (участь многих страниц уже).

РЕДАКТИРОВАТЬ: мне интересно, мешает ли использование клиента SQLNCLI10 этому?

configConnString = 
"Provider=SQLNCLI10;DataTypeCompatibility=80;Server=XYZZY;Database=ucpm;MARS Connection=True;Trusted_Connection=Yes;"

person Godeke    schedule 06.05.2009    source источник
comment
я думаю, что правильный термин - Google-Fu;)   -  person Darren Kopp    schedule 06.05.2009
comment
Исправлено :-) Глупая автокоррекция проверки орфографии.   -  person Godeke    schedule 06.05.2009


Ответы (1)


Вместо того, чтобы сосредоточиться на языке, который я не видел документально измененным, ASP.dll по-прежнему поддерживается в следующей версии сервера Windows с момента последней проверки, которую я сделал.

Можете ли вы проверить, что у клиента, с которого вы подключаетесь, установлен собственный клиент MSSQL 10, а не старые клиенты odbc/oledb sql 2000.

person u07ch    schedule 06.05.2009
comment
Я обновил вопрос с помощью используемой строки подключения. Я использую провайдер SQLNCLI10, который прекрасно работает с традиционными параметризованными запросами, но не с потоком XML. - person Godeke; 06.05.2009
comment
Две вещи извиняются, если первая покровительственная; установлен ли sqlxml; в sql 2008 он не установлен по умолчанию. msdn.microsoft.com/en-us/library/cc645615.aspx Второй; можете ли вы попробовать тестовый образец, предоставленный ms в cscript, чтобы убедиться, что все работает должным образом msdn.microsoft.com/en-us/library/ms171785.aspx - person u07ch; 06.05.2009
comment
И нет, проверка того, установлен ли он, не была покровительственной. Очень часто это простой ответ, который является правильным :) - person Godeke; 07.05.2009
comment
Тестовый скрипт указал на работу. Я отправил ему запрос, который терпит неудачу в ASP/ADO, и он работал как чемпион, возвращая XML-документ с правильными данными. Я отмечаю, что в примере не используется DataTypeCompatibility=80 (что, по моему мнению, необходимо для классических подключений ASP/ADO к собственному клиенту). - person Godeke; 07.05.2009
comment
Я понятия не имею об этом; я знаю, что DataTypeCompatibility 80 должен был поддерживать типы данных sql2005. Однако все их другие примеры используют его. Если вы перепрыгнули с 2000 на › 2008 год, то, скорее всего, вы не используете n/varchar(max) или другие новые типы, так что вы, вероятно, обойдетесь без него. Я не могу найти ничего в Google, что могло бы объяснить, почему это может вызвать ошибку. - person u07ch; 07.05.2009
comment
Открытие нового соединения с базой данных с использованием строки типа Provider=SQLXMLOLEDB.4.0;Data Provider=SQLNCLI10;Server=XYZZY;Database=ucpm;Integrated Security=SSPI решает эту проблему. Поскольку все XML-запросы выполняются через одну служебную функцию, достаточно открыть это второе соединение. Спасибо. - person Godeke; 07.05.2009