Не удается открыть строку подключения к SQL Server в VBSscript

У меня есть сценарий .vbs, который выполняет следующий запрос sql: Select COUNT (*) from sys.objects Который подсчитывает строки из вывода запроса sql: https://i.stack.imgur.com/wduXW.png[1]

И если есть найденные строки (> 0). создать оповещение в SCOM, используя среду выполнения сценариев PropertyBag в SCOM.

Проблема в том, что при отладке скрипта (используя cscript) я получаю следующее сообщение об ошибке:

(11,1) Поставщик Microsoft OLE DB для драйверов ODBC: [Microsoft] [драйвер ODBC SQL Server] [общая память] SQL Server не существует или доступ запрещен.

Хотя строка подключения кажется правильной:

strConnection = "Драйвер = {SQL Server}; Сервер = SCOMSRVDB01; База данных = DBABee; Trusted_Connection = TRUE"

Вот полный VBScript:

Dim objCN, strConnection
Dim oAPI, oBag

Set objCN = CreateObject("ADODB.Connection")
Set oAPI = CreateObject("MOM.ScriptAPI")
Set oBag = oAPI.CreatePropertyBag()



strConnection = "Driver={SQL Server};Server=SCOMSRVDB01;Database=DBABee;Trusted_Connection=TRUE"
objCN.Open strConnection

Dim strSQLQuery
strSQLQuery = "Select COUNT (*) from sys.objects"

Dim objRS
Set objRS=CreateObject("ADODB.Recordset")

Set objRS = objCN.Execute(strSQLQuery)

Do Until objRS.EOF
                'WScript.Echo objRS.Fields("No column name")
                if objRS.Fields("No column name") > 0 then
                                                                'WScript.Echo "evaluated as bad"
                                Call oBag.AddValue("State","BAD")
                                Call objAPI.Return(oBag)
                else
                                Call oBag.AddValue("State","GOOD")
                                Call objAPI.Return(oBag)
                end if
                objRS.MoveNext
Loop

objRS.Close

Стоит отметить, что в нашей компании вы не можете подключиться к серверу sql без указания номера порта.

Но когда я попытался добавить его (порт: 2880) в строку подключения:

strConnection = "Драйвер = {SQL Server}; Сервер = SCOMSRVDB01,2880; База данных = DBABee; Trusted_Connection = TRUE"

Скрипт возвращает следующую ошибку:

(23,17) ADODB.Recordset: элемент не может быть найден в коллекции, соответствующей запрошенному имени или порядковому номеру.


person edwio    schedule 21.03.2018    source источник
comment
Ошибка ADODB, указывающая, что элемент может быть найден, означает, что вы ДЕЙСТВИТЕЛЬНО подключились к БД, и он не может найти столбец. Я предполагаю, что это то, что не может найти: objRS.Fields("No column name")   -  person Jen R    schedule 21.03.2018


Ответы (1)


Ошибка ADODB, указывающая, что соединение с элементом найдено, означает, что вы успешно подключились к базе данных, и она не может найти запрошенный вами столбец. Вот что не могу найти: objRS.Fields("No column name")

Измените запрос и назовите столбец:

strSQLQuery = "Select COUNT (*) as countStuff from sys.objects"

Затем измените то, что вы ищете:

if objRS.Fields("countStuff") > 0 then
person Jen R    schedule 21.03.2018
comment
Эй, Джен Р., во-первых, спасибо за вашу помощь заранее, это очень ценно. я проверю и обновлю - person edwio; 21.03.2018
comment
Вы также можете использовать objRS.Fields(0) для проверки первого поля без псевдонима. - person user692942; 22.03.2018
comment
Привет, Lankyart, спасибо за помощь. Я пробовал этот метод раньше, но я получил ту же вторую ошибку - person edwio; 22.03.2018
comment
Jen R, я обновляю скрипт, следуя вашим инструкциям, и получаю следующую ошибку: (26, 33) Microsoft VBScript runtime error: Object required: 'objAPi' - person edwio; 22.03.2018
comment
Кажется, мне нужно объявить objec objAPI, но простое добавление: dim objAPI не сработало.. - person edwio; 22.03.2018
comment
ОБНОВЛЕНИЕ: оказалось, что имя объекта было неправильным, и после изменения скрипта на: Call oAPI.Return(oBag) все работает нормально. и я получаю следующий вывод: ‹DataItem type=System.PropertyBagData time=2018-03-22T10:37:54.3397467+02:00 sourceHealthServiceId=6041F260-B314-9D7F-A55F-2AFBF08939DC›‹Property Name=State VariantType=8›BAD‹/Property›‹/DataItem› Но я не вижу результатов запроса. в любом случае я могу увидеть вывод запроса через скрипт? - person edwio; 22.03.2018
comment
В приведенном выше сценарии вы просто получаете счет. Если вы хотите увидеть, что это такое, просто WScript.Echo (objRS.Fields("countStuff")) и оно будет выведено на консоль, или добавьте Call oBag.AddValue("Count",objRS.Fields("countStuff")), чтобы отправить его в ваш вызов oAPI. Если вам нужна дополнительная информация, вам придется получить больше с вашим запросом. - person Jen R; 22.03.2018
comment
Эй, Джен Р., есть ли способ настроить таргетинг на конкретный столбец и строку из вывода SQL-запроса? подобно массивам, ориентированным на VBScript, например: if objRS.Fields(0,2) Значение: Столбец = 0 Строка = 2 - person edwio; 25.03.2018