2

因此,我实际上是在尝试通过 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

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

4

2 回答 2

4

仔细看看您是如何检查CurrentDb. 此行在我的系统上引发错误 #13, "Type mismatch"

Msgbox tbl

我认为您应该改为询问 TableDef.Name :

Msgbox tbl.Name

但是,我不确定这是这里唯一的问题。您似乎试图通过复制该表TableDef并将其添加到CurrentDb.TableDefs. 如果你能做到这一点,它不会给你一个源表的链接,它CurrentDb. 但我怀疑它是否可以工作。

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

这是在 Access 2007 中测试的代码。

Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim strConnect As String
Dim strDbFile As String
Dim strLinkName As String
Dim strPassword As String
Dim strSourceTableName As String

strDbFile = "C:\share\Access\MyDb.accdb"
strPassword = "foo"
strSourceTableName = "Contacts"
strLinkName = "link_to_contacts"

strConnect = "MS Access;PWD=" & strPassword & _
    ";DATABASE=" & strDbFile
Debug.Print strConnect
Set db = CurrentDb
Set tdf = db.CreateTableDef
tdf.Connect = strConnect
tdf.SourceTableName = strSourceTableName
tdf.Name = strLinkName
db.TableDefs.Append tdf
Set tdf = Nothing
Set db = Nothing
于 2013-07-29T20:00:41.447 回答
2

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

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

于 2013-07-29T19:53:38.457 回答