1

recordCountレコードセットの数を取得するには、関数を呼び出す必要があります。しかしrecordCount、関数を呼び出すと、レコードセットは制御不能になります。

...
Dim objRootDSE, strDNSDomain, adoCommand, adoConnection
Set adoCommand = CreateObject("ADODB.Command")
'Set adoRecordset = adoCommand.Execute
Set adoRecordset = Server.CreateObject ("ADODB.Recordset") 
adoRecordset.cursorType = 3
adoRecordset.CursorLocation = adUseClient 
adoRecordset = adoCommand.Execute
...


totalcnt = adoRecordset.recordCount

If totalcnt > 0 Then 
...
    Do until adoRecordset.EOF
        ' Retrieve values... But it fails because it seems adoRecordset is in EOF
        ...

だから私はmovefirst値を使用して取得しようとします。

If adoRecordset.recordCount > 0 Then 
                                            adoRecordset.movefirst
    ...

しかし、それはエラーが発生します(以下はGoogleによって翻訳されています)

ADODB.Recordset 오류 '800a0bcd' 
BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.

私が電話しなくてもrecordCount、問題ありません。しかし、私は記録の数を知っている必要があります。

コード全体は次のとおりです。

    <%
'On Error Resume next
 Dim objRootDSE, strDNSDomain, adoCommand, adoConnection
 Dim strBase, strFilter, strAttributes, strQuery, adoRecordset
 Dim strDN, strUser, strPassword, objNS, strServer
 Dim name,company,physicalDeliveryOfficeName

 Const ADS_SECURE_AUTHENTICATION = 1
 Const ADS_SERVER_BIND = 0

 ' Specify a server (Domain Controller).
 strServer = "my_ad_server_domain"

 ' Specify or prompt for credentials.
 strUser = "my_account"
 strPassword = "my_passwrd"

 ' Determine DNS domain name. Use server binding and alternate
 ' credentials. The value of strDNSDomain can also be hard coded.
 Set objNS = GetObject("LDAP:")
 Set objRootDSE = objNS.OpenDSObject("LDAP://" & strServer & "/RootDSE", _
      strUser, strPassword, _
      ADS_SERVER_BIND Or ADS_SECURE_AUTHENTICATION)
 strDNSDomain = objRootDSE.Get("defaultNamingContext")

 ' Use ADO to search Active Directory.
 ' Use alternate credentials.
 Set adoCommand = CreateObject("ADODB.Command")
 Set adoConnection = CreateObject("ADODB.Connection")
 adoConnection.Provider = "ADsDSOObject"
 adoConnection.Properties("User ID") = strUser
 adoConnection.Properties("Password") = strPassword
 adoConnection.Properties("Encrypt Password") = True
 adoConnection.Properties("ADSI Flag") = ADS_SERVER_BIND _
      Or ADS_SECURE_AUTHENTICATION
 adoConnection.Open "Active Directory Provider"
 Set adoCommand.ActiveConnection = adoConnection

 ' Search entire domain. Use server binding.
 strBase = "<LDAP://" & strServer & "/" & strDNSDomain & ">"

 ' Search for all users.
 strFilter = "(&(objectCategory=user)(ExADObjectStatus=10)(samaccountname=*"&"my_search_value"&"*))"

 ' Comma delimited list of attribute values to retrieve.
 strAttributes = "name,company,physicalDeliveryOfficeName"

 ' Construct the LDAP query.
 strQuery = strBase & ";" & strFilter & ";" _
      & strAttributes & ";subtree"

 ' Run the query.
 adoCommand.CommandText = strQuery
 adoCommand.Properties("Page Size") = 100
 adoCommand.Properties("Timeout") = 60
 adoCommand.Properties("Cache Results") = False
 Set adoRecordset = adoCommand.Execute




if not adoRecordset.EOF then 
    totalcnt = adoRecordset.recordCount 
    If totalcnt > 0 Then  
    Response.write 111
        Do until adoRecordset.EOF
            name = adoRecordset.Fields("name").Value
              company = adoRecordset.Fields("company").Value
              physicalDeliveryOfficeName = adoRecordset.Fields("physicalDeliveryOfficeName").Value
              Response.Write name & "<br/>"
              Response.Write company & "<br/>"
              Response.Write physicalDeliveryOfficeName
              adoRecordset.MoveNext
        Loop 
    end if 
end if 



 ' Clean up.
 adoRecordset.Close
 adoConnection.Close 
%>

レコードの結果を 1 つだけ表示します。

4

2 に答える 2

1

別の角度から問題に直面することができます。内部recordCountプロパティを修正しようとする (できない) 代わりに、単純に自分でレコードを数えます。

totalcnt = 0
Do until adoRecordset.EOF
    totalcnt = totalcnt + 1
    adoRecordset.MoveNext
Loop

If totalcnt>0 Then
    adoRecordset.MoveFirst
    Do until adoRecordset.EOF
        name = adoRecordset.Fields("name").Value
        '...
        adoRecordset.MoveNext
    Loop
End If

更新: その特定のケースでは、MoveFirst が失敗するように見えます。おそらく、それは LDAP であり、データベースからの通常のクエリではないためです。これを完全に破壊するには、レコードを反復するときに独自のコレクションを作成し、そのコレクションを好きなだけ使用できます。

Dim oData, oField, tempArray
Set oData = Server.CreateObject("Scripting.Dictionary")
totalcnt = 0
For Each oField In adoRecordset.Fields
    oData.Add oField.Name, Array()
Next
Do until adoRecordset.EOF
    For Each oField In adoRecordset.Fields
        tempArray = oData(oField.Name)
        ReDim Preserve tempArray(UBound(tempArray) + 1)
        tempArray(UBound(tempArray)) = oField.Value
        oData(oField.Name) = tempArray
    Next
    totalcnt = totalcnt + 1
    adoRecordset.MoveNext
Loop
adoRecordset.Close

Dim x
If totalcnt>0 Then
    Response.Write("found total of " & totalcnt & " records<br />")
    For x=0 To totalcnt-1
        name = oData("name")(x)
        company = oData("company")(x)
        physicalDeliveryOfficeName = oData("physicalDeliveryOfficeName")(x)
        Response.Write name & "<br/>"
        Response.Write company & "<br/>"
        Response.Write physicalDeliveryOfficeName
    Next
End If
于 2012-10-16T08:35:41.257 に答える
1

エラーが示すように、レコードセットにレコードがない場合、recordCount は失敗します。

これは、コード ブロックの前にテストできます。これを試して:

if not adoRecordset.EOF then
    totalcnt = adoRecordset.recordCount
    If totalcnt > 0 Then 
        ...
        Do while not adoRecordset.EOF
        ...
        Loop
    end if
end if

edit : adoRecordset.eofではないことをテストするループを修正しました

于 2012-10-15T08:10:53.103 に答える