获取“多步操作产生错误。检查每个状态值。”在 SQL Server 2008 中使用 ADO 时出错

Posted

技术标签:

【中文标题】获取“多步操作产生错误。检查每个状态值。”在 SQL Server 2008 中使用 ADO 时出错【英文标题】:Getting "Multiple-step operation generated errors. Check each status value." error using ADO with SQL server 2008 【发布时间】:2011-12-23 20:18:34 【问题描述】:

我们正在将我们的 SQL 2000 机器迁移到 SQL 2008。但是我们遇到了一个问题;当使用具有 UNION 的查询返回结果集(行与否)时。稍后在代码中,我们尝试添加一个新行并为其分配字段,但由于使用了 UNION,当我们尝试为该字段分配一个值时,它会给我们一个 Multiple-step operation generated errors. Check each status value. 错误。我们在 Windows XP 和 Windows 7 上尝试了以下代码并得到了相同的结果。但是,当我们将连接字符串更改为指向 SQL 2000 框时,我们不会再收到该错误。

以下示例显示了我们遇到的问题。

var c = new ADODB.Connection();
var cmd = new ADODB.Command();
var rs = new ADODB.Recordset();
object recordsAffected;

c.Open("Provider=SQLOLEDB;Server=*****;Database=*****;User Id=*****;Password=*****;");

cmd.ActiveConnection = c;
cmd.CommandType = ADODB.CommandTypeEnum.adCmdText;
cmd.CommandText = "create table testing2008 (id int)";
cmd.Execute(out recordsAffected);

try 
    cmd.CommandText = "select * from testing2008 union select * from testing2008";

    rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient;
    rs.Open(cmd, Type.Missing, ADODB.CursorTypeEnum.adOpenDynamic, ADODB.LockTypeEnum.adLockBatchOptimistic, -1);

    rs.AddNew();
    rs.Fields["id"].Value = 0; //throws exception
    rs.Save();

catch (Exception ex) 
    MessageBox.Show(ex.ToString());

finally 
    cmd.CommandText = "drop table testing2008";
    cmd.Execute(out recordsAffected);
    c.Close();

【问题讨论】:

【参考方案1】:

下面的链接是一篇文章,详细介绍了可能出现此错误消息的 6 种情况:

场景 1 -尝试将数据插入数据库时​​发生错误

场景 2 -尝试打开 ADO 连接时出错

场景 3 - 将数据插入 Access 时出错,其中字段名有空格

场景 4 - 使用 adLockBatchOptimistic 时将数据插入 Access 时出错

场景 5 - 使用 Jet.OLEDB.3.51 或 ODBC 驱动程序(不是 Jet.OLEDB.4.0)时,将数据插入 Access 时出错

场景 6 - 使用 Command 对象和参数时发生错误

http://www.adopenstatic.com/faq/80040e21.asp

希望它可以帮助可能面临同样问题的其他人。

【讨论】:

解决我的问题!非常感谢@EdsonF !!【参考方案2】:

是类型不匹配,试试

rs.Fields["id"].Value = "0";

或确保为该值分配 Variant。

【讨论】:

【参考方案3】:

自从我发布了这个问题,我们发现问题是当你做一个联合时,字段上的属性没有绑定(即属性:basecatalog、basetable 和 basecolumn 是空的)来解决我们不得不强制的问题这些属性的值,通过将记录集保存到 xml (adPersistXML),更改 xml 并从 xml 重新打开记录集。这使领域反弹,我们能够继续。我们知道这可能不是最有效的解决方案,但它适用于较旧的应用程序,我们不想重写 sql 语句。看起来主要错误Multiple-step operation generated errors. Check each status value. 与将值分配给字段时发生错误有关。

【讨论】:

【参考方案4】:

我能想到两件事...确保您的“ID”列接受零 (0)。另外 - 我曾经通过不使用 adUseClient 光标(尝试服务器)停止了这个问题。

很多时候这是类型不匹配,尝试将 NULL 填充到非空列中,或者尝试将更多字符写入列中而不是设计的。

希望这会有所帮助。 - 弗雷多

【讨论】:

Freddo,我知道这是一个旧线程,但我想感谢您的回复。我收到了这个错误,不知道为什么。原来是因为试图写出比我最初设置字段更多的字符。再次感谢。【参考方案5】:

我发现了另一个场景:

当我尝试在仅内存的 adodb.recordset 的新记录中设置 adLongVarChar 字段的值时。在我的例子中,错误被触发是因为我传递的字符串有一个隐藏的 unicode 字符

【讨论】:

我的情况也是如此。字符串值之一中的西里尔字母。【参考方案6】:

同样的问题发生在我身上,问题是我违反了一个对象属性,在我的情况下,它是大小错误出来的

“IntegrationException:问题(多步操作产生错误。检查每个状态值。)”

  Imports ADODB
  Dim _RecordSet As Recordset  
  _rs.Fields.Append("Field_Name", DataTypeEnum.adVarChar, 50)

  _Recordset("Field_Name").Value = _RecordDetails.Field_NameValue

_RecordDetails.Field_NameValue 长度超过 50 个字符,因此违反了该属性,因此发生错误。

【讨论】:

【参考方案7】:

当我们的旧应用程序尝试解析 1/1/0001 12AM 日期和时间时,我发现了这个错误。看起来 VB6 记录集不喜欢那个值。 为了摆脱错误,我不得不将所有违规日期设置为空。

【讨论】:

【参考方案8】:

我在尝试使用与表格不匹配的值插入/更新字段时遇到此错误>字段类型。

比如数据库表>字段是

char(1)

但是,我试图插入/更新

“苹果”

进入记录。

一旦我将输入的值更改为 "a" 并且它起作用了。

【讨论】:

以上是关于获取“多步操作产生错误。检查每个状态值。”在 SQL Server 2008 中使用 ADO 时出错的主要内容,如果未能解决你的问题,请参考以下文章

牛客题霸-SQL篇——10~20题

Python爬虫:逆向分析酷我音乐请求参数(支持SQ超品音质)

Python爬虫:逆向分析酷我音乐请求参数(支持SQ超品音质)

matlab里sq啥意思

void create_sq(sqlist &sq,int n)在数据结构中的含义

在 Azure Devops 上运行 SQ 不会扫描所有文件/子文件夹/项目,尤其是 c# 文件