2

Access已保存使用名为“myQuery”的查询生成器设计的查询。数据库通过 ODBC 连接连接到系统。宏全部启用。

Excel建立了一个 ADODB 连接以通过以下方式连接到数据库

Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Set con = New ADODB.Connection
With con
 .Provider = "Microsoft.ACE.OLEDB.12.0"
 .Open "MyDatabase.accdb"
End With

通常你会继续写你的SQL,这很好,然后就做类似的事情

Dim sqlQuery As String
sqlQuery = "SELECT * FROM myTable"
Set rs = New ADODB.Recordset
rs.Open sqlQuery, con, ...

但我想访问我保存在访问数据库中的查询。那么如何在我刚刚连接的数据库中调用保存的查询。

已经试过了

  1. con.Execute("EXEC myQuery")但那个告诉我找不到 myQuery。
  2. rs.Open "myQuery", con但那个是无效的,需要从中选择 SELECT/etc 语句
4

5 回答 5

7

我认为您可以将其视为存储过程。

如果我们在之前开始Dim sqlQuery As String

 Dim cmd as new ADODB.Command
 cmd.CommandType = adCmdStoredProc
 cmd.CommandText = "myQuery"
 cmd.ActiveConnection = con

 Set rs = cmd.Execute()

然后在此之后拾取您的记录集工作。

于 2013-01-18T13:32:00.267 回答
2

你快到了:

Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Set con = New ADODB.Connection
With con
 .Provider = "Microsoft.ACE.OLEDB.12.0"
 .Open "z:\docs\MyDatabase.accdb"
End With
con.Execute "MyQuery"

只需省略 Exec。

您也可以添加参数,这有点旧,但应该会有所帮助:使用 Excel 数据和可能的宏更新 Access 数据库中的 2 个字段

于 2013-01-18T13:26:11.583 回答
0

我能够使用以下命令运行已保存在 Access 中的更新查询:

Connection.Execute "My_Update_Query_Already_Saved_In_Access", adExecuteNoRecords, adCmdStoredProc

这给了我错误,直到我在 Access 数据库和执行语句中都用下划线替换了查询名称中的空格。

于 2016-05-13T20:27:40.757 回答
0

这是一种黑客工作,但您可以查询查询。也就是说,将您的 sql 字符串替换为以下内容:

sqlQuery = "SELECT * FROM QueryName;"

在运行此之前,必须确保已保存 Access 数据库,即。按 Ctrl+S(仅在 Access 中运行查询是不够的)。

于 2016-06-15T21:31:04.277 回答
0

自从创建此线程以来已经很长时间了。如果我理解正确,我可能会添加一些有用的东西。我已经为 OP 描述的内容命名,即使用保存在 ACCDB 中的查询中的 SQL 以通过 DAO 或 ADOBD 在 VBA 中运行的过程。我给它起的名字是“对象属性提供者”,即使在我的笔记中有首字母缩写词 OPP,对象名称前缀/后缀也是如此。

这个想法是 ACCDB 中的现有对象(通常是查询)提供了您需要在 VBA 中使用的属性(通常是 SQL)。我拼凑了一个函数,只是为了从查询中吸出 SQL;见下文。预警:抱歉,不过这都是在DAO,我对ADODB用处不大。希望您仍然会发现这些想法很有用。

我什至设计了一种在来自这些 OPP 查询的 SQL 中使用/插入可替换参数的方法。然后我在 VBA 中使用 SQL 之前使用 VBA.Replace() 进行替换。

ACCDB中查询的SQL的DAO对象路径如下:

mySqlStatement = Access.Application.CurrentDb.QueryDefs("myQueryName").SQL

我使用可替换参数的方式是评估需要替换的内容,并为在真实数据库中不可能存在的参数选择一个不寻常的名称。在大多数情况下,我所做的唯一替换是字段名或表名,或者 WHERE 和 HAVING 子句的表达式。所以我将它们命名为“{ReplaceMe00000001}”,然后使用 Replace() 函数来完成工作......

sqlText = VBA.Replace(sqlText, "{ReplaceMe00000001}", "SomeActualParameter")

...然后在 VBA 中使用 sqlText。这是一个工作示例:

Public Function MySqlThing()
    Dim sqlText as String
    Dim myParamater as String
    Dim myExpression as String

    'Set everything up.
    sqlText = getSqlTextFromQuery("myQuery")
    myParameter = "{ReplaceMe00000001}"
    myExpression = "SomeDateOrSomething12/31/2017"

    'Do the replacement.
    sqlText = VBA.Replace(sqlText, myParameter, myExpression)

    'Then use the SQL.
    db.Execute sqlText, dbFailOnError
End Function

Function getSqlTextFromQuery(ByVal oppName As String) As String

    Dim app As Access.Application
    Dim db As DAO.Database
    Dim qdefs As DAO.QueryDefs
    Dim qdef As DAO.QueryDef
    Dim sqlText As String

    Set app = Access.Application
    Set db = app.CurrentDb
    Set qdefs = db.QueryDefs
    Set qdef = qdefs(oppName)

    oppGetSqlText = qdef.SQL

End Function
于 2017-12-18T16:51:56.950 回答