Получение «Многоэтапная ошибка, генерируемая операцией» в ASP Classic с использованием функции набора объединенных данных - PullRequest
2 голосов
/ 11 августа 2011

Я использую функцию, которую я прочитал о здесь , чтобы объединить серию наборов записей, которые генерируются хранимой процедурой, которая вызывается в цикле.Я использовал эту функцию ранее в других случаях хранимых процедур, и она никогда не создавала этой проблемы.Исследование, которое я провел в Интернете, указывает в основном на одну из двух причин: 1) я пытаюсь обновить или вставить значение даты / времени, которое неправильно отформатировано, в таблицу SQL Server 2005 2) я пытаюсь вставить, например,CHAR(60) строка в поле CHAR(50).

Причина первая здесь не применима, поскольку я не использую даты (по крайней мере, в формате datetime).Вторая причина, казалось, была наиболее вероятной проблемой.Поэтому я сделал серию Response.Write(), чтобы выплюнуть objField.Name, objField.Type, objField.ActualSize, а если это было числовое поле, то objField.Precision и objField.NumericScale.

Допустим,что хранимая процедура SQL вызывается дважды, когда я запрашиваю значения, которые происходят в одном и том же временном интервале, но в двух разных состояниях.Цикл, который я имею на странице ASP, выполняет для каждого состояние в списке состояний и вызывает хранимую процедуру для каждого из элементов в списке состояний.Затем я вызываю функцию MergeRecordSets, чтобы она объединяла 2 результата в один.Общее правило заключается в том, что типы данных и размеры столбцов в каждом наборе результатов должны быть одинаковыми.С помощью моих Response.Write() проверок каждого из столбцов, возвращенных в 2 наборах данных, я обнаружил, что они идентичны .Делая мои проверки, я также обнаружил, что он разбивается на первый столбец, который является NUMERIC столбцом.Все предыдущие столбцы, с которыми все было в порядке, были CHAR или VARCHAR.

Есть ли какая-либо другая причина, по которой может появиться эта ошибка?

Ниже описано, как я вызываю записьфункция слияния.oQueryResult будет конечным результатом (объединенные записи).objSingleRS - это набор результатов, возвращаемый хранимой процедурой.

If oQueryResult Is Nothing Then
    Set oQueryResult = objSingleRS
Else
    Set oQueryResult = MergeRecordSets(Array(oQueryResult, objSingleRS))
End If

Вот функция слияния.Строка, в которой разрывы кода отмечены ниже.

Function MergeRecordSets(arrRecordsets)
    Dim x, y, objCurrentRS
    Dim objMergedRecordSet, objField, blnExists
    Set objMergedRecordSet = Server.CreateObject("ADODB.Recordset")

    For x=0 To UBound(arrRecordsets)
        Set objCurrentRS = arrRecordsets(x)

        For Each objField In objCurrentRS.Fields
            blnExists = False
            For y=0 To objMergedRecordSet.Fields.Count-1
                If LCase(objMergedRecordSet.Fields(y).Name) = Lcase(objField.Name) Then
                    blnExists = True : Exit For
                End If
            Next
            If Not(blnExists) Then
                objMergedRecordSet.Fields.Append objField.Name, objField.Type, objField.DefinedSize
                'objMergedRecordSet.Fields(objMergedRecordset.Fields.Count-1).Attributes = 32 'adFldIsNullable
            End If
        Next
    Next

    objMergedRecordSet.Open

    For x=0 To UBound(arrRecordsets)
        Set objCurrentRS = arrRecordsets(x)

        Do Until objCurrentRS.EOF
            objMergedRecordSet.AddNew
            For Each objField In objCurrentRS.Fields
                If Not(IsNull(objField.Value)) Then
                    'Response.Write(objField.Name & "<br>")
                    'Response.Write(objField.Type & "<br>")
                    objMergedRecordSet.Fields(objField.Name).Value = objField.Value 'Here is where it throws the Error.
                End If
            Next
            objCurrentRS.MoveNext
        Loop
    Next

    objMergedRecordSet.MoveFirst
    Set MergeRecordSets = objMergedRecordSet
End Function

Вот полное возвращенное сообщение об ошибке:

Microsoft Cursor Engine error '80040e21'

Multiple-step operation generated errors. Check each status value.

/includes/funcs/Common.asp, line 4109 

Ответы [ 2 ]

0 голосов
/ 03 декабря 2011

Вы упомянули, что у вас есть numeric столбцы, но вы никогда не устанавливали свойства Precision и NumericScale при создании нового поля в objMergedRecordSet.Вам необходимо установить эти свойства для полей adNumeric и adDecimal.

objMergedRecordSet.Fields.Append objField.Name, objField.Type, objField.DefinedSize
With objMergedRecordSet.Fields(objField.Name)
    .Precision = objField.Precision
    .NumericScale = objField.NumericScale
End With
0 голосов
/ 02 декабря 2011

Также убедитесь, что вы не пытаетесь поместить NULL в столбец, который не примет значение NULL. Существует также возможность несовпадения типов, чтобы вызвать эту ошибку, поэтому убедитесь, что вы передаете числовое значение. - Фреддо

...