1

我有一个非常大的 SQL 块,我试图在 Delphi 内部针对 Microsoft SQL 数据库执行。我得到这个:

  Multiple-step OLE DB operation generated errors. 
  Check each OLE DB status value, if available. No work was done.

该脚本有多个 sqlIF语句,后跟存储过程的调用、变量声明BEGIN等块。最后它返回一些变量值。ENDEXECSELECT @Variable1 AsName1,@Variable2 AsName2...

上面的多步错误是作为来自 ADO 的 OLEException 出现的,而不是来自 Delphi 代码,并且发生在所有 SQL exec-stored-procedure 发生之后,因此我怀疑它在到达最后阶段时会触发这个 OLE 异常哪个SELECT @Variable1 AsName1,...可以取回一些变量值供我的程序查看。

我知道这篇已停用/已弃用的 MS KB 文章,不幸的是,这不是我的实际问题:

http://support.microsoft.com/kb/269495

简而言之,知识库文章说要修复注册表项并从连接字符串中删除“持久安全信息”。那不是我的问题。我问这个问题是因为我已经找到了答案,而且我认为,当我在寻找解决方案几个小时后发现了几个问题时,被困在这里的其他人可能不想浪费几个小时来寻找潜在问题。任何想用不同选项添加另一个答案的人都可以,如果它是可重现的,我会选择你的,如果有必要,我会将这个变成社区 Wiki,因为这个“ADO 记录集”可能有十几个晦涩的原因心情不好,对你的 T-SQL 异常不满意。

4

3 回答 3

2

我发现了各种文档来源中列出的几个潜在原因。问题中的原始知识库文章建议从我的 ADO 连接字符串中删除“持久安全信息”,但是在只有 aTADOConnection和一个的应用程序的独立测试中TADOQuery,存在或不存在Persist Security Info没有效果,也没有明确设置它对或错。

什么 DID 修复了它删除了这个CursorType声明:

CursorType=ctKeyset

我了解到的是双向 ADO 数据集适用SELECT * FROM TABLE于 ADO,但不适用于复杂的 SQL 脚本。

于 2013-03-25T16:39:01.277 回答
1

此错误的潜在来源是更新具有大值的 char 字段。

示例:表单具有最大长度属性设置为 20 个字符的编辑框,并且 Oracle 数据库表具有定义为 char(10) 的字段。使用 10 个字符(或更少)更新将正常工作,而使用超过 10 个字符进行更新将导致 ADOQuerry.UpdateBatch() 上出现“多步骤...”错误。您还必须知道 CHAR 总是有 20 个字符。考虑在编辑框中修剪值。CHAR 的行为不同于 VARCHAR2 类型。

于 2013-08-13T14:00:04.707 回答
0

如果您有带参数的查询,请检查查询中的参数数量是否与脚本匹配...!

于 2016-11-08T11:36:02.627 回答