【问题标题】:Excel VBA Connection to Access 2010Excel VBA 连接到 Access 2010
【发布时间】:2012-08-28 14:11:15
【问题描述】:

我有一个类正在处理我与 Access 2003 数据库的连接。我想仅为 Access 07/10 .accdb 文件设置相同的内容。任何帮助表示赞赏!谢谢!

这是我的引用列表和类对象的副本

参考资料:

  • Microsoft Access 14.0 对象库
  • Microsoft DAO 3.6 对象库

连接类:

Option Explicit

Private Const DbFile = "\\server\folders\Report.mdb"
Dim OpenConn As DAO.Database
Dim ObjAccess As Object

Private Sub Class_Initialize()
    On Error Resume Next
    Set OpenConn = DAO.OpenDatabase(DbFile)
    If Err.Number = 3024 Then MsgBox "Check connection string in the VBA StaticClass object", vbOKOnly

    Set ObjAccess = CreateObject("Access.Application")
    ObjAccess.Visible = False
    ObjAccess.OpenCurrentDatabase (DbFile)
End Sub

Public Function runSQL(ByVal sql As String) As Recordset
    Set runSQL = OpenConn.OpenRecordset(sql)
End Function

Public Function runVolumeReport(ByVal inMacro As String)
    ObjAccess.DoCmd.RunMacro inMacro
End Function

Public Function closeResources()
    Set ObjAccess = Nothing
    OpenConn.Close
End Function

【问题讨论】:

  • 我也会Dim OpenConn As Object 而不是DAO.Database。这允许版本无关的代码(但会删除您在 OpenConn 或 DAO 之后键入 . 时获得的可爱弹出窗口)
  • 当我从 .mdb 切换到 .accdb 时,会出现无法识别的错误。稍后我会尝试找出确切的错误。
  • 我打开了文件,然后将其翻转为 .accdb。它在函数 runSQL 上失败,给出运行时错误 91,对象变量或未设置块变量。不过,runVolumeReport 函数可以很好地启动数据库内的宏。只是不喜欢当我将其切换为 .accdb 格式时尝试从 Access 中提取记录集的方式

标签: ms-access excel ms-access-2007 vba


【解决方案1】:

Class_Initialize 有问题。

On Error Resume Next
Set OpenConn = DAO.OpenDatabase(DbFile)
If Err.Number = 3024 Then MsgBox "Check connection string in the VBA StaticClass object", vbOKOnly

因为On Error Resume Next,除了3024(“找不到文件”)之外的任何错误都会默默地过去,OpenConn 也不会按照你的意愿设置。稍后当您尝试使用OpenConn 时,您将触发另一个错误。而且,在评论中,您报告说您确实收到了此行的另一个错误:

Set runSQL = OpenConn.OpenRecordset(sql)

不幸的是,由于On Error Resume Next,我们不知道为什么OpenDatabase 未能让OpenConn 未设置。由于ObjAccess 似乎作为Access 应用程序对象工作,您可以尝试将OpenConn 设置为ObjAccess.CurrentDb

Private Sub Class_Initialize()
    Set ObjAccess = CreateObject("Access.Application")
    ObjAccess.Visible = False
    ObjAccess.OpenCurrentDatabase DbFile
    Set OpenConn = ObjAccess.CurrentDb
End Sub

OTOH,如果您像这样更改您的 runSQL 函数,您也许可以完全不用 OpenConn ...

Public Function runSQL(ByVal sql As String) As Recordset
    'Set runSQL = OpenConn.OpenRecordset(sql) '
    Set runSQL = ObjAccess.CurrentDb.OpenRecordset(sql)
End Function

【讨论】:

    【解决方案2】:

    打开 accdb (SQL Server) 表的一种方法是:

    Dim cmd As New ADODB.Command
    Dim rs As ADODB.Recordset
    Dim strSQL As String
    
    strSQL = "select SomeStuff from SomeTable"
    
    cmd.ActiveConnection = CurrentProject.Connection
    cmd.CommandText = strSQL ' you can put in the SQL directly, 
                             ' but I find the string easier to manipulate away from the .CommandText
    Set rs = cmd.Execute
    

    我的参考资料(Access 2010):

    我认为您需要添加的关键是 Microsoft ActiveX Data Objects X.X Library

    【讨论】:

      【解决方案3】:
      Imports System.Data.OleDb
      
      Public Class Form1
          Dim strSQL As String
          Dim ds As New DataSet
          Dim strConnection As String
          Dim DBconnection As New OleDbConnection
          Dim oledbAdapter As New OleDbDataAdapter
          Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      strConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=P:\Informatica\April - Juni\Acces\db-games.accdb"
              DBconnection = New OleDbConnection(strConnection)
              strSQL = "SELECT * from tbl_games"
      
              Try
                  DBconnection.Open()
                  oledbAdapter = New OleDbDataAdapter(strSQL, DBconnection)
                  oledbAdapter.Fill(ds)
                  DataGridView1.DataSource = ds.Tables(0)
              Catch ex As Exception
                  MsgBox(ex.ToString)
              End Try
              DBconnection.Close()
          End Sub
      End Class
      

      Dim con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=P:\Informatica\Acces\db_Games.accdb;Persist Security Info=False") 将 cmd 调暗为新的 OleDbCommand

          con.Open()
      
          cmd.Connection = con
      
          cmd.CommandText = "INSERT INTO tbl_gerne(Omschrijving) VALUES('adventure')"
          cmd.ExecuteNonQuery()
      
          con.Close()
      

      【讨论】:

      • 嗨,彼得,欢迎来到 Stack Overflow。请花时间查看How to Answer 并考虑在您的帖子中添加一些支持文本来解释您的代码的作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 2014-04-15
      • 2013-03-01
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多