使用传统ASP迁移的问题

时间:2016-10-29 15:40:26

标签: asp-classic sql-server-2016

将网站从一台服务器迁移到另一台服务器时出现问题,这是我遇到的错误:

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。

感谢您提出的任何想法。

1 个答案:

答案 0 :(得分:2)

从导致此错误的代码判断,这很可能是幕后类型转换的问题。不知何故,数据库驱动程序无法正确地将数据转换为正确的类型,因此您必须自己完成。

一种非常灵活的方法是定义键/值对(VBScript Dictionary可以适用于这种情况),其中键将是字段名称,值将是转换值的类型。 (字符串,整数,双精度,日期)

示例代码为:(未经测试,但如果您输入正确的详细信息,则应按原样运行)

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)