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

时间:2011-11-07 18:03:43

标签: sql-server sql-server-2008 ado

我们正在将SQL 2000框迁移到SQL 2008.但我们遇到了一个问题。当使用具有UNION的查询返回结果集(行或不)时。稍后在代码中我们尝试添加一个新行并为其分配字段,但由于使用了UNION,当我们尝试为字段分配值时,它会给我们一个Multiple-step operation generated errors. Check each status value.错误。我们在Windows XP和Windows上尝试了以下代码。 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();
}

8 个答案:

答案 0 :(得分:9)

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

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

方案2 - 尝试打开ADO连接时出错

场景3 - 在Access中插入数据时出错,其中fieldname有空格

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

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

场景6 - 使用Command对象和参数

时发生错误

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

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

答案 1 :(得分:7)

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

答案 2 :(得分:6)

类型不匹配,请尝试

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

或确保为该值指定Variant。

答案 3 :(得分:3)

我能想到的两件事......确保你的“ID”列接受零(0)。另外 - 我有一次因没有使用adUseClient游标(尝试服务器)而停止了这个问题。

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

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

答案 4 :(得分:1)

我发现了另一种情况:

当我尝试在仅用于内存的adodb.recordset的新记录中设置adLongVarChar字段的值时。在我的情况下,由于我传递的字符串具有埋藏的Unicode字符而触发了错误。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

尝试使用与表>字段类型不匹配的值插入/更新字段时出现此错误。

例如,数据库表>领域是

char(1)

但是,我试图插入/更新

<强>&#34;苹果&#34;

进入记录。

一旦我将输入的值更改为&#34; a&#34; ,就可以了。

答案 7 :(得分:0)

当我们的旧版应用程序试图解析1/1/0001 12AM日期和时间时,我发现了此错误。看起来VB6记录集不喜欢该值。 为了消除错误,我必须将所有违规日期设置为null。