链接表通过DAO

时间:2013-07-29 19:15:44

标签: vba ms-access access-vba dao

所以我基本上试图通过DAO将表格从密码加密的ACCDB链接到我正在使用的数据库中。我正在做的前提是数据有点“用户敏感”所以我不希望让每个用户都有权访问我的前端(具有前端/后端分割),只有特定用户。我想做的是检查计算机的用户名,如果用户名正确,则允许前端链接到数据:

Select Case Environ("username") 'select case user environment name

Case "jsmith" 'if username is jsmith then
Set db = DAO.OpenDatabase("Audit.accdb", False, False, _
";pwd=adaudit12") 'create connection to my other db
Set tbl = db.TableDefs(14) 'selects the table via index
CurrentDb.TableDefs.Append tbl 'create a link to my current DB with this table (throws ex here)

Case Else

End Select

返回运行时错误'3367'无法追加。具有该名称的对象已存在于集合中。

所以我想这样做:

For Each tbl In CurrentDb.TableDefs
Msgbox tbl
Next tbl

但是这个表在我的数据库中不存在,所以我该怎么办?

2 个答案:

答案 0 :(得分:4)

仔细研究一下如何检查CurrentDb中的表名。该行在我的系统上抛出错误#13,“类型不匹配”

Msgbox tbl

我认为你应该要求TableDef.Name:

Msgbox tbl.Name

但是,我不确定这是唯一的问题。您似乎试图通过复制TableDef并将其添加到CurrentDb.TableDefs来链接到另一个db文件中的表。 IF 你可以做到这一点,它不会给你一个链接到源表,它会创建一个新的副本<{1}}中的。但我对它是否能够发挥作用持怀疑态度。

您可以创建新的CurrentDb对象,设置其TableDefNameConnect属性,然后将其附加到SourceTableName。在CurrentDb.TableDefs属性中包含数据库密码。

以下是Access 2007中的代码测试。

Connect

答案 1 :(得分:2)

表和查询在MS Access中共享相同的名称空间。您可能有一个与您尝试链接的表名称相同的查询。

此外,Environ("username")很容易被欺骗。请考虑使用API​​函数GetUserName。当然,如果您需要真正的安全性,您需要将后端升级到SQL Server(Express)或其他一些RDBMS。