【发布时间】:2013-02-27 02:32:58
【问题描述】:
我有一段用 Delphi 2005 编写的代码,用于在 LDAP 中搜索用户的特定属性。在 Windows 7 或 Server 2008 上运行此程序时出现访问冲突,但在 XP 或 2003 上没有。
Function IsSSOUser(UserId: String): Boolean;
var
S : string;
ADOQuery : TADOQuery;
ADOConnectionSSO: TADOConnection;
begin
result := false;
Setdomainname;
ADOQuery := TADOQuery.Create(nil);
ADOConnectionSSO := TADOConnection.Create(nil);
try
ADOConnectionSSO.LoginPrompt := false;
ADOConnectionSSO.Mode := cmRead;
ADOConnectionSSO.Provider := 'ADsDSOObject';
ADOQuery.Connection := ADOConnectionSSO;
ADOQuery.ConnectionString := 'Provider=ADsDSOObject;Encrypt Password=False;Mode=Read;Bind Flags=0;ADSI Flag=-2147483648';
ADOQuery.SQL.Clear;
try
S := 'SELECT AdsPath, CN, SN, SSOguid FROM '''
+ LDAPString + ''' WHERE objectClass=''user'' and CN = ''' + UserId + ''' ';
ADOQuery.SQL.Add(S);
ADOQuery.Open;
ADOQuery.ExecSQL;
if trim(ADOQuery.FieldByName('SSOguid').AsString) = '' then
result := false
else
result := true;
except
on e:Exception do
if e.ClassType <> EOleException then
Showmessage(format('[%s] Exception in IsSSOUser: [%s]',[e.ClassType.ClassName, e.Message]));
end;
finally
ADOQuery.Close;
ADOConnectionSSO.Close;
ADOQuery.free;
ADOConnectionSSO.free;
end;
end;
此代码在 Windows XP 和 Windows Server 2003 上运行良好,但我在 Windows 7 和 Server 2008 上都遇到了访问冲突。我在网上看到许多关于更改 ADODB 接口如何破坏下游操作系统的线程,但是我似乎遇到了相反的问题。我在 Windows 7 机器上构建,代码仅适用于以前版本的 Windows。
【问题讨论】:
-
哪一行引发异常?
-
ADOQuery.SQL.Add(S);是导致异常的行。当我在 Delphi IDE 调试器中运行测试器应用程序时,它显示在 OLEDBParameters.SetParameterInfo(0,nil,nil); 上的 ADODB.pas 中发生的错误;
-
你的代码一团糟!您不必
Clear新创建的ADOQuery.SQL。我很困惑为什么你创建一个 ADOConnection 但同时为 ADOQuery 的ConnectionString属性分配一个值,更不用说在同一个 ADOQuery 上调用Open之后的ExecSQL调用,或 if 分配一个真/假值,您可以在其中分配(否定)条件本身。 -
@jachguate,这个特殊的代码是一个继承的混乱,直到最近才起作用。但如果需要更改,mcmar 可能会根据您的建议进行清理。
-
这个问题很重要,你们帮不上忙,你们说的不重要的台词不是异常的原因,如果有人知道答案,请让他回答...
标签: delphi adodb delphi-2005