我正在尝试使用OPENQUERY从存储过程查询Active Directory,并将值添加到临时表中。我已经完成了所有工作,除非我在查询中添加'proxyAddresses'字段,否则会抛出此错误:
“OLE DB错误跟踪[OLE / DB提供程序'ADSDSOOBject'IRowset :: GetData返回0x80040e21:从提供程序返回的数据状态:[COLUMN_NAME = proxyAddresses STATUS = DBSTATUS_E_CANTCONVERTVALUE]]。 Msg 7346,Level 16,State 2,Line 2 无法从OLE DB提供程序“ADSDSOOBject”获取该行的数据。由于符号不匹配或溢出以外的原因,无法转换数据值。“
有没有人有从SQL查询'ProxyAddresses'属性的经验?我想我读到的地方是作为一个数组返回的。也许这就是问题?
谢谢!
答案 0 :(得分:2)
我想这里的问题是proxyAddresses可以是多值的(即包含多个值),我怀疑SQL Server中的OPENQUERY无法处理它。不确定是否有任何东西可以让它发挥作用,真的。
在article on CodeProject中发现这似乎证实了您和我的怀疑:
<强>限制强>
不幸的是,有一些Active 无法读取的目录值 与ADSI链接的服务器。那些 值称为“数组值”。 Active Directory中的数组值 是允许插入的字段 无限多个值。对于 例如,如果您存储多个电话 Active Directory中的数字 “电话”下的常规标签 数字/其他......“,你将无法做到 通过ADSI将这些内容读入您的SQL 服务器
你可以跳过它并在C#中查询这些地址吗?我可以告诉你一个样本。
马克
<强>更新强>:
好的,这是用于将多值属性捕获到字符串列表中的方法的更新(假设您已经有一个代表该用户的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");
答案 1 :(得分:0)
您是否尝试在proxyAddresses
声明中手动转换OPENQUERY
字段?