【问题标题】:Excel VBA querying from Password-Protected Access DatabaseExcel VBA 从受密码保护的访问数据库中查询
【发布时间】:2018-07-23 04:55:18
【问题描述】:

我目前正在尝试从 Microsoft Access 数据库 (.mdb) 中查询其中一个表,但是,当我尝试执行 SELECT * FROM myTable 时,它会给出“未定义的用户定义类型”。我可以知道为什么吗?

这是我的示例代码:

Private Sub CommandButton1_Click()
    Dim db As DAO.Database
    Dim dbPath As String
    Dim aQuery As String
    Dim pword As String
    Dim rs As DAO.Recordset

    dbPath = ThisWorkBook.Path & "\Database.mdb"
    pword = "password"
    aQuery = "SELECT * FROM myTable"

    Set db = Access.DBEngine.Workspaces(0).OpenDatabase(dbPath, True, False, ";PWD=" & pword)
    Set rs = db.Execute(aQuery)
    rs.MoveFirst
    MsgBox rs.Fields(0)

End Sub

【问题讨论】:

  • 您的代码在哪里中断?哪条线?
  • 如果您是从 Excel 执行此操作,则需要添加对 DAO 对象库的引用。

标签: excel ms-access vba


【解决方案1】:

使用 ADO

添加参考:Microsoft ActiveX 数据对象 2.8 库


Sub test()

    Dim Conn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim dbPath As String
    Dim aQuery As String
    Dim pword As String
    Dim strcon As String


    dbPath = ThisWorkbook.Path & "\Database.mdb"
    pword = "abcd"
    aQuery = "SELECT * FROM myTable"

    strcon = "Provider=Microsoft.Jet.OLEDB.4.0;" _
            & "Data Source=" & dbPath & ";" _
            & "Jet OLEDB:Database Password=" & pword & ";"

    Conn.Open strcon
    rs.Open aQuery, Conn

    If Not (rs.EOF And rs.BOF) Then
        MsgBox rs.Fields(0)
    End If

    rs.Close
    Set rs = Nothing
    Set Conn = Nothing

End Sub

使用 DAO
添加参考:Microsoft DAO 3.6 对象库

正如@Tim 强调的那样,您错过了添加对库的引用。

Sub test()

   Dim db As DAO.Database
    Dim dbPath As String
    Dim aQuery As String
    Dim pword As String
    Dim rs As DAO.Recordset

    dbPath = ThisWorkbook.Path & "\Database.mdb"
    pword = "abcd"
    aQuery = "SELECT * FROM myTable"


    Set db = OpenDatabase(dbPath, True, False, ";PWD=" & pword)
    Set rs = db.OpenRecordset(aQuery)
    rs.MoveFirst
    MsgBox rs.Fields(0)

 End Sub

【讨论】:

    【解决方案2】:

    试试这个:

    Private Sub CommandButton1_Click()
        Dim db As object, rs as object
        Dim dbPath As String
        Dim aQuery As String
        Dim pword As String, uid as string
    
        dbPath = ThisWorkBook.Path & "\Database.mdb"
        pword = "password"
        uid = "myid"
    
        set db = createobject("adodb.connection")
        with db.open
            .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbPath & _
            ";User ID=" & uid & ";Jet OLEDB:Database Password=""" & pword & """;"
        end with
        aQuery = "SELECT * FROM myTable"
    
        Set rs = db.Execute(aQuery)
        rs.MoveFirst
        MsgBox rs.Fields(0)
    
        db.close
        set rs = nothing
        set db = nothing
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多