1

MS Access 2003(他に利用できるものはありません)を使用してスナップショットスタイルデータベースの一時的なバックエンドを構築しています。これには、一時的なバックエンドにリンクされたtabledefを追加することが含まれます。コードは約3週間機能していますが、今日の午後の初めに、3356(つまり、マシンYのユーザーXはすでにデータベースを排他モードで開いています...)または3045(おおよそデータベースを開くことができません)をスローし始めました排他的モードで)、Accessですでに接続を確立しているかどうかによって異なります。

エラーのあるコードは大まかに(ある程度トリミングされています):

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

この理由は、直接リンクしているテーブルを格納しているデータベースを開いた場合に表示されるメッセージに関連しているのではないかと疑っています。つまり、読み取り専用モードでのみ使用できます(これはかなり確実でした。以前はそうではありませんでした)。ただし、コードが読み取り専用アクセス以外のものを必要とする理由がわかりません。また、コードが取得しようとしている理由を理解できません(特に、事前に読み取り専用モードでデータベースを明示的に開いた場合)。

どんな助けでも非常にありがたいです。

ありがとう

4

1 に答える 1

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 はそうではありません。

于 2013-03-11T12:32:02.547 に答える