调用 `ADODB.connection.open` 时检查用户的权限

Posted

技术标签:

【中文标题】调用 `ADODB.connection.open` 时检查用户的权限【英文标题】:Check the permission of user when calling `ADODB.connection.open` 【发布时间】:2022-01-23 21:40:24 【问题描述】:

我被困在以下几个星期:

我需要使用 VBA Excel 删除并插入 SQL 数据库。

用于连接数据库的代码是:

sConnString= "string for the connexion to the database"
conn.Open sConnString, "username", "password"
Debug.Print conn.State 

这里的答案是1,根据微软文档,这意味着连接已打开。

然后我尝试使用以下代码执行 SQL 查询:

varSQL = "DELETE FROM mytable WHERE specificColumn = '" & specificVariable & "'"
Set Command1 = New ADODB.Command
With Command1
    .ActiveConnection = conn
    .CommandType = adCmdText
End With
With Command1
    .CommandText = varSQL
    .Execute NbRecordsAffected
End With

这将返回对DELETE 查询的拒绝访问

我想知道username的用户是否有权限进行查询,所以我可以确定错误来自另一件事

提前谢谢你

【问题讨论】:

嗨 - 一种方法是处理错误以了解 Access Denied 何时弹出。另一个取决于您的数据库,将查询给定用户的权限,并将其存储/检查在您的应用程序中 “SQL 数据库”不是很具体 - 如果您告诉我们您正在使用的实际数据库,可能会有更多有用的建议。例如:mssqltips.com/sqlservertip/6828/… @TimWilliams 感谢您的评论,我实际上正在使用 Microsoft SQL,所以您评论中的链接似乎很有用,我会尝试一下,看看是否可以获得一些信息 【参考方案1】:

考虑使用 VBA 错误处理通过 ADO 错误集合捕获更多信息错误,如果使用 SQL Server 数据库,您可能会收到:

对象“mytable”、数据库“mydatabase”架构dbo的DELETE权限被拒绝

Sub Run_SQL()
On Error GoTo ErrorHandle
     Dim conn As ADODB.Connection, Command1 AS ADODB.Command

     '...your full code...

ExitHandle:
    ' RELEASE RESOURCES
    Set Command1 = Nothing: Set conn = Nothing
    Exit Sub

ErrorHandle:
    ' RAISE EVERY CONNECTION ERROR
    Dim myError As ADODB.Error
    For Each myError In conn.Errors
        Msgbox myError.Number & " - " & myError.Description, "RUNTIME ERROR", vbCritical
    Next myerror
    Resume Exit_Handle

End Sub

【讨论】:

引发执行错误 13 : Incompatible type 您确定错误是由于用户权限还是您的非参数化/连接条件:WHERE specificColumn = '" & specificVariable & "'"?尝试隔离特定问题以进行调试。 conn.Errors 类型与 VBA 错误不同。也许它有一个特定的类型。当我调试时,错误就在For Each myError In conn.Errors这一行 你是对的。使用ADODB.Error查看编辑。

以上是关于调用 `ADODB.connection.open` 时检查用户的权限的主要内容,如果未能解决你的问题,请参考以下文章

系统调用与函数调用

java三种调用方式(同步调用/回调/异步调用)

LINUX系统调用

引用调用 vs 复制调用调用

RPC 调用和 HTTP 调用的区别

js方法调用