2013-07-29 55 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​​函數。 –