簡體   English   中英

Adodb Recordset函數.MoveNext導致異常“ UPDATE權限被拒絕”

[英]Adodb Recordset function .MoveNext Causes Exception “UPDATE permission was denied”

我今天遇到一個困擾我的問題。

這是一些示例代碼:

                Dim objRec As ADODB.Recordset 
                Dim oRec As ADODB.Recordset 
                Dim oRecBuild As New ADODB.Recordset 
                cmd = New ADODB.Command()
                cmd.ActiveConnection = objConn
                cmd.CommandText = "SelectAll_PhoneNumbers_ById"
                cmd.CommandType = ADODB.CommandTypeEnum.adCmdStoredProc
                cmd.NamedParameters = True

                cmd.Parameters.Append(cmd.CreateParameter("@ObjId", ADODB.DataTypeEnum.adVarChar, ADODB.ParameterDirectionEnum.adParamInput, 20, objRec.Fields("PK_ProgramID").Value))

                oRec = New ADODB.Recordset()
                oRec.Open(cmd, , ADODB.CursorTypeEnum.adOpenStatic, ADODB.LockTypeEnum.adLockOptimistic)

                If oRec.EOF = False Then
                    Do Until oRec.EOF
                        If IsDBNull(oRec.Fields("PhoneType").Value) = False Then
                            sName = PhoneNumberEdit(oRec.Fields("Phone").Value)
                            If IsDBNull(oRec.Fields("Extension").Value) = False And Len(oRec.Fields("Extension").Value) > 0 Then
                                sName = PhoneNumberEdit(oRec.Fields("Phone").Value) & " " & oRec.Fields("Extension").Value
                            End If
                            oRecBuild.AddNew(New Object() {"TextPrint", "TextType"}, New Object() {sName, oRec.Fields("PhoneType")})
                        End If
                        oRec.MoveNext()
                    Loop
                End If

當我到達.MoveNext()函數時,應用程序將引發如下錯誤:對象“ PhoneNumbers”,數據庫“ MyDb”,模式“ dbo”的UPDATE權限被拒絕。

此代碼塊中沒有什么調用更新(循環中的函數調用僅格式化數據),有人對導致這種情況的原因有任何想法嗎?

我還應該補充一點,我可以在本地使用SSPI運行此代碼,但是代碼必須能夠在使用SQL用戶名和PW的服務器上運行; 我已經在其他頁面上使用該應用程序測試了更新,並且工作正常。

這只是一種預感,但是我確實在該代碼中看到一個地方, 可能會引起UPDATE命令: oRecBuild.AddNew() 我不知道如何實現,但是我想知道調用oRec.MoveNext()是否以某種方式強制了oRecBuild的提交。 否則,我將仔細研究SelectAll_PhoneNumbers_ById過程以及可能附加到它使用的表或視圖的任何可能的觸發器。

如果失敗了,我會這樣做:

Public Class PhoneNumber
    Public Number As String
    Public PhoneType As String
End Public
'...

Dim result As New List(Of PhoneNumber)
Using cn As New SqlConnection("connection string"), _
      cmd As New SqlCommand("SelectAll_PhoneNumbers_ById", cn)

    cmd.CommandType = CommandType.StoredProcedure
    'Is this really an integer?
    cmd.Parameters.Add("@ObjId", SqlDbType.NVarChar, 20).Value = objRec.Fields("PK_ProgramID").Value
    cn.Open()

    Using rdr As SqlDataReader = cmd.ExecuteReader()
       While rdr.Read()
          Dim phone As String = ""
          If Not IsDbNull(rdr("PhoneType"))
              phone = PhoneNumberEdit(rdr("Phone"))
          End If
          If Not IsDbNull(rdr("Extension"))
              phone = phone & " " & PhoneNumberEdit(rdr("Extension"))
          End If
          result.Add(New PhoneNumber With {.Number = phone, .PhoneType = rdr("PhoneType")})
       End While
    End Using      
End Using

當我在這里時……只要您將數據從一個記錄集讀取到另一個記錄集,那么很有可能整個過程可以完全在數據庫中完成,而根本沒有客戶端代碼。

為了解決這個問題,我想繼續說,我終於能夠解決這個問題。 問題是使用sp_executesql執行的動態sql明確檢查SQL用戶的選擇,插入或更新特權。 執行privs還不夠。

因此,要么必須取消動態SQL,要么必須授予select / update / insert / delete privs。

謝謝大家的幫助和時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM