2016-10-29 7 views
0

Имея проблемы с миграцией на сайт с одного сервера на другой, здесь ошибка я получаю:Проблема с миграцией с использованием классических ASP

Microsoft Cursor Engine error '80040e21' 

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

/common/classes/Cart.asp, line 110 

Линия 110 является:

fld.Value = Request(fld.Name) 

Вот код, который вызывает вопрос:

public function InsertOrder 
    set rs = Server.CreateObject("ADODB.Recordset") 
    rs.ActiveConnection = OrdersConnectionString 
    rs.Source = "SELECT * FROM "& OrdersTable 
    rs.CursorType = 3 
    rs.CursorLocation = 3 
    rs.LockType = 3 
    rs.Open() 
    rs.AddNew 
    For Each fld in rs.Fields 
    if Len(Request(fld.Name)) > 0 then 
    fld.Value = Request(fld.Name) 
    end if 
    Next 
    rs.Update 
    rs.Requery 
    rs.Sort=OrderKey &" desc " 
    OrderID=rs(OrderKey) 
end function 

Он имел обыкновение использовать SQL2008, но новый сервер нам работает SQL2016.

Спасибо за любые идеи, которые вы можете дать.

ответ

2

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

Один из способов, который довольно гибкий, определяет пары ключ/значение (словарь VBScript может поместиться в этом случае), где ключ будет именем поля, а значение будет типом, для которого нужно преобразовать значение. (String, Integer, Double, Date)

Пример кода будет: (проверялось, но должно работать как есть, если вы поставите правильные детали)

Const FIELD_TYPE_STRING = 1 
Const FIELD_TYPE_INTEGER = 2 
Const FIELD_TYPE_DOUBLE = 3 
Const FIELD_TYPE_DATE = 4 
Const FIELD_TYPE_CURRENCY = 5 
Function ConverFieldValue(rawValue, fieldType) 
    ConverFieldValue = VBNull 
    Select Case fieldType 
     Case FIELD_TYPE_STRING: 
      ConverFieldValue = CStr(rawValue) 
     Case FIELD_TYPE_INTEGER: 
      If rawValue<>"" Then ConverFieldValue = CLng(rawValue) 
     Case FIELD_TYPE_DOUBLE 
      If rawValue<>"" Then ConverFieldValue = CDbl(rawValue): 
     Case FIELD_TYPE_DATE: 
      If rawValue<>"" Then ConverFieldValue = CDate(rawValue) 
     Case FIELD_TYPE_CURRENCY: 
      If rawValue<>"" Then ConverFieldValue = CCur(rawValue) 
    End Select 
End Function 
Dim typeMapping 
Set typeMapping = Server.CreateObject("Scripting.Dictionary") 

'''***Add actual field names and types below:**** 
typeMapping.Add "Field1", FIELD_TYPE_STRING 
typeMapping.Add "Field2", FIELD_TYPE_INTEGER 
typeMapping.Add "Field3", FIELD_TYPE_DOUBLE 
typeMapping.Add "Field4", FIELD_TYPE_CURRENCY 
typeMapping.Add "Field5", FIELD_TYPE_DATE 
'''************************************************* 

Dim currentFieldType, currentFieldValue 
Set rs = Server.CreateObject("ADODB.Recordset") 
rs.ActiveConnection = OrdersConnectionString 
rs.Source = "SELECT * FROM "& OrdersTable 
rs.CursorType = 3 
rs.CursorLocation = 3 
rs.LockType = 3 
rs.Open() 
rs.AddNew 
For Each fld in rs.Fields 
    if Len(Request(fld.Name)) > 0 then 
     currentFieldType = typeMapping(fld.Name) 
     currentFieldValue = ConverFieldValue(Request(fld.Name), currentFieldType) 
     fld.Value = currentFieldValue 
    end if 
Next 
rs.Update 
rs.Requery 
rs.Sort=OrderKey &" desc " 
OrderID=rs(OrderKey) 
+0

Спасибо! Есть ли способ проверить Деньги тоже? –

+1

@AaronRussell никогда не использовал его сам, поэтому не уверен, но похоже, что CCur должен сделать трюк. Обратите внимание, что он должен получать числовое значение, например. «$ 5» даст ошибку. Если еще не удастся сообщить мне, и я лучше посмотрю на это. В любом случае, см. Редактирование. –