通过TADOQuery执行的复杂T-SQL脚本触发“多步OLE DB操作生成错误”。

问题描述:

我有一块非常大的SQL块,我试图在Delphi内部针对Microsoft SQL数据库执行。我得到这个:通过TADOQuery执行的复杂T-SQL脚本触发“多步OLE DB操作生成错误”。

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

脚本有多个SQL语句IF之后BEGINEND块用的存储过程,变量声明,EXEC内部的调用。最后它返回SELECT @Variable1 AsName1,@Variable2 AsName2...的一些变量值。

上面的多步错误是从ADO中而不是从Delphi代码中引入的,并且在所有SQL exec存储过程发生之后发生,因此我怀疑它在它发生这个OLE异常时触发到达最后阶段SELECT @Variable1 AsName1,...为我的程序找回几个变量值来查看它们。

我知道这个退休/弃用MS KB文章,这是不幸的是没有我的实际问题:

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

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

我发现了各种文档资源中列出的几个潜在原因。问题中的原始知识库文章建议从我的ADO连接字符串中删除“Persist Security Info”,但是,在仅使用TADOConnection和单个TADOQuery的应用程序的独立测试中,Persist Security Info的存在与否不起作用,也没有明确地将其设置为True或False。

什么解决它删除此CursorType声明:

CursorType=ctKeyset

我学到的是,双向ADO数据集都很好,在ADO SELECT * FROM TABLE但不复杂的SQL脚本,以便罚款。

+1

因此您使用了哪种CursorType? – kobik 2016-11-08 11:52:19

+0

无论您何时放弃此声明,都是默认设置。 – 2016-11-17 03:20:37

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

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

+0

您使用的是ADO的ORACLE? – 2013-08-18 05:49:06

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