2

这可能是一个初学者的问题,但是如何将记录集设置为字符串变量?

这是我的代码:

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" else getOFFice = objRS.Fields(0).VALue end if

这会引发不同的错误 ADODB.Field:BOF 或 EOF 为 True,或者当前记录已被删除。请求的操作需要当前记录。

4

7 回答 7

4

尝试这个:


getOffice = objRS.getString

这会将整个记录集作为制表符分隔的字符串返回。

于 2008-11-26T21:41:00.487 回答
2

Set 仅用于对象,不能用于字符串等简单变量。
试试这个:(它还确保记录集不为空)


If objRS.RecordCount <> 0 Then
  getOffice = CStr(objRS.Fields(0))
Else
  getOffice = ""
End If
于 2008-11-24T19:30:46.803 回答
0

你确定你的记录集不是空的吗?通常你会想在开始做任何事情之前先检查一下。对它需要做什么一无所知,我可能会建议这样的事情:

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

显然有很多方法可以检查空记录集,检查空值等,但这里有一种方法可能有效。

于 2008-11-23T15:49:11.013 回答
0
Cstr(objRS.Fields(0))
于 2008-11-19T23:11:43.583 回答
0

尝试改变这个:

设置 getOffice = objRS.Fields(0)

对此:

getOffice = objRS.Fields(0)

于 2008-11-19T23:12:19.370 回答
0

根据我的经验,从 DB 调用返回数据的各种方式通常非常依赖于用于访问数据的方法/驱动程序(例如 ODBC、ADO、ADO.NET、ODP.NET、OleDB 等)。需要 ToString()、GetString()、演员表或其他一些变体。

于 2008-11-19T23:18:01.310 回答
0

我刚刚在顶部添加了“On Error Resume Next”,它只是跳过了空错误。

虽然我希望有一种更简单的方法来处理 vbscript 中的 NULL 值。

感谢你的帮助

于 2008-11-20T00:07:30.243 回答