Получение "Многошаговая операция генерирует ошибки. Проверьте каждое значение состояния." ошибка при использовании ADO с SQL Server 2008 - PullRequest
7 голосов
/ 07 ноября 2011

Мы находимся в процессе миграции нашего блока 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();
}

Ответы [ 7 ]

9 голосов
/ 01 мая 2014

Ссылка ниже представляет собой статью, в которой дано подробное описание 6 сценариев, в которых может появляться это сообщение об ошибке:

Сценарий 1 - Ошибка при попытке вставить данные в базу данных

Сценарий 2 - Ошибка возникает при попытке открыть соединение ADO

Сценарий 3 - Произошла ошибка при вставке данных в Access, где имя поля имеетпробел

Сценарий 4 - Ошибка при вставке данных в Access при использовании adLockBatchOptimistic

Сценарий 5 - Ошибка при вставке данных в Access при использованииДрайвер Jet.OLEDB.3.51 или ODBC (не Jet.OLEDB.4.0)

Сценарий 6 - Ошибка при использовании объекта Command и параметров

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

Надеюсь, что это может помочь другим, которые могут столкнуться с той же проблемой.

7 голосов
/ 07 мая 2012

Поскольку я опубликовал эту проблему, мы выяснили, что проблема заключалась в том, что когда вы выполняете объединение, атрибуты на полях не связаны (т. Е. Атрибуты: basecatalog, basetable & basecolumn пусты), чтобы исправить нашу проблему, которую мы должны были заставить значения этих атрибутов, сохранив набор записей в xml (adPersistXML), измените xml и снова откройте набор записей из xml. Это отскок полей, и мы смогли продолжить. Мы знаем, что это может быть не самое эффективное решение, но оно было для более старого приложения, и мы не хотели переписывать операторы sql. Похоже, основная ошибка Multiple-step operation generated errors. Check each status value. связана с тем, когда возникает ошибка, когда значение присваивается полю.

7 голосов
/ 04 апреля 2012

Это несоответствие типов, попробуйте

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

или убедитесь, что вы присваиваете значение Variant.

3 голосов
/ 01 декабря 2011

Две вещи, о которых я могу подумать ... Убедитесь, что ваш столбец «ID» будет принимать ноль (0).Кроме того, я однажды остановил эту проблему, не используя курсор adUseClient (попробуйте сервер).

Во многих случаях это несоответствие типов, попытка вставить NULL в ненулевой столбец или попытказаписать в столбец больше символов, чем нужно.

Надеюсь, это поможет.- Фреддо

1 голос
/ 30 июля 2018

Я нашел другой сценарий:

Когда я пытался установить значение поля adLongVarChar в новой записи для adodb.recordset только для памяти. В моем случае ошибка была вызвана тем, что передаваемая мной строка имела скрытый юникодный символ .

0 голосов
/ 08 февраля 2018

Я получал эту ошибку при попытке вставить / обновить поле со значением, не соответствующим таблице> тип поля.

Например, поле таблицы базы данных> поле было

char (1)

однако я пытался вставить / обновить

"яблоко"

в записи.

Как только я изменил введенное значение на "a" , и оно заработало.

0 голосов
/ 26 октября 2016

У меня возникла такая же проблема, проблема была в том, что я нарушил свойство объекта, в моем случае это был размер, ошибка вышла как

"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 символов, поэтому это свойство было нарушено, следовательно, произошла ошибка.

...