2012-06-05 96 views
1

我正在使用Windows Server 2008 R2 64位和IIS 7.5並託管一個經典的asp(32位)網站並在COM服務器上調用COM組件(它也有Windows服務器2008 R2 64位)。但是,獲取錯誤「權限被拒絕」並且錯誤代碼是800A0046。嘗試使用腳本時權限被拒絕錯誤。字典

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

asp網站服務器使用DCOM與COM服務器通信。在asp網站上,服務器代理是由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 

感謝, Vaibhav的

+0

你知道函數fn_Update_AO_Groups的簽名/聲明嗎?看起來像類型轉換問題。 –

+0

函數的簽名是'Public Function fn_Update_AO_Groups(vntAODict As Variant)' – vaibhav

+0

Variant應該沒問題。你能發佈函數的代碼嗎?也許只是使用'vntAODict'變量的相關行? (通過編輯添加到您的問題) –

回答

0

太長評論,所以雖然這是不完整的答案可能讓你在正確的方向。

首先,我注意到字段類型是整數,而您的字典鍵和值是字符串。所以首先嚐試通過改變代碼的功能轉換的:

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

如果還是同樣的錯誤,我需要知道,如果完全相同的代碼工作正常,當你明確地傳遞兩個參數的函數,而不是字典的?

另一件想到的事情可能是你的錯誤處理出了問題,爲了調試而去除它,看看你是否得到更有意義的錯誤信息。

+0

我嘗試了CLng選項,但得到了同樣的錯誤。我也添加了功能代碼。已經刪除了所有錯誤處理代碼並調用代碼,然後我也得到了相同的錯誤Permission denied。 – vaibhav

+0

奇怪。嘗試查看'vntAODict'類型並將其記錄在某處,使用'TypeName(vntAODict)'來查看類型。你看到了什麼? –

+0

TypeName(vntAODict)返回字典 – vaibhav

0

可以使用Call oUser.fn_Update_AO_Groups(oDictAOGroup)oUser.fn_Update_AO_Groups oDictAOGroup不帶圓括號。

+0

嘗試使用上述兩種替代方法,但在嘗試上述解決方案時仍遇到同樣的錯誤 – vaibhav

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,以實現新的需求,而無需重新編譯和部署新的二進制文件。

+0

,需要添加Microsoft Scripting Runtime的scripting.dictionary參考。此引用使用位於system32文件夾中的scrrun.dll,我認爲嘗試訪問scrrun.dll時代碼可能會失敗。因此需要在scrrun.dll上添加相應的權限 – vaibhav

相關問題