2009-07-24 1 views
1

Я пытаюсь запросить Active Directory из хранимой процедуры с помощью OPENQUERY и добавить значения во временную таблицу. У меня все работает, за исключением случаев, когда я добавляю поле «proxyAddresses» в свой запрос, он выдает эту ошибку:Запрос адресов электронной почты, отличных от основного в Active Directory

«Ошибка протокола OLE DB [поставщик OLE/DB« ADSDSOOBject »IRowset :: GetData возвращается 0x80040e21: данные статус, возвращенный поставщиком: [COLUMN_NAME = proxyAddresses STATUS = DBSTATUS_E_CANTCONVERTVALUE]] Msg 7346, уровень 16, состояние 2, строка 2 Не удалось получить данные строки из поставщика OLE DB «ADSDSOOBject». Не удалось преобразовать данных по причинам, отличным от несоответствия знака или переполнения ».

Имеет ли кто-нибудь опыт с запросом свойства ProxyAddresses из SQL? Кажется, я где-то читал, что он был возвращен как массив. Может, в этом проблема?

Спасибо!

ответ

2

Я думаю, проблема в том, что proxyAddresses может быть многозначным (т. Е. Содержит несколько значений), и я подозреваю, что OPENQUERY в SQL Server не может с этим справиться. Не уверен, есть ли что-нибудь, что вы можете сделать, чтобы заставить это работать, действительно.

Нашел в article on CodeProject, который, кажется, чтобы подтвердить ваши и мои подозрения:

Limits

Unfortunately, there are some Active Directory values that can’t be read with the ADSI linked servers. Those values are called “Array Values”. Array values in the Active Directory are fields that allow to insert unlimited multiple values. For example, if you store multiple phone numbers in the Active Directory General tab under “Telephone numbers/Other…”, you won’t be able to read those via ADSI into your SQL Server.

вы можете пропустить, что и запрос для этих адресов в C#? Я мог бы показать вам пример этого.

Марк

UPDATE:
ОК, вот обновление с помощью метода, чтобы захватить многозначный атрибут в в виде списка строк (предполагается, что у вас уже есть DirectoryEntry, который представляет, что пользователь):

public List<string> GetMultiValues(DirectoryEntry entry, string propertyName) 
{ 
    if(entry == null) 
    { 
    return null; 
    } 

    List<string> results = new List<string>(); 

    if (entry.Properties.Contains(propertyName)) 
    { 
    foreach (object propertValue in entry.Properties[propertyName]) 
    { 
     results.Add(propertValue.ToString()); 
    } 
    } 

    return results; 
} 

Теперь вы можете назвать эту функцию так:

List<string> proxyAddresses = GetMultiValues(userEntry, "proxyAddresses"); 
+0

Да. Думаю, мне нужно сделать это на C#. Можете ли вы отправить этот образец, пожалуйста? Благодарю. – 2009-07-27 15:33:53

0

Вы пытались выполнить поле proxyAddresses вручную в своем заявлении OPENQUERY?

Смежные вопросы