【问题标题】:ADODB component causes access violation on Win7/Server 2008ADODB 组件导致 Win7/Server 2008 上的访问冲突
【发布时间】: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


【解决方案1】:

你必须添加

AdoQuery.ParamCheck := false;

在你之前

ADOQuery.SQL.Add(S);

因为您的 LDAPString 可能包含冒号 (:),例如。 "LDAP://...." 导致查询尝试为其创建参数对象。另外ADOQuery.Open之后不需要ADOQuery.ExecSQL

【讨论】:

  • 我做了你建议的那些改变。访问冲突消失了,但随后在 Recordset.Open 步骤的 ADODB.pas 中出现带有消息“未指定错误”的 EOleException。我之前提到的相同行为仍然存在。在 XP/2003 中运行良好,而在 Win7/2008 中崩溃。
  • 您是否尝试使用 SELECT cn,ou,sn FROM 'LDAP://DC=MyDom,DC=MyDomSpace' 或 SELECT * FROM 'LDAP://DC==MyDom 之类的查询进行连接,DC=MyDomSpace' where objectClass='user' and CN='AUsername' 确保不是 SSOguid 是问题?
  • 是的,无论 Select 语句中的内容是什么,都是同样的问题。
  • 是的,此应用程序始终以管理员身份运行。
猜你喜欢
  • 2013-04-02
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2019-04-16
相关资源
最近更新 更多