3

関数があり(下記参照)、完全に機能します。最近、コードを別のサーバーに移動しましたが、何も変更していません。新しいサーバーでは実行できません。

Microsoft VBScript runtime error '800a0005'
Invalid procedure call or argument: 'Mid'
/calculate.asp, line 416 

416行目を確認すると、次のようになりました。

Dim result3: result3 = Mid(o3.responseText, Basla3, Bitir3)

これは完全な機能です:

<%
    Function xyz()
    Dim o3: Set o3 = Server.CreateObject("MSXML2.ServerXMLHTTP")
    Dim o_date3: o_date3 = split(EndingDate, ".")
    Dim s_date3
    If (Len(o_date3(2)) = 4) Then
        s_date3 = o_date3(2)
    Else
        s_date3 = "20" & o_date3(2)
    End If
    If (Len(o_date3(1)) = 2) Then
        s_date3 = s_date3 & o_date3(1)
    Else
        s_date3 = s_date3 & "0" & o_date3(1)
    End If
    If (Len(o_date3(0)) = 2) Then
        s_date3 = s_date3 & o_date3(0)
    Else
        s_date3 = s_date3 & "0" & o_date3(0)
    End If
    Dim s3: s3 = "<soapenv:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/""         xmlns:urn=""urn:AntTransferWSIntf-IAntTransferWS""><soapenv:Header/><soapenv:Body><urn:EURCurrency soapenv:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/""><DateStr xsi:type=""xsd:string"">" + s_date3 + "</DateStr></urn:EURCurrency></soapenv:Body></soapenv:Envelope>"
    o3.Open "POST", serviceUrl, False
    o3.setRequestHeader "Content-Type", "text/xml"
    o3.setRequestHeader "Connection", "close"
    o3.setRequestHeader "SOAPAction", " "
    o3.send s3
    Dim hataVarMiBasla3: hataVarMiBasla3 = (InStr(1, o3.responseText, "<faultstring>", vbTextCompare)) + 13
    If (hataVarMiBasla3 > 13) Then
        Dim hataVarMiBitir3: hataVarMiBitir3 = (InStr(1, o3.responseText, "</faultstring>", vbTextCompare)) - hataVarMiBasla3
        Dim hata3: hata3 = Mid(o3.responseText, hataVarMiBasla3, hataVarMiBitir3)
        KurGetir = hata3
    Else
        Dim Basla3: Basla3 = (InStr(1, o3.responseText, """xsd:double"">", vbTextCompare)) + 13
        Dim Bitir3: Bitir3 = (InStr(1, o3.responseText, "</return>", vbTextCompare)) - Basla3
        Dim result3: result3 = Mid(o3.responseText, Basla3, Bitir3)
        xyz = CDbl(Replace(result3, ".", mstrComma))
    End If
    Set o3 = Nothing
End Function
%>

このエラーが表示されるのはなぜですか?

4

2 に答える 2

5

MSDN の中間構造体

Mid(文字列、開始[、長さ])

公式のリファレンスではありませんが、私の経験によると、次の場合にエラーが発生します

  1. startが 0 以下です。
  2. lengthが 0 未満 (Mid 呼び出しで欠落していない場合)

エラー行と関連する行を見てください。

Dim Basla3: Basla3 = (InStr(1, o3.responseText, """xsd:double"">", vbTextCompare)) + 13
Dim Bitir3: Bitir3 = (InStr(1, o3.responseText, "</return>", vbTextCompare)) - Basla3
Dim result3: result3 = Mid(o3.responseText, Basla3, Bitir3)

o3.responseTextコードは応答が空かどうかをチェックしないため、が空であるとします。

Basla3によると 13 未満にはならないInStr() + 13ので、問題ありません。ただし、 (Basla3の評価は13)によると、ゼロ未満になる可能性がある
ようです。と評価され た仮定を続けて、それで と評価されます。多田!ルール 2に違反しています。長さは 0 未満にすることはできません。 あなたのコードの問題は、チェック応答の長さや応答ステータスがないことです。応答が空の場合は、次の点を考慮してください。Bitir3InStr() - Basla3
(InStr(1, o3.responseText, "</return>", vbTextCompare))0- Basla3-13

  1. 新しいサーバーには、古いサーバーとは異なり、接続の問題が発生する場合があります。
  2. あなたが持っている API は、古いサーバーの IP アドレスに対してのみ承認されています。


簡単に言えば、コードを最適化し、xml 応答があることを確認する必要があります。
少なくともそのようなものを使用してください:

o3.Send
If o3.readyState = 4 And o3.status = 200 Then
    If Len(o3.responseText) > 0 Then
        'response is ready to parse
    Else
        'response status is ok but empty
    End If
Else
    'request failed
End If

ところで、あなたの要求はソープ コールであるため、DomDocument などを使用して xml 応答を解析することを強くお勧めし
ますMid & InStr

于 2013-09-13T22:48:22.383 に答える
4

推測するなら。

「MID」関数が特殊文字を処理する必要がある場合、または非文字列値と見なされるものを処理する必要がある場合、VBScript は奇妙なエラーを返します。

そのため、o3.responseText には、好ましくないテキストが含まれている可能性があります。

于 2013-09-13T07:28:57.407 に答える