2013-07-29 57 views
2

所以我基本上试图通过DAO链接一个表,通过密码加密到我正在使用的数据库中的ACCDB。我所做的前提是数据是“用户敏感“,所以我不想让每个用户都可以在我的前端访问此表(具有前端/后端拆分),只有特定的用户才能访问此表。我想这样做是为了检查计算机的用户名,然后允许用户名是否正确前端链接到该数据:通过DAO的链接表

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

仔细看看您如何检查CurrentDb中的表名。这条线抛出错误#13,“类型不匹配”,我的系统上:

Msgbox tbl 

我想你应该问的TableDef.Name代替:

Msgbox tbl.Name 

不过,我米不知道这是唯一的问题。您似乎试图通过复制TableDef并将其添加到CurrentDb.TableDefs来链接到另一个db文件中的表。 IF可以使这项工作,它不会给你一个链接源表,它将使一个新的副本CurrentDb。但我怀疑它是否可以工作。

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

下面是代码访问测试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 
+0

查看mwolfe02关于查询名称冲突和Environ(“username”)''不安全性的警告。 – HansUp

+0

有关OP如何尝试复制TableDef对象本身的好处。我掩盖了代码,只真正解决了错误信息。 – mwolfe02

+0

@HansUp在阅读一些文章后,我想出了这个代码;他们说这是连接桌子,但它看起来不像是这样,所以我有点怀疑。有没有更好的方式来链接这些数据?而不是将**附加到表中 –

2

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

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

+0

感谢您的答复!但是,DB中没有名称相同的对象。感谢您的建议,我一定会开始使用API​​函数。 –