I've taken Charles Oppermann's excellent phone directory command line VBS and
tried to use it as a web application. I have added the necessary input field
and output location but the very end of the script throws Microsoft VBScript
runtime error '800a000d' Type mismatch errors. My entire site utilizes user
authentication so I know that the problem can't be there but I'm missing
something else, perhaps in my variable declaration.

The specific line causing the error is in the final loop:

strDisplayLine = objADORecordset.Fields("cn").Value & vbTab

= = = = = = = = = =

<%@ LANGUAGE="VBSCRIPT" %>
<%
Option Explicit
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>LDAP Lookup</title>
<style type="text/css">
body, input, select, table, textarea
{
font-size: 9pt;
font-family: arial;

}

.niceButton {
font-size : 9pt;
font-family : arial;
background-color : #eaeaea;
color : #333333;
font-weight : bold;
border-width : thin;
}
</style>
<%

dim strPerson, objADsRootDSE, strADsPath, strBase, strObjects, strName,
strAttributes, strScope, objADOConnection, objADOCommand, objADORecordset,
strDisplayLine, strFilter
strPerson = trim(request.form("last"))
' Input box is not empty and Cancel button was not clicked

' Build the query string
' Active Directory OLEDB Provider format has four parts separated by
semi-colons:
' Root: which is the starting point for the search
' Filter: conditions to search on, using RFC 2254 format
' Attributes: attributes to return
' Scope: base, onelevel or subtree for entire directory partition

' Specify the search base.
' We'll use the global catalog for performance reasons since the
' Name and Telephone number attributes are available from the GC

' First, need to discover the local global catalog server
Set objADsRootDSE = GetObject("GC://RootDSE")

' Form an ADsPath string to the DN of the root of the Active Directory forest
strADsPath = "GC://" & objADsRootDSE.Get("rootDomainNamingContext")

' Wrap the ADsPath with angle brackets to form the base string
strBase = "<" & strADsPath & ">"

' Release the ADSI object, no longer needed
Set objADsRootDSE = Nothing

' Specify the LDAP filter
' First, indicate the category of objects to be searched (all people, not
just users)
strObjects = "(objectCategory=person)"

' If user enters "*", then filter on all people
If (strPerson = "*") Then
strName = "(sn=*)"
Else
strName = "(sn=" & strPerson & "*)"
End If

' Add the two filters together
strFilter = "(&" & strObjects & strName & ")"

' Set the attributes we want the recordset to contain
' We're interested in the common name and telephone number
strAttributes = "cn,telephoneNumber"

' Specify the scope (base, onelevel, subtree)
strScope = "subtree"

' Create ADO connection using the ADSI OLE DB provider
Set objADOConnection = CreateObject("ADODB.Connection")
objADOConnection.Open "Provider=ADsDSOObject;"

' Create ADO commmand object and associate it with the connection
Set objADOCommand = CreateObject("ADODB.Command")
objADOCommand.ActiveConnection = objADOConnection

' Create the command string using the four parts
objADOCommand.CommandText = strBase & ";" & strFilter & ";" & strAttributes
& ";" & strScope

' Set the number of records in the recordset logical page
'objADOCommand.Properties("Page Size") = 20

' Set the maximum result size
objADOCommand.Properties("Size Limit") = 20

' Sort the results based on the cn attribute
objADOCommand.Properties("Sort On") = "cn"

' Execute the query for the user in the directory
Set objADORecordset = objADOCommand.Execute

If objADORecordset.EOF Then
strDisplayLine = "No records were found."
Else
' Loop through all the returned records
While Not objADORecordset.EOF

' Display the row using the selected fields
strDisplayLine = objADORecordset.Fields("cn").Value & vbTab

' Check to see if telephone number field is null
If IsNull(objADORecordset.Fields("telephoneNumber")) Then
strDisplayLine = strDisplayLine & "(number not listed)"
Else
' Retrieve telephone number and add to line
strDisplayLine = strDisplayLine & objADORecordset.Fields("telephoneNumber")
End If

' Advance to the next record
objADORecordset.MoveNext

Wend
End If

' Close the ADO connection
objADOConnection.Close

%>
</head>
<body text="#333333"><%=strDisplayLine%></body></html>

Re: Inscrutable Type Mismatch Error by Steven

Steven
Wed Dec 28 16:44:16 CST 2005

First, try it without ".Value"

strDisplayLine = objADORecordset.Fields("cn") & vbTab

Second, have you done a Response.Write on the field to see what it actually
contains? (var's in VBScript are automatically Variants, so it couldn't give
a right rats testical what the format is supposed to be, which means the
problem is most likely with the field itself (how you're trying to access it
perhaps?)).

--
Regards

Steven Burn
Ur I.T. Mate Group
www.it-mate.co.uk

Keeping it FREE!

"corbett" <corbett@discussions.microsoft.com> wrote in message
news:8368AB90-1DB3-4B34-8540-DAFED3E0DB94@microsoft.com...
> I've taken Charles Oppermann's excellent phone directory command line VBS
and
> tried to use it as a web application. I have added the necessary input
field
> and output location but the very end of the script throws Microsoft
VBScript
> runtime error '800a000d' Type mismatch errors. My entire site utilizes
user
> authentication so I know that the problem can't be there but I'm missing
> something else, perhaps in my variable declaration.
>
> The specific line causing the error is in the final loop:
>
> strDisplayLine = objADORecordset.Fields("cn").Value & vbTab
>
> = = = = = = = = = =
>
> <%@ LANGUAGE="VBSCRIPT" %>
> <%
> Option Explicit
> %>
> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
> <html>
> <head>
> <title>LDAP Lookup</title>
> <style type="text/css">
> body, input, select, table, textarea
> {
> font-size: 9pt;
> font-family: arial;
>
> }
>
> .niceButton {
> font-size : 9pt;
> font-family : arial;
> background-color : #eaeaea;
> color : #333333;
> font-weight : bold;
> border-width : thin;
> }
> </style>
> <%
>
> dim strPerson, objADsRootDSE, strADsPath, strBase, strObjects, strName,
> strAttributes, strScope, objADOConnection, objADOCommand, objADORecordset,
> strDisplayLine, strFilter
> strPerson = trim(request.form("last"))
> ' Input box is not empty and Cancel button was not clicked
>
> ' Build the query string
> ' Active Directory OLEDB Provider format has four parts separated by
> semi-colons:
> ' Root: which is the starting point for the search
> ' Filter: conditions to search on, using RFC 2254 format
> ' Attributes: attributes to return
> ' Scope: base, onelevel or subtree for entire directory partition
>
> ' Specify the search base.
> ' We'll use the global catalog for performance reasons since the
> ' Name and Telephone number attributes are available from the GC
>
> ' First, need to discover the local global catalog server
> Set objADsRootDSE = GetObject("GC://RootDSE")
>
> ' Form an ADsPath string to the DN of the root of the Active Directory
forest
> strADsPath = "GC://" & objADsRootDSE.Get("rootDomainNamingContext")
>
> ' Wrap the ADsPath with angle brackets to form the base string
> strBase = "<" & strADsPath & ">"
>
> ' Release the ADSI object, no longer needed
> Set objADsRootDSE = Nothing
>
> ' Specify the LDAP filter
> ' First, indicate the category of objects to be searched (all people, not
> just users)
> strObjects = "(objectCategory=person)"
>
> ' If user enters "*", then filter on all people
> If (strPerson = "*") Then
> strName = "(sn=*)"
> Else
> strName = "(sn=" & strPerson & "*)"
> End If
>
> ' Add the two filters together
> strFilter = "(&" & strObjects & strName & ")"
>
> ' Set the attributes we want the recordset to contain
> ' We're interested in the common name and telephone number
> strAttributes = "cn,telephoneNumber"
>
> ' Specify the scope (base, onelevel, subtree)
> strScope = "subtree"
>
> ' Create ADO connection using the ADSI OLE DB provider
> Set objADOConnection = CreateObject("ADODB.Connection")
> objADOConnection.Open "Provider=ADsDSOObject;"
>
> ' Create ADO commmand object and associate it with the connection
> Set objADOCommand = CreateObject("ADODB.Command")
> objADOCommand.ActiveConnection = objADOConnection
>
> ' Create the command string using the four parts
> objADOCommand.CommandText = strBase & ";" & strFilter & ";" &
strAttributes
> & ";" & strScope
>
> ' Set the number of records in the recordset logical page
> 'objADOCommand.Properties("Page Size") = 20
>
> ' Set the maximum result size
> objADOCommand.Properties("Size Limit") = 20
>
> ' Sort the results based on the cn attribute
> objADOCommand.Properties("Sort On") = "cn"
>
> ' Execute the query for the user in the directory
> Set objADORecordset = objADOCommand.Execute
>
> If objADORecordset.EOF Then
> strDisplayLine = "No records were found."
> Else
> ' Loop through all the returned records
> While Not objADORecordset.EOF
>
> ' Display the row using the selected fields
> strDisplayLine = objADORecordset.Fields("cn").Value & vbTab
>
> ' Check to see if telephone number field is null
> If IsNull(objADORecordset.Fields("telephoneNumber")) Then
> strDisplayLine = strDisplayLine & "(number not listed)"
> Else
> ' Retrieve telephone number and add to line
> strDisplayLine = strDisplayLine &
objADORecordset.Fields("telephoneNumber")
> End If
>
> ' Advance to the next record
> objADORecordset.MoveNext
>
> Wend
> End If
>
> ' Close the ADO connection
> objADOConnection.Close
>
> %>
> </head>
> <body text="#333333"><%=strDisplayLine%></body></html>



Re: Inscrutable Type Mismatch Error by corbett

corbett
Thu Dec 29 08:25:03 CST 2005

Thanks for those insights! I've decided to pursue a different tack and will
report back when I get it working.

"Steven Burn" wrote:

> First, try it without ".Value"
>
> strDisplayLine = objADORecordset.Fields("cn") & vbTab
>
> Second, have you done a Response.Write on the field to see what it actually
> contains? (var's in VBScript are automatically Variants, so it couldn't give
> a right rats testical what the format is supposed to be, which means the
> problem is most likely with the field itself (how you're trying to access it
> perhaps?)).
>
> --
> Regards
>
> Steven Burn
> Ur I.T. Mate Group
> www.it-mate.co.uk
>
> Keeping it FREE!
>
> "corbett" <corbett@discussions.microsoft.com> wrote in message
> news:8368AB90-1DB3-4B34-8540-DAFED3E0DB94@microsoft.com...
> > I've taken Charles Oppermann's excellent phone directory command line VBS
> and
> > tried to use it as a web application. I have added the necessary input
> field
> > and output location but the very end of the script throws Microsoft
> VBScript
> > runtime error '800a000d' Type mismatch errors. My entire site utilizes
> user
> > authentication so I know that the problem can't be there but I'm missing
> > something else, perhaps in my variable declaration.
> >
> > The specific line causing the error is in the final loop:
> >
> > strDisplayLine = objADORecordset.Fields("cn").Value & vbTab
> >
> > = = = = = = = = = =
> >
> > <%@ LANGUAGE="VBSCRIPT" %>
> > <%
> > Option Explicit
> > %>
> > <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
> > <html>
> > <head>
> > <title>LDAP Lookup</title>
> > <style type="text/css">
> > body, input, select, table, textarea
> > {
> > font-size: 9pt;
> > font-family: arial;
> >
> > }
> >
> > .niceButton {
> > font-size : 9pt;
> > font-family : arial;
> > background-color : #eaeaea;
> > color : #333333;
> > font-weight : bold;
> > border-width : thin;
> > }
> > </style>
> > <%
> >
> > dim strPerson, objADsRootDSE, strADsPath, strBase, strObjects, strName,
> > strAttributes, strScope, objADOConnection, objADOCommand, objADORecordset,
> > strDisplayLine, strFilter
> > strPerson = trim(request.form("last"))
> > ' Input box is not empty and Cancel button was not clicked
> >
> > ' Build the query string
> > ' Active Directory OLEDB Provider format has four parts separated by
> > semi-colons:
> > ' Root: which is the starting point for the search
> > ' Filter: conditions to search on, using RFC 2254 format
> > ' Attributes: attributes to return
> > ' Scope: base, onelevel or subtree for entire directory partition
> >
> > ' Specify the search base.
> > ' We'll use the global catalog for performance reasons since the
> > ' Name and Telephone number attributes are available from the GC
> >
> > ' First, need to discover the local global catalog server
> > Set objADsRootDSE = GetObject("GC://RootDSE")
> >
> > ' Form an ADsPath string to the DN of the root of the Active Directory
> forest
> > strADsPath = "GC://" & objADsRootDSE.Get("rootDomainNamingContext")
> >
> > ' Wrap the ADsPath with angle brackets to form the base string
> > strBase = "<" & strADsPath & ">"
> >
> > ' Release the ADSI object, no longer needed
> > Set objADsRootDSE = Nothing
> >
> > ' Specify the LDAP filter
> > ' First, indicate the category of objects to be searched (all people, not
> > just users)
> > strObjects = "(objectCategory=person)"
> >
> > ' If user enters "*", then filter on all people
> > If (strPerson = "*") Then
> > strName = "(sn=*)"
> > Else
> > strName = "(sn=" & strPerson & "*)"
> > End If
> >
> > ' Add the two filters together
> > strFilter = "(&" & strObjects & strName & ")"
> >
> > ' Set the attributes we want the recordset to contain
> > ' We're interested in the common name and telephone number
> > strAttributes = "cn,telephoneNumber"
> >
> > ' Specify the scope (base, onelevel, subtree)
> > strScope = "subtree"
> >
> > ' Create ADO connection using the ADSI OLE DB provider
> > Set objADOConnection = CreateObject("ADODB.Connection")
> > objADOConnection.Open "Provider=ADsDSOObject;"
> >
> > ' Create ADO commmand object and associate it with the connection
> > Set objADOComma