使用 ADO 与 SQL 服务器 2008 一起获取"Multiple-step operation generated errors. Check each status value."错误



我们正在将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();
}

下面的链接是一篇文章,给出了这个错误消息可能出现的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

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

类型不匹配,请尝试

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

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

我能想到两件事…确保你的"ID"列将接受零(0)。另外-我已经停止了这个问题,有一次不使用adUseClient游标(尝试服务器)。

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

希望这对你有帮助。——Freddo

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

"IntegrationException: Problem(多步操作产生错误。检查每个状态值。

  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个字符,因此违反了此属性,因此发生错误。

我发现了另一个场景:

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

当我们的遗留应用程序试图解析1/1/0001 12AM日期和时间时,我发现了这个错误。看起来VB6记录集不喜欢这个值。为了消除这些错误,我不得不将所有令人讨厌的日期设置为空。

当尝试插入/更新与表>字段类型不匹配的值的字段时,我得到了这个错误。

例如,数据库表>字段为

char (1)

然而,我试图插入/update

"苹果"

进入记录。

一旦我将输入值更改为"a",它就工作了。

如果您试图将文本插入到具有ShortText列类型的Access表列中,如果列长度短于文本长度,则会发生这种情况。

最新更新