VBScript: как установить значения из набора записей в строку - PullRequest
2 голосов
/ 20 ноября 2008

Вероятно, это вопрос новичка, но как установить набор записей в строковую переменную?

Вот мой код:

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

Ответы [ 7 ]

3 голосов
/ 27 ноября 2008

Попробуйте:


getOffice = objRS.getString

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

2 голосов
/ 24 ноября 2008

Set используется только для объектов, его нельзя использовать для простых переменных, таких как строки.
Попробуйте это: (это также гарантирует, что набор записей не пустой)


If objRS.RecordCount <> 0 Then
  getOffice = CStr(objRS.Fields(0))
Else
  getOffice = ""
End If
0 голосов
/ 23 ноября 2008

Вы уверены, что ваш набор записей не пуст? Обычно вы хотите проверить, прежде чем начать что-либо делать. Не зная ничего о том, что нужно делать, я мог бы предложить что-то вроде этого:

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

Очевидно, что существует много способов проверки пустого набора записей, проверки на нулевые значения и т. Д., Но вот один способ, который может сработать.

0 голосов
/ 20 ноября 2008

Я только что закончил тем, что добавил "On Error Resume Next" вверху, и он просто пропускает нулевые ошибки.

хотя хотелось бы, чтобы в vbscript был более простой способ обработки значений NULL.

спасибо за вашу помощь

0 голосов
/ 20 ноября 2008

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

0 голосов
/ 20 ноября 2008

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

Set getOffice = objRS.Fields (0)

к этому:

getOffice = objRS.Fields (0)

0 голосов
/ 20 ноября 2008
Cstr(objRS.Fields(0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...