1

私はWindowsサーバー2008 R2 64ビットとIIS 7.5を使用しており、従来のasp(32ビット)Webサイトをホストしており、COMサーバー(Windowsサーバー2008 R2 64ビットもある)でCOMコンポーネントを呼び出しています。しかし、「許可が拒否されました」というエラーが表示され、エラー コードは 800A0046 です。

Set oDictAOGroup = CreateObject("Scripting.Dictionary")
oDictAOGroup.Add "1000", "5"
oUser.fn_Update_AO_Groups(oDictAOGroup)

asp Web サイト サーバーは、DCOM を使用して COM サーバーと通信します。ASP Web サイトでは、サーバー プロキシは COM サーバー クラスで作成されます。

テスト関数を作成し、その関数に値を渡すと、コードは完全に正常に動作します。

oUser.fn_Update_AO_Groups_Test1("1000", "21")

しかし、Scipting.Dictionary オブジェクトを渡そうとすると、許可拒否エラーが発生します。私はこれについて多くのグーグル検索を行いましたが、無駄に関連するものは何もありません。

関数のコードは

Public Function fn_Update_AO_Groups(vntAODict As Variant)

On Error GoTo ErrorHandler

Dim oADOConnect As AMLCONNECT_V2.clsConnect
Dim oADOConn        As ADODB.Connection
Dim oADOCmd         As ADODB.Command
Dim vntKey          As Variant

    If Not objContext Is Nothing Then
        Set oADOConnect = objContext.CreateInstance("AMLCONNECT_V2.clsConnect")
        Set oADOCmd = objContext.CreateInstance("ADODB.Command")
    Else
        Set oADOConnect = New clsConnect
        Set oADOCmd = New ADODB.Command
    End If

    If IsObject(vntAODict) Then
        If oADOConnect.OpenADOConnection(oADOConn) Then
            With oADOCmd
                .CommandText = "Sp_Upd_AOGroups"
                .CommandType = adCmdStoredProc
                .Parameters.Append .CreateParameter("AO_ID", adInteger, adParamInput)
                .Parameters.Append .CreateParameter("Email_Group_ID", adInteger, adParamInput)
                Set .ActiveConnection = oADOConn
            End With
            'Execute stored procedure for each item in the dictionary
            For Each vntKey In vntAODict.Keys
                oADOCmd.Parameters("AO_ID").Value = vntKey
                oADOCmd.Parameters("Email_Group_ID").Value = vntAODict(vntKey)
                oADOCmd.Execute
            Next
        End If
    End If

TidyUp:

    Set oADOConn = Nothing
    Set oADOCmd = Nothing
    Set oADOConnect = Nothing

Exit Function

ErrorHandler:
    Dim ErrHandler As AMLCONNECT_V2.clsConnect

    If Not objContext Is Nothing Then
        Set ErrHandler = objContext.CreateInstance("AMLCONNECT_V2.clsConnect")
    Else
        Set ErrHandler = New AMLCONNECT_V2.clsConnect
    End If

    m_sErrorMessage = "Error Number: " + CStr(Err.Number) + "<BR>" + "Description: " + ErrHandler.LogError(Err.Number, Err.Description, "MODULE: AMLADMIN_V2.clsUsers", "FUNCTION:fn_Update_AO_Groups", errError, errVB, errDatabase, "")

    If Not ErrHandler Is Nothing Then Set ErrHandler = Nothing

    GoTo TidyUp:

End Function

誰でもこれに対する救済策を提案できますか?

文字列を受け取る関数のコード

Public Function fn_Update_AO_Groups_Test1(strKey As String, strValue As String)

On Error GoTo ErrorHandler

Dim oADOConnect As AMLCONNECT_V2.clsConnect
Dim oADOConn        As ADODB.Connection
Dim oADOCmd         As ADODB.Command
Dim vntKey          As Variant

Dim ErrHandlerTest As AMLCONNECT_V2.clsConnect

    If Not objContext Is Nothing Then
        Set oADOConnect = objContext.CreateInstance("AMLCONNECT_V2.clsConnect")
        Set oADOCmd = objContext.CreateInstance("ADODB.Command")

    Else
        Set oADOConnect = New clsConnect
        Set oADOCmd = New ADODB.Command

    End If

            If oADOConnect.OpenADOConnection(oADOConn) Then
                With oADOCmd
                    .CommandText = "Sp_Upd_AOGroups"
                    .CommandType = adCmdStoredProc
                    .Parameters.Append .CreateParameter("AO_ID", adInteger, adParamInput)
                    .Parameters.Append .CreateParameter("Email_Group_ID", adInteger, adParamInput)
                    Set .ActiveConnection = oADOConn
                End With
                'Execute stored procedure for each item in the dictionary
                    oADOCmd.Parameters("AO_ID").Value = strKey
                    oADOCmd.Parameters("Email_Group_ID").Value = strValue
                    oADOCmd.Execute
            End If
TidyUp:

    Set oADOConn = Nothing
    Set oADOCmd = Nothing
    Set oADOConnect = Nothing

Exit Function

ErrorHandler:
    Dim ErrHandler As AMLCONNECT_V2.clsConnect

    If Not objContext Is Nothing Then
        Set ErrHandler = objContext.CreateInstance("AMLCONNECT_V2.clsConnect")
    Else
        Set ErrHandler = New AMLCONNECT_V2.clsConnect
    End If

    m_sErrorMessage = "Error Number: " + CStr(Err.Number) + "<BR>" + "Description: " + ErrHandler.LogError(Err.Number, Err.Description, "MODULE: AMLADMIN_V2.clsUsers", "FUNCTION:fn_Update_AO_Groups", errError, errVB, errDatabase, "")

    If Not ErrHandler Is Nothing Then Set ErrHandler = Nothing

    GoTo TidyUp:

End Function

ありがとう、バイバフ

4

3 に答える 3

0

コメントするには長すぎるので、これは完全な答えではありませんが、正しい方向に進む可能性があります。

まず、フィールドタイプが整数であり、辞書のキーと値が文字列であることに気付きました。したがって、最初に関数のコードを次のように変更して、それらを変換してみてください。

oADOCmd.Parameters("AO_ID").Value = CLng(vntKey)
oADOCmd.Parameters("Email_Group_ID").Value = CLng(vntAODict(vntKey))

それでも同じエラーが発生する場合は、辞書ではなく2つのパラメーターを関数に明示的に渡したときに、まったく同じコードが正常に機能するかどうかを知る必要がありますか?

もう1つ頭に浮かぶのは、エラー処理に問題がある可能性があることです。デバッグのためにエラーを削除して、より意味のあるエラーメッセージが表示されるかどうかを確認してください。

于 2012-06-05T07:03:00.597 に答える
0

かっこを使用するか、Call oUser.fn_Update_AO_Groups(oDictAOGroup)または使用しません。oUser.fn_Update_AO_Groups oDictAOGroup

于 2012-06-05T07:40:01.623 に答える
0

代わりに次の署名を試してください。

Public Function fn_Update_AO_Groups(ByVal vntAODict As Variant) 

また

Public Function fn_Update_AO_Groups(ByVal vntAODict As Scripting.Dictionary)

デフォルトをそのまま使用すると、はるかに多くのマーシャリング コードが必要になりますByRef。また、予期される明示的な型を提供すると、マーシャリング コードのオプションも増えます。これらの変更は、期待どおりの操作を可能にするのに十分な場合があります。

それが失敗した場合は、アプローチを再考します。私は、XML 文字列を SP に渡すことを好みます。これにより、SQL および ASP のコードを変更して、新しいバイナリを再コンパイルおよび展開することなく、新しい要件に影響を与えることができる最大の柔軟性が得られます。

于 2012-06-05T11:09:00.417 に答える