我有一段用Delphi 2005編寫的代碼,用於在LDAP中搜索用戶的特定屬性。我得到當這是在運行一個訪問衝突是Windows 7或Windows Server 2008,但不能在XP或2003ADODB組件在Win7/Server 2008上導致訪問衝突
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。
哪條線引發異常? – jachguate 2013-02-27 04:35:16
ADOQuery.SQL.Add(S);是導致異常的行。當我在Delphi IDE調試器中運行測試應用程序時,它顯示OLEDBParameters.SetParameterInfo(0,nil,nil)上的ADODB.pas中發生的錯誤; – mcmar 2013-02-27 04:45:49
你的代碼亂七八糟!您不必「清除」新創建的「ADOQuery.SQL」。我對你爲什麼要創建一個ADOConnection感到困惑,但同時爲ADOQuery的'ConnectionString'屬性賦值,而不是在同一個ADOQuery上調用'Open'之後討論'ExecSQL'調用,或者如果要指定一個真/假值,而您可以只分配(否定)條件本身。 – jachguate 2013-02-27 07:10:07