2013-03-05 47 views
1

我正在为使用MS Access 2003(没有其他可用)的快照样式数据库构建临时后端,这涉及到向临时后端添加一些链接的tabledefs。代码已经工作了大约3周,但截至今天下午早些时候,开始抛出3356(即机器Y上的用户X已经以独占模式打开数据库...)或3045(大致无法打开数据库在exlcusive模式下),取决于我是否已经在Access中建立连接。当在Access中追加tabledef时出现错误3045或3356

的示数码粗略(有点修整):

Private Sub AddTabledefToDb(dbC As DAO.Database, dbTarget As DAO.Database, strLinkedName As String) 
    Dim strPath As String, tdfLinked As DAO.TableDef 
    strPath = strGetPathFromConnect(tdfLinked.Connect) 

    Set tdfLinked = dbC.TableDefs(strLinkedName) 

    ' With the lines below, error thrown is 3356; without 3045 ' 
    Dim dbLinkedTableIn As DAO.Database 
    Set dbLinkedTableIn = Application.DBEngine.Workspaces(0).OpenDatabase(strPath, False, True, tdfLinked.Connect) 

    Dim tdfNew as DAO.TableDef 
    Set tdfNew = dbTarget.CreateTableDef(Attributes:=dbAttachedTable) 
    tdfNew.Name = tdfLinked.Name 
    tdfNew.SourceTableName = tdfLinked.SourceTableName 
    tdfNew.Connect = tdfLinked.Connect 
    dbTarget.TableDefs.Append tdfNew ' Throws 3045 without the lines above or 3356 with them ' 

    ' If needed... ' 
    dbLinkedTableIn.Close 
    Set dbLinkedTableIn = Nothing 

End Sub 

我有一个怀疑,这样做的原因可能与显示,如果我打开数据库住房表我留言直接链接,即它只能在只读模式下使用(我相当肯定以前不是这种情况)。然而,我不清楚为什么我的代码需要的不仅仅是只读访问,而且我也不知道为什么它试图获取它(特别是当我以只读模式预先打开数据库时)。

任何帮助将非常感激。

谢谢

+0

好吧,它可能是一些事情。假设某人实际上并没有以独占模式打开其中一个数据库(你可能已经检查过),这听起来像是一个权利问题。即使在您链接到的数据库中,您也需要拥有创建/修改/删除.ldb锁定文件的权限,因此如果这是网络共享,您可能需要从这里启动。 – 2013-03-05 18:47:22

+0

嗯......嗯,我知道我可以创建一个.idb,因为它是在我明确打开数据库时创建的,并且在关闭/没有对象(仅查找文件夹)时被删除。我隐约想知道这是否与2GB的限制有关Access虽然...我试图连接的数据库显示为1.87GB(不问),但考虑它可能是2万亿字节(给出1000和1024之间的区别等)。 今天早上再试一次,它似乎功能(触摸木材)。真的很困惑,为什么它首先打破了。 – tobriand 2013-03-06 09:29:22

+0

@tobriand我认为你对文件大小的怀疑是正确的,1.87GB的显示应该等同于大约2GB的字节数限制。当你达到这些限制时,Access会触发一个权限扩展,而不是一个更有意义的**空间不足**错误。数据库最近是否被压缩和修复?如果是这样,您可能需要考虑将某些表分割为另一个mdb文件。 – 2013-03-06 12:41:21

回答

1

认为我遇到了答案:不要使用DAO,而是使用ADO。在下面看得非常粗略。目前,我还没有将Mode属性设置为Read,但最初的测试表明它至少在没有这样做的情况下才起作用。

Dim cn As ADODB.Connection 
Dim tbl as ADOX.Table 
Dim cat as ADOX.Catalog 

Set cn = New ADODB.Connection 
cn.Provider = "Microsoft.Jet.OLEDB.4.0" 
cn.Open dbTarget.Name ' Path of the db the linked table needs to end up in' 

Set cat = New ADOX.Catalog 
cat.ActiveConnection = cn 

Set tbl = New ADOX.Table 
Set tbl.ParentCatalog = cat 

tbl.Name = tdfLinked.Name 
tbl.Properties("Jet OLEDB:Link Datasource") = strGetPathFromConnectString(tdfLinked.Connect) 
tbl.Properties("Jet OLEDB:Link Provider String") = "MS Access" ' If Password protected, details go here ' 
tbl.Properties("Jet OLEDB:Remote Table Name") = tdfLinked.SourceTableName 
tbl.Properties("Jet OLEDB:Create Link") = True 

cat.Tables.Append tbl 

cn.Close 
Set tbl = Nothing 
Set cat = Nothing 
Set cn = Nothing 

大致来说,它看起来像ADO是不快乐收购守则读/写访问,以创建一个链接表,而DAO不是。

+0

在我接受我的回答之前等待几天,因为有可能再次出现问题! – tobriand 2013-03-11 12:32:40

相关问题