Вероятно, это вопрос новичка, но как установить набор записей для строковой переменной?
Вот мой код:
Function getOffice (strname, uname)
strEmail = uname
WScript.Echo "email: " & strEmail
Dim objRoot : Set objRoot = GetObject("LDAP://RootDSE")
Dim objDomain : Set objDomain = GetObject("LDAP://" & objRoot.Get("defaultNamingContext"))
Dim cn : Set cn = CreateObject("ADODB.Connection")
Dim cmd : Set cmd = CreateObject("ADODB.Command")
cn.Provider = "ADsDSOObject"
cn.Open "Active Directory Provider"
Set cmd.ActiveConnection = cn
cmd.CommandText = "SELECT physicalDeliveryOfficeName FROM '" & objDomain.ADsPath & "' WHERE mail='" & strEmail & "'"
cmd.Properties("Page Size") = 1
cmd.Properties("Timeout") = 300
cmd.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Dim objRS : Set objRS = cmd.Execute
WScript.Echo objRS.Fields(0)
Set cmd = Nothing
Set cn = Nothing
Set objDomain = Nothing
Set objRoot = Nothing
Dim arStore
Set getOffice = objRS.Fields(0)
Set objRS = Nothing
End function
Когда я пытаюсь запустить функцию, выдается сообщение об ошибке «Ошибка выполнения vbscript: несоответствие типов». Я предполагаю, что это означает, что он не может установить строковую переменную со значением набора записей.
Как мне решить эту проблему?
Я только что попробовал
если IsNull (objRS.Fields (0) .Value) = TRUE, то getOFfice = "noAD" еще getOFfice = objRS.Fields (0) .VAlue конец, если
И это вызывает другую ошибку ADODB.Field: либо BOF, либо EOF имеет значение True, либо текущая запись была удалена. Запрошенная операция требует наличия текущей записи.





Cstr(objRS.Fields(0))
Говорит о недопустимом использовании Null: 'CStr'
Попробуйте изменить это:
Установите getOffice = objRS.Fields (0)
к этому:
getOffice = objRS.Fields (0)
Строка WScript.Echo .. getOffice = objRS.Fields (0) WScript.Echo getOffice спасибо
Ааа ... в этом случае я подозреваю, что указанная вами нулевая ошибка является ключом к разгадке. Что дает WScript.Echo VarType (objRS.Fields (0)
Хм .. WScript.Echo VarType (objRS.Fields (0)) выводит "1"
Я только что погуглил и означает "Null". идеи о том, как с этим справиться?
Тогда я предполагаю, что вы на самом деле ничего не получаете от своего запроса.
По моему опыту, различные способы возврата данных из вызова БД часто очень сильно зависят от метода / драйвера, используемого для доступа к данным (например, ODBC, ADO, ADO.NET, ODP.NET, OleDB и т. д.). нужен ToString (), GetString (), приведение или какой-либо другой вариант этого.
Это запрос ADSI. Я не уверен, как получить строку из этого объекта .. есть идеи?
Да, я заметил это сразу после того, как опубликовал свой первый ответ. Но по-прежнему кажется, что вы используете ADO, поэтому я ожидал, что он будет вести себя аналогичным образом. Вы можете попробовать вызвать MoveNext () в наборе записей, прежде чем пытаться читать из него.
Или, может быть, objRS.Fields.Item (0) ... Я давно не использовал ADO; Я ржавый.
Я думал о MoveNext, но он пытается получить доступ к коллекции Fields, которую, как мне кажется, следует заполнять независимо от того, на какой записи находится указатель.
Я попробовал item (), и он выдал другую ошибку, говоря, что не поддерживает этот метод. Я действительно ценил, и это вызвало у меня еще одну странную ошибку
Я просто добавил вверху «Возобновить при ошибке», и он просто пропускает нулевые ошибки.
хотя я хотел бы, чтобы был более простой способ обрабатывать значения NULL в vbscript.
Спасибо за всю вашу помощь
Вы уверены, что ваш набор записей не пуст? Обычно вам нужно сначала проверить, прежде чем что-либо делать. Не зная больше ничего о том, что ему нужно делать, я могу предложить что-то вроде этого:
Function getOffice (strname, uname)
strEmail = uname
WScript.Echo "email: " & strEmail
Dim objRoot : Set objRoot = GetObject("LDAP://RootDSE")
Dim objDomain : Set objDomain = GetObject("LDAP://" & objRoot.Get("defaultNamingContext"))
Dim cn : Set cn = CreateObject("ADODB.Connection")
Dim cmd : Set cmd = CreateObject("ADODB.Command")
cn.Provider = "ADsDSOObject"
cn.Open "Active Directory Provider"
Set cmd.ActiveConnection = cn
cmd.CommandText = "SELECT physicalDeliveryOfficeName FROM '" & objDomain.ADsPath & "' WHERE mail='" & strEmail & "'"
cmd.Properties("Page Size") = 1
cmd.Properties("Timeout") = 300
cmd.Properties("Searchscope") = ADS_SCOPE_SUBTREE
Dim objRS : Set objRS = cmd.Execute
If Not objRS.BOF Then objRS.Move First
If Not objRS.EOF Then
If Not IsNull(objRS.Fields(0)) and objRS.Fields(0) <> "" Then WScript.Echo cStr(objRS.Fields(0))
End If
Set cmd = Nothing
Set cn = Nothing
Set objDomain = Nothing
Set objRoot = Nothing
Dim arStore
Set getOffice = objRS.Fields(0)
Set objRS = Nothing
End function
Очевидно, есть много способов проверить наличие пустого набора записей, проверить наличие нулей и т. д., Но вот один из способов, который может сработать.
Set используется только для объектов, его нельзя использовать с простыми переменными, такими как строки. Попробуйте это: (он также проверяет, не пуст ли набор записей)
If objRS.RecordCount <> 0 Then
getOffice = CStr(objRS.Fields(0))
Else
getOffice = ""
End If
Попробуй это:
getOffice = objRS.getString
Это вернет весь набор записей в виде строки, разделенной табуляцией.
Установить getOffice = objRS.Fields (0) не может быть правильным - устанавливаются только объекты, а вы имеете дело со строками. Вы также должны сначала протестировать eof и bof для набора записей.