从独立Access数据库提取MAX日期:技术实现问题求助
从带密码的外部Access数据库获取MAX日期的解决方案
首先得说下,你之前用CurrentDb.Execute来执行SELECT查询是个小问题——这个方法是用来执行操作类查询(比如INSERT/UPDATE/DELETE)的,没法直接返回SELECT的结果。要获取MAX日期,咱们可以用两种更靠谱的方式:
方法一:直接执行跨库查询并通过Recordset获取结果
这种方法不用创建链接表,直接在SQL里指定外部数据库的路径和密码,然后用DAO.Recordset读取结果:
Dim dbPath As String Dim dbName As String Dim strPassword As String Dim tblEngage As String Dim sqlStr As String Dim rs As DAO.Recordset Dim maxOpenDate As Variant ' 赋值你的变量 dbPath = "C:\Portal\_Dev" dbName = "Portal.accdb" strPassword = "OpenSesame" tblEngage = "tbl_engagement" ' 构建跨库查询的SQL语句 sqlStr = "SELECT Max([Open_Date]) AS MaxOpenDate " & _ "FROM [MS Access;pwd=" & strPassword & ";database=" & dbPath & "\" & dbName & "].[" & tblEngage & "]" ' 执行查询并获取结果 Set rs = CurrentDb.OpenRecordset(sqlStr) If Not rs.EOF Then maxOpenDate = rs!MaxOpenDate ' 这里可以用maxOpenDate做后续操作,比如打印或者赋值给控件 Debug.Print "最大日期是:" & maxOpenDate End If ' 清理资源 rs.Close Set rs = Nothing
注意把Open_Date替换成你实际要取MAX值的日期字段名哈,你原来的代码里写到Open_...应该是没写完字段名。
方法二:先创建带密码的链接表,再查询
如果后续还要多次操作这个外部表,先创建链接表会更方便:
Dim dbPath As String Dim dbName As String Dim strPassword As String Dim tblEngage As String Dim linkedTableName As String dbPath = "C:\Portal\_Dev" dbName = "Portal.accdb" strPassword = "OpenSesame" tblEngage = "tbl_engagement" linkedTableName = "Linked_tbl_engagement" ' 自定义链接表的名称 ' 创建链接表 DoCmd.TransferDatabase _ TransferType:=acLink, _ DatabaseType:="Microsoft Access", _ DatabaseName:=dbPath & "\" & dbName, _ ObjectType:=acTable, _ Source:=tblEngage, _ Destination:=linkedTableName, _ StructureOnly:=False, _ StoreLogin:=True ' 保存密码,后续不用再输入 ' 现在就可以像查本地表一样获取MAX日期了 Dim maxOpenDate As Variant maxOpenDate = DLookup("Max(Open_Date)", linkedTableName) Debug.Print "最大日期是:" & maxOpenDate
几个关键注意点:
- 确保外部数据库的路径和文件名没有拼写错误,尤其是
dbPath末尾的反斜杠,我在代码里已经加了& "\" &来拼接,避免路径错误。 - 密码部分要准确,
pwd=后面直接跟密码,不要加引号。 - 如果字段名或者表名有空格,一定要用方括号
[]包裹,避免语法错误。
内容的提问来源于stack exchange,提问作者dmorgan20
相关产品推荐
相关产品推荐

