2016-10-29 4 views
0

ein Problem mit der Migration von einer Website von einem Server auf einen anderen verwendet haben, hier ist der Fehler Ich erhalte:Ausgabe mit Migrations klassischen ASP

Microsoft Cursor Engine error '80040e21' 

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

/common/classes/Cart.asp, line 110 

Linie 110:

fld.Value = Request(fld.Name) 

hier ist der Code, der das Problem verursacht:

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 

Es verwendet SQL2008 zu verwenden, aber der neue Server uns SQL2016 laufen.

Danke für alle Ideen, die Sie geben können.

Antwort

2

Nach dem Code zu urteilen, der diesen Fehler verursacht, handelt es sich höchstwahrscheinlich um ein Problem beim Typcasting hinter den Kulissen. Irgendwie kann der Datenbanktreiber die Daten nicht korrekt in den richtigen Typ konvertieren, also müssen Sie das selbst tun.

Ein Weg, der ziemlich flexibel ist, ist das Definieren von Schlüssel/Wert-Paaren (VBScript Dictionary kann in diesem Fall passen), wobei der Schlüssel der Feldname ist und der Wert der Typ ist, in den der Wert konvertiert werden soll. (String, Integer, Double, Date)

Beispielcode wäre: (ungetestet, aber sollte funktionieren wie sie ist, vorausgesetzt, Sie korrekte Angaben stellen)

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

Dank! Gibt es eine Möglichkeit, auch nach Geld zu suchen? –

+1

@AaronRussell benutzte es nie selbst so nicht sicher, aber sieht aus wie CCur sollte den Trick tun. Beachten Sie, dass es einen numerischen Wert erhalten muss, z. "$ 5" gibt einen Fehler. Wenn immer noch kein Glück, lass es mich wissen, und ich werde es mir genauer ansehen. Wie auch immer, siehe die Bearbeitung. –