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

时间:2013-03-25 16:36:13

标签: delphi ado

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

  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的OLEException,而不是来自Delphi代码,并且在所有SQL exec-stored-procedure发生之后发生,因此我怀疑它在到达时触发了这个OLE异常最后阶段SELECT @Variable1 AsName1,...为我的程序取回一些变量值来查看它们。

我知道这篇已退役/弃用的MS知识库文章,遗憾的是这不是我的实际问题:

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

简而言之,KB文章说要修复注册表项并从连接字符串中删除“Persist Security Info”。那不是我的问题。我问这个问题是因为我已经找到了答案,而且我认为,如果在搜索几个小时的解决方案之后找到了几个我找到的潜在问题,那么被困在这里的其他人可能不想浪费几个小时。任何想要使用不同选项添加另一个答案的人都很好,如果可以重现,我会选择你的,如果有必要,我会把这个变成社区Wiki,因为这个“ADO记录集可能有十几个模糊的原因情绪不好,对你的T-SQL“异常不满意。

3 个答案:

答案 0 :(得分:2)

我发现了各种文档来源中列出的几个潜在原因。问题中的原始知识库文章建议从我的ADO连接字符串中删除“持久安全信息”,但是在仅包含TADOConnection和单个TADOQuery的应用程序中的独立测试中,是否存在Persist Security Info没有效果,也没有明确地将其设置为真或假。

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

CursorType=ctKeyset

我学到的是双向ADO数据集适用于ADO中的SELECT * FROM TABLE,但对于复杂的SQL脚本则不太好。

答案 1 :(得分:1)

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

示例:Form具有编辑框,其中max length属性设置为20个字符,Oracle数据库表的字段定义为char(10)。 更新10个字符(或更少)将正常工作,而更新超过10个字符将导致ADOQuerry.UpdateBatch()上出现“多步...”错误。 你还必须知道CHAR总共会有20个字符。考虑在编辑框中修剪值。 CHAR的行为与VARCHAR2类型不同。

答案 2 :(得分:0)

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

相关问题