ADODB, SQLSERVER, SERVERPROPERTY: разные типы, использующие драйвер sqloledb или ODBC?
Я пытаюсь переключить один из моих сценариев VBS с использованием SQLOLEDB на драйвер ODBC. Пока все работает как положено - все, кроме одного:
При извлечении SERVERPROPERTY("is_clustered") из экземпляра MSSQL полученное значение отличается для каждого драйвера.
Вот вывод примера скрипта (скрипт следует ниже):
C:\> cscript test.vbs Provider: sqloledb is_clustered (name): is_clustered is_clustered (type): 12 is_clustered (value): 0 Driver: (SQL Server) is_clustered (name): is_clustered is_clustered (type): 204 C:\test.vbs(33, 1) Microsoft VBScript runtime error: Type mismatch
Кто-нибудь знает, что я делаю неправильно или чего мне не хватает в моем коде?
О да, код... вот пример самого скрипта:
Option Explicit
Dim RS, CONN1, CONN2
Set RS = CreateObject("ADODB.Recordset")
Set CONN1 = CreateObject("ADODB.Connection")
CONN1.ConnectionTimeout = 2
CONN1.Provider = "sqloledb"
CONN1.Properties("Integrated Security").Value = "SSPI"
CONN1.Properties("Data Source").Value = "HOSTNAME\INST01"
CONN1.Open
WScript.echo "Provider: sqloledb" & vbLf
RS.Open "SELECT SERVERPROPERTY('IsClustered') AS is_clustered", CONN1
WScript.echo "is_clustered (name): " & RS.fields(0).Name
WScript.echo "is_clustered (type): " & RS.fields(0).Type
WScript.echo "is_clustered (value): " & RS("is_clustered") & vbLf
RS.Close
Set CONN2 = CreateObject("ADODB.Connection")
CONN2.ConnectionTimeout = 2
CONN2.ConnectionString = "driver={SQL Server};" & _
"server=HOSTNAME\INST01;" & _
"Trusted_Connection=yes"
CONN2.Open
WScript.echo "Driver: (SQL Server)" & vbLf
RS.Open "SELECT SERVERPROPERTY('IsClustered') AS is_clustered", CONN2
WScript.echo "is_clustered (name): " & RS.fields(0).Name
WScript.echo "is_clustered (type): " & RS.fields(0).Type
WScript.echo "is_clustered (value): " & RS("is_clustered")
RS.Close
Спасибо заранее!
БР, Марсель
1 ответ
Таким образом, похоже, что устаревшая SQLOLEDB получает значение, возвращаемое ему как тип sql_variant, но при использовании устаревшего драйвера ODBC оно возвращается как
varbinary
.
Такие вещи не являются чем-то неслыханным. Добавлен SQL Server 2005.
varchar(max)
,
varbinary(max)
, , и некоторые другие. ADOdb не понимает эти типы, поэтому вам обязательно нужно добавить параметр в ConnectionString :
Server=hyperion; User ID=ruddiger;Password=hunter2;DataTypeCompatibility=80
Это приведет к тому, что SQL Server, например, вернет
xml
столбец как ntext
- Тип OLEDB:
DBTYPE_WSTR
(203) - Тип АДО:
adLongVarWChar
(203)
Потому что хотя они создали новый тип OLEDB для xml:
- Тип OLEDB:
DBTYPE_XML
(141)
ADO никогда не обновлялся после Windows 2000, чтобы знать, что
DBTYPE
из 141 есть. Так что выдаст ошибку.
Здесь может происходить что-то подобное с устаревшим драйвером ODBC SQL Server, и может быть параметр, который необходимо включить, чтобы заставить SQL Server возвращать устаревшие типы данных.
Вы также можете попробовать использовать современный поддерживаемый драйвер ODBC.
который имеет другое имя от наследия:
SQL-сервер
Но я бы также рекомендовал не пытаться использовать какой-либо драйвер ODBC. У них есть ряд ошибок, которые нельзя исправить :
Чтение столбцов не по порядку возвращает неверные значения
- чтение значений столбца в порядке без выбора дает значения мусора:
- Чтение столбцов не по порядку возвращает неверные значения (драйвер ODBC для SQL Server)
Это необязательная оптимизация производительности, которая никому не нужна и не нужна. Драйверы ODBC совершенно свободно поддерживают чтение столбцов в любом порядке; драйвер Microsoft просто отказывается, потому что никто не хочет трогать код.
Ошибки не возникают; но вместо этого молча едят
- ошибки не поднимаются (т.е. молча съедаются):
- Драйвер ODBC для SQL Server не вызывает ошибок
Не удается вызвать синоним хранимой процедуры
За исключением того, что использование драйвера ODBC для вызова процедуры синонима завершается ошибкой:
The request for procedure '%s' failed because '%s' is a synonym object SQLState: 37000 NativeError: 2809 The cursor was not declared. SQLState: 37000 NativeError: 16945
Загрузите последнюю, поддерживаемую и функциональную версию драйвера MSOLEDBSQL.
Вы должны обязательно добавить
DataTypeCompatibiliy=80
в строках подключения ADO.
Также обратите внимание на это примечание от Microsoft:
Предыдущий поставщик Microsoft OLE DB для SQL Server (SQLOLEDB) и поставщик OLE DB для собственного клиента SQL Server (SQLNCLI) остаются устаревшими, и их не рекомендуется использовать для новых разработок.