我有一个非常大的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
语句,后跟BEGIN
和END
块,其中包含存储过程,变量声明和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“异常不满意。
答案 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)
如果您有一个带参数的查询,请检查查询中的参数数量是否与脚本匹配......!