Я могу получить больше чем 1 000 записей от DirectorySearcher?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
68
задан Uwe Keim 28 March 2019 в 15:50
поделиться

1 ответ

Необходимо установить DirectorySearcher. PageSize к ненулевому значению для получения всех результатов.

BTW необходимо также расположить DirectorySearcher, когда Вы закончены с ним

using(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
    srch.PageSize = 1000;
    var results = srch.FindAll();
}

, документация API не является очень четкой, но по существу:

  • , когда Вы делаете разбитый на страницы поиск, SizeLimit проигнорирован, и все результаты соответствия возвращаются, поскольку Вы выполняете итерации через результаты, возвращенные FindAll. Результаты будут получены с сервера страница за один раз. Я выбрал значение 1 000 выше, но можно использовать меньшее значение, если предпочтено. Компромисс: использование небольшого PageSize возвратит каждую страницу результатов быстрее, но потребует более частых вызовов к серверу при итерации по большому количеству результатов.

  • по умолчанию поиск не разбит на страницы (PageSize = 0). В этом случае до SizeLimit результаты возвращается.

Как Biri, на который указывают, важно расположить SearchResultCollection, возвращенный FindAll, иначе у Вас может быть утечка памяти , как описано в разделе Remarks документации MSDN для DirectorySearcher. FindAll.

Один способ помочь избежать это в.NET 2.0 или позже должно записать метод обертки, который автоматически располагает SearchResultCollection. Это могло бы посмотреть что-то как следующее (или мог быть дополнительный метод в.NET 3.5):

public IEnumerable<SearchResult> SafeFindAll(DirectorySearcher searcher)
{
    using(SearchResultCollection results = searcher.FindAll())
    {
        foreach (SearchResult result in results)
        {
            yield return result;        
        } 
    } // SearchResultCollection will be disposed here
}

Вы могли тогда использовать это следующим образом:

using(var srch = new DirectorySearcher(dirEnt, "(objectClass=Group)", loadProps))
{
    srch.PageSize = 1000;
    var results = SafeFindAll(srch);
}
172
ответ дан Uwe Keim 24 November 2019 в 14:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: