我们正在将我们的 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 对象和 Parameters 时出现错误
http://www.adopenstatic.com/faq/80040e21.asp
希望它可以帮助其他可能面临同样问题的人。
是类型不匹配,试试
rs.Fields["id"].Value = "0";
或确保为该值分配一个变体。
自从我发布了这个问题,我们发现问题是当你做联合时,字段上的属性没有绑定(即属性:basecatalog、basetable 和 basecolumn 是空的)来解决我们的问题,我们不得不强制值这些属性,通过将记录集保存到 xml (adPersistXML),更改 xml 并从 xml 重新打开记录集。这反弹了领域,我们能够继续。我们知道这可能不是最有效的解决方案,但它适用于较旧的应用程序,我们不想重写 sql 语句。貌似主要的错误
Multiple-step operation generated errors. Check each status value.
跟给字段赋值时出错有关
我能想到的两件事...确保您的“ID”列将接受零 (0)。另外 - 我曾经通过不使用 adUseClient 游标(尝试服务器)来解决这个问题。
很多时候这是类型不匹配,试图将 NULL 填充到非空列中,或者试图将比设计更多的字符写入列中。
希望这有帮助。 -弗莱多
同样的问题发生在我身上问题是我违反了一个对象属性,在我的情况下它是大小错误出现了
“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 个字符,因此违反了此属性,因此发生错误。
我发现另一种情况:
当我试图在新记录中为纯内存 adodb.recordset 设置 adLongVarChar 字段的值时。在我的例子中,错误被触发是因为我传递的字符串有一个 buried unicode character.
当我们的遗留应用程序试图解析 1/1/0001 12AM 日期和时间时,我发现了这个错误。看起来 VB6 记录集不喜欢那个值。 为了消除错误,我不得不将所有有问题的日期设置为空。
尝试使用与表>字段类型不匹配的值插入/更新字段时出现此错误。
例如,数据库表>字段是
char(1)
然而,我试图插入/更新
“苹果”
进入记录。
一旦我将输入值更改为 "a" 并且它起作用了。
如果您尝试将文本插入具有 ShortText 列类型的 Access 表列,如果列长度短于文本长度,就会发生这种情况。