Я использую функцию, которую я прочитал о здесь , чтобы объединить серию наборов записей, которые генерируются хранимой процедурой, которая вызывается в цикле.Я использовал эту функцию ранее в других случаях хранимых процедур, и она никогда не создавала этой проблемы.Исследование, которое я провел в Интернете, указывает в основном на одну из двух причин: 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