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.

Драйвер Microsoft ODBC 18 для SQL Server

который имеет другое имя от наследия:

SQL-сервер

Но я бы также рекомендовал не пытаться использовать какой-либо драйвер ODBC. У них есть ряд ошибок, которые нельзя исправить :

  1. Чтение столбцов не по порядку возвращает неверные значения

    Это необязательная оптимизация производительности, которая никому не нужна и не нужна. Драйверы ODBC совершенно свободно поддерживают чтение столбцов в любом порядке; драйвер Microsoft просто отказывается, потому что никто не хочет трогать код.

  2. Ошибки не возникают; но вместо этого молча едят

  3. Не удается вызвать синоним хранимой процедуры

    За исключением того, что использование драйвера 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) остаются устаревшими, и их не рекомендуется использовать для новых разработок.

Другие вопросы по тегам