【问题标题】:VBScript: how to set values from recordset to stringVBScript:如何将值从记录集设置为字符串
【发布时间】:2010-09-23 03:45:07
【问题描述】:

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

这是我的代码:

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,或者当前记录已被删除。请求的操作需要当前记录。

【问题讨论】:

  • Set getOffice = objRS.Fields(0) 不可能正确 - 仅设置了对象并且您正在处理字符串。您还应该首先测试记录集的 eof 和 bof。

标签: vbscript string recordset


【解决方案1】:

试试这个:


getOffice = objRS.getString

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      Cstr(objRS.Fields(0))
      

      【讨论】:

      • 说无效使用 Null: 'CStr'
      【解决方案4】:

      尝试改变这个:

      设置 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”
      • 我刚刚用谷歌搜索了一下,意思是“空”。关于如何处理的想法?
      • 那么我猜你实际上并没有从你的查询中得到任何回报。
      【解决方案5】:

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

      【讨论】:

      • 这是一个 ADSI 查询。我不确定如何从这个对象中获取字符串..有什么想法吗?
      • 是的,我在发布第一个回复后就注意到了这一点。但您似乎仍在使用 ADO,因此我希望它的行为类似。在尝试读取记录集之前,您可以尝试在记录集上调用 MoveNext()。
      • 或者可能是objRS.Fields.Item(0)...我已经有一段时间没有使用ADO了;我生锈了。
      • 我想到了 MoveNext,但他正在尝试访问我认为应该填充的 Fields 集合,而不管指针在什么记录上。
      • 我尝试了 item() 并且它抛出了一个不同的错误,说它不支持该方法。我确实做到了,它给我带来了另一个 bizaare 错误
      【解决方案6】:

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

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

      感谢大家的帮助

      【讨论】:

        【解决方案7】:

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

        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
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-06
          • 1970-01-01
          • 1970-01-01
          • 2021-04-02
          • 2019-10-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多