VBA Excel里 用ADO访问ACCESS数据库的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VBA Excel里 用ADO访问ACCESS数据库的问题相关的知识,希望对你有一定的参考价值。

Dim dbPath As String
dbPath = "E:\MyData.accdb"
Dim acApp As Access.Application
Set acApp = New Access.Application
acApp.OpenCurrentDatabase (dbPath)
Dim cn As ADODB.Connection
Set cn = acApp.CurrentProject.Connection

Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

Dim Sql As String
Sql = "Select * From 0012X32"

rst.Open Sql, cn '****运行到这儿,然后提示错误......
rst.MoveFirst
rst.Move (1)
MsgBox rst.Fields(1).Value

acApp.CloseCurrentDatabase

E:\MyData.accdb里边有个0012X32的表, 但在调试时 总提示错误:
运行时错误'3001',参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突.

rst.Open Sql, cn.ConnectionString

 我的数据库语言不是很好,但看了你的代码,也觉得很乱,你的代码至少有好几种方法可以修改,上面是最简单的一种,实际上你的数据库在acapp.OpenCurrentDatabase的时候已经打开了,接下来根本就不需要再次使用cn进行连接。

所以第二种改法是:

acApp.OpenCurrentDatabase (dbPath)
'Dim cn As ADODB.Connection   '不需要再次连接
'Set cn = acApp.CurrentProject.Connection   '不需要再次连接
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
Dim Sql As String
Sql = "Select * From 0012X32"
rst.Open Sql, acApp.ADOConnectString   '我只需要在这里调用连接的数据就可以了,而这个连接数据存储在acApp.ADOConnectString里面。
rst.MoveFirst

 

下面是RecordSet的OPEN的用法:

Open 方法 (ADO Recordset)
打开游标。
语法
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
参数
Source 可选。Variant,计算有效的 Command 对象、SQL 语句、表名、存储过程调用、URL 或包含持久存储 Recordset 的文件名或 Stream 对象。
ActiveConnection 可选。Variant,计算有效的 Connection 对象变量名,或包含 ConnectionString 参数的 String。
CursorType 可选。CursorTypeEnum 值,确定在打开 Recordset 时提供者应使用的游标类型。默认值为 adOpenForwardOnly。
LockType 可选。LockTypeEnum 值,确定在打开 Recordset 时提供者应使用的锁定(并发)类型。默认值为 adLockReadOnly。
Options 可选。Long 值,指示提供者计算 Source 参数的方式(如果该参数表示除 Command 对象之外的某些内容),或者指示 Recordset 应该从以前保存过的文件中恢复。可以是一个或多个 CommandTypeEnum 或 ExecuteOptionEnum 值,这些值可以用位 AND 操作符组合。
注意   如果从包含持久 Recordset 的 Stream 中打开 Recordset,那么使用 adAsyncFetchNonBlocking 的 ExecuteOptionEnum 值将不起作用;提取操作将同步进行并发生阻塞。adExecuteNoRecords 或 adExecuteStream 的 ExecuteOpenEnum 值不应与 Open 一起使用。

因为ADO语言,直接提供了连接数据库的方法,所以我们可以直接这样来连接数据库:(算作本题的第三种改法吧)

Dim cn As New ADODB.Connection    '直接创建对数据库连接的实例对象cn
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath  '连接数据库
Dim rst As New ADODB.Recordset
Dim Sql As String
Sql = "Select * From 0012X32"
rst.Open Sql, cn
rst.MoveFirst
rst.Move (1)
MsgBox rst.Fields(1).Value

参考技术A Sql = "Select * From [0012X32]"追问

不行

参考技术B 开始录制宏,进行一次导入,停止录制,然后编辑刚才的代码,获得关键语句来自己使用。

Vba Excel ADODB 预加载现金数据集以更快地查询大型 Access 数据集 500000 行

【中文标题】Vba Excel ADODB 预加载现金数据集以更快地查询大型 Access 数据集 500000 行【英文标题】:Vba Excel ADODB pre-load in cash dataset to query faster a big Access dataset 500000 rows 【发布时间】:2015-05-25 15:47:20 【问题描述】:

下午好 我有一个问题:Excel 从 Access 外部数据库检索数据的速度 (47秒-->我想达到3秒) Excel 2010 访问 2000

在我打开的开幕活动中的代码我运行这个宏:

'I define connection and dataset as public
Public conn As ADODB.Connection
Public mrs As ADODB.Recordset
Public cmd As ADODB.Command

Public DBPath As String
Public strConn As String
Public strSQL As String

Public Sub preloadDataset()

Set conn = New ADODB.Connection
Set mrs = New ADODB.Recordset

DBPath = ThisWorkbook.Path & Application.PathSeparator & "Exported.mdb"

    With conn
        .Provider = "Microsoft.ACE.OLEDB.12.0"
        .ConnectionString = "Data source=" & DBPath
        .Open
    End With


Set cmd = New ADODB.Command
strSQL = "SELECT * FROM [Database_5000Rows] WHERE "PrNameHelp" = ? AND "ScCompHelp" LIKE ""%?%""

    Set cmd.ActiveConnection = conn
    cmd.CommandText = strSQL
    cmd.CommandType = adCmdText
    cmd.Prepared = True

        'MANUAL creation of parameters
        cmd.Parameters.Append cmd.CreateParameter("PrNameHelp", adLongVarChar, adParamInput)
cmd.Parameters.Append cmd.CreateParameter("ScCompHelp", adLongVarChar, adParamInput)

End sub

主宏:

Public Sub ADO_retrieve_Ext_file()

cmd("PrNameHelp") = str01
cmd("ScCompHelp") = str02

cmd.Execute

Application.Calculation = xlCalculationManual
    Sheet1.Range("A1").CopyFromRecordset mrs
Application.Calculation = xlCalculationAutomatic

End sub

闭幕式:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'**********************
    ''Close Recordset
    mrs.Close
    ''Close Connection
    conn.Close
    Set mrs = Nothing
    Set Conn = Nothing
'**********************

End sub

如何为 Access 定义处理 SQL 正确字符串的参数? 是使用参数的正确方法还是将整个数据库上传到RAM中更好?

谢谢 恩里科

【问题讨论】:

您还可以通过在Code Review 上发帖获得有关此主题的一些好的、集中的帮助。 虽然您已经就您的问题提供了很好的细节,但这个主题是如此广泛,以至于我首先想知道的是您使用的是 SSD 还是主轴驱动器,问题只会从那里成倍增加。 不使用固态硬盘 您需要只检索表格中的一行、仅几行、大部分行还是所有行? 您能否发布您用于该过程的所有代码 【参考方案1】:

将数据复制到工作表时,请尽量避免在完成之前对其进行更新。使用:

Application.ScreenUpdating = False 

Application.ScreenUpdating = true

【讨论】:

已解决:以编程方式索引 Access 中表的第一列:已达到 6 秒【参考方案2】:

已解决:在 Access 中以编程方式索引表的第一列

【讨论】:

以上是关于VBA Excel里 用ADO访问ACCESS数据库的问题的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的情况,使用 ADO 在 Excel VBA 中定义连接到 Access .accdb 数据库的文件路径,但是它告诉我找不到 .mdb 文件

如何在VBA中用ADO连接远程的access数据库

在 VBA 中打开与 Excel 电子表格的 ADO 连接

如何通过 Access VBA 正确访问 Excel 文件

在 Excel 中运行 VBA 代码以获取 Access 数据库中的 VBA

在 MS Access/VBA 中使用 ADO 连接对话框