2008-11-19 88 views
2

这可能是一个初学者问题,但是如何将记录集设置为字符串变量?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)。价值)= TRUE则 getOFfice = “noAD” 别的 getOFfice = objRS.Fields(0)。价值 端如果

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

+0

Set getOffice = objRS.Fields(0) 不能正确 - 只有对象被设置,并且您正在处理字符串。您还应该首先测试记录集的eof和bof。 – Fionnuala 2008-11-20 11:18:27

回答

0
Cstr(objRS.Fields(0)) 
+0

说无效使用空:'CStr' – phill 2008-11-19 23:15:30

0

尝试改变这一点:

设置getOffice = objRS.Fields(0)

这样:

getOffice = objRS.Fields(0)

+0

我试过了,它仍然抛出一个错误 – phill 2008-11-19 23:13:36

+0

哪一行会抛出错误? – EBGreen 2008-11-19 23:18:16

0

这是我的经验认为,从数据库调用返回数据的各种方式往往非常依赖于用于访问数据的方法/驱动程序(例如ODBC,ADO,ADO.NET,ODP.NET,OleDB等)。有些需要ToStri ng(),GetString(),一个强制转换或其他一些变体。

0

我刚刚结束在上面添加“On Error Resume Next”,它只是跳过空错误。

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

感谢您的全力帮助

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 

显然,有检查一个空的记录,并检查空值等多种方法,但这里有一个方法可能工作。

1

Set仅用于对象,它不能用于像字符串这样的简单变量。
试试这个:(这也可以确保记录不为空)


If objRS.RecordCount <> 0 Then 
    getOffice = CStr(objRS.Fields(0)) 
Else 
    getOffice = "" 
End If 
3

试试这个:


getOffice = objRS.getString 

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

相关问题