【问题标题】:ADO error 'Operation cancelled' in DelphiDelphi 中的 ADO 错误“操作已取消”
【发布时间】:2010-09-10 15:07:58
【问题描述】:

我有以下代码用于执行返回多个结果集的 sql 存储过程,然后从流中读取此结果。对于背景信息:它将 xml 块作为字符串返回,然后将其转换为完整的 xml。 它已经运行了一年多,但现在我遇到了一个导致错误消息的案例:操作已取消。调试器显示:项目 x 引发异常类 EOleException,消息 Operation cancelled。 我不知道是什么原因造成的。任何帮助或建议都会很棒。

const
  adExecuteStream = $00000400; //Indicates that the results of a command execution should be returned as a stream. 
var
  objCmd, InputStream, XML, XSLT, Template, Processor, objConn, strmResults : Variant;
  ATStreamClass : TMemoryStream;
  Adapt : TStreamAdapter;
  OutputStream: IStream;

objCmd := CreateOLEObject('ADODB.Command');
objCmd.ActiveConnection := dmABaasMock.dbRaAndm.ConnectionObject;
objCmd.CommandType := adCmdText;
objCmd.CommandText := <sp proc name with params>;
strmResults := CreateOLEObject('ADODB.Stream');
strmResults.Open;
objCmd.Properties['Output Stream'] := strmResults;
objCmd.Execute(EmptyParam, EmptyParam, adExecuteStream); // HERE COMES THE EXCEPTION
strmResults.Position := 0;
xmlMemo.text := strmResults.ReadText;

【问题讨论】:

    标签: delphi ado delphi-7


    【解决方案1】:

    如果不查看更多内容,很难猜测出了什么问题。
    你可以做三件事来获得更多的调试信息:

    • 从工作到现在有什么变化?操作系统版本(或 ADO)、数据库、存储过程……
    • 在 SQL 环境中直接启动时存储过程是否正常工作?
    • 能否重写代码以使用常规 ADO 组件而不是进行后期绑定,并在 DataSets 中而不是 ADODB.Stream OleObject 中获取结果。如果您需要在代码中调试和深入研究,那么仅拥有 Variant 对象并没有多大帮助?你不能调试黑盒...

    【讨论】:

    • 问题是它仍然适用于其他所有人,它是一个用户和数据的单一案例。我在存储过程中遇到了非常大的结果、超时问题,但在这种情况下也没有太多数据。所以,什么都没有改变,当从 Management Studio 执行时,存储过程可以正常工作,我确实必须在没有其他帮助的时候重写代码,但这仍然可以在 99.99% 的时间内工作。
    • @Tamm。 “它是一个用户和数据的单一案例......”您能否将用户和数据分开以查看它是否链接到数据或用户(或计算机)。这将有助于了解它是否链接到此数据库或某些用户的设置。
    • 所以,它没有链接到用户。我在自己的计算机上运行它,结果相同:EOleException,操作已取消。该错误是在 Delphi 的 ComObj 单元中的 DispCallError 过程中引发的。所以一定是数据相关的问题?我没有简单的方法将数据分成更小的部分进行调查,这几乎是不可能的。
    • @Tamm。对于这组确切的数据,存储过程在 Management Studio 中是否仍然可以正常工作?
    • 是的,这就是为什么我认为 ADO 有问题。 Delphi 堆栈窗口的最后一行是 DispCallError(-2147352567, (0, 0, 'Microsoft SQL Native Client', 'Operation cancelled', '', 0, nil, nil, -2147217887), nil, False)。跨度>
    【解决方案2】:

    我最近在连接到 ADO 时收到了一些奇怪的错误消息,并且连接字符串不正确。
    我不能 100% 确定这是相同的错误消息(抱歉,我当时忘记截屏了),但如果是,那么这可能会有所帮助:

    在 .NET 中,当您连接到 ADO 并使用集成安全性时,您可以指定 Integrated Security="True",但使用本机提供程序(不仅在 Delphi 中,而且在任何本机环境中),您必须指定 Integrated Security="SSPI" .

    我遇到这种情况是因为我在摆弄连接字符串(从 Delphi 本机 win32 连接到我之前从 .NET 连接到的服务器)并且忘记只复制相关部分。

    --杰罗恩

    【讨论】:

    • 感谢您的回答,连接字符串可能会让人头疼,但这里不能这样。连接没有问题,存储过程正确执行,之后连接仍然有效。
    • 好的;什么是确切的异常(异常类、异常消息、异常属性,如果它是具有错误列表的东西)?我猜你使用 SQL Server;您是否在那里运行跟踪以查看错误是在服务器上还是在 ADO 端?
    • 我跑了一个trace,错误不在服务器端。 EOleException,操作已取消。该错误是在 Delphi 的 ComObj 单元中的 DispCallError 过程中引发的。堆栈窗口的最后一行是 DispCallError(-2147352567, (0, 0, 'Microsoft SQL Native Client', 'Operation cancelled', '', 0, nil, nil, -2147217887), nil, False)。
    猜你喜欢
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多