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

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

Установить getOffice = objRS.Fields (0) не может быть правильным - устанавливаются только объекты, а вы имеете дело со строками. Вы также должны сначала протестировать eof и bof для набора записей.

Fionnuala 20.11.2008 14:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
47 121
7

Ответы 7

Cstr(objRS.Fields(0))

Говорит о недопустимом использовании Null: 'CStr'

phill 20.11.2008 02:15

Попробуйте изменить это:

Установите getOffice = objRS.Fields (0)

к этому:

getOffice = objRS.Fields (0)

Строка WScript.Echo .. getOffice = objRS.Fields (0) WScript.Echo getOffice спасибо

phill 20.11.2008 02:23

Ааа ... в этом случае я подозреваю, что указанная вами нулевая ошибка является ключом к разгадке. Что дает WScript.Echo VarType (objRS.Fields (0)

EBGreen 20.11.2008 02:25

Хм .. WScript.Echo VarType (objRS.Fields (0)) выводит "1"

phill 20.11.2008 02:31

Я только что погуглил и означает "Null". идеи о том, как с этим справиться?

phill 20.11.2008 02:33

Тогда я предполагаю, что вы на самом деле ничего не получаете от своего запроса.

EBGreen 20.11.2008 02:39

По моему опыту, различные способы возврата данных из вызова БД часто очень сильно зависят от метода / драйвера, используемого для доступа к данным (например, ODBC, ADO, ADO.NET, ODP.NET, OleDB и т. д.). нужен ToString (), GetString (), приведение или какой-либо другой вариант этого.

Это запрос ADSI. Я не уверен, как получить строку из этого объекта .. есть идеи?

phill 20.11.2008 02:29

Да, я заметил это сразу после того, как опубликовал свой первый ответ. Но по-прежнему кажется, что вы используете ADO, поэтому я ожидал, что он будет вести себя аналогичным образом. Вы можете попробовать вызвать MoveNext () в наборе записей, прежде чем пытаться читать из него.

BQ. 20.11.2008 02:42

Или, может быть, objRS.Fields.Item (0) ... Я давно не использовал ADO; Я ржавый.

BQ. 20.11.2008 02:46

Я думал о MoveNext, но он пытается получить доступ к коллекции Fields, которую, как мне кажется, следует заполнять независимо от того, на какой записи находится указатель.

EBGreen 20.11.2008 02:46

Я попробовал item (), и он выдал другую ошибку, говоря, что не поддерживает этот метод. Я действительно ценил, и это вызвало у меня еще одну странную ошибку

phill 20.11.2008 02:58

Я просто добавил вверху «Возобновить при ошибке», и он просто пропускает нулевые ошибки.

хотя я хотел бы, чтобы был более простой способ обрабатывать значения 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

Это вернет весь набор записей в виде строки, разделенной табуляцией.

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