プロが教える店舗&オフィスのセキュリティ対策術

現在、VB.NET上で操作し、Accessのテーブルのリンクをしているのですが、
リンク処理の直後に、最後にテーブルのリンク処理をしたテーブルを
開こうとすると、
「要求された名前、または序数に対応する項目がコレクションで見つかりません。」という
エラーが出ます。

なお、リンクしたテーブルには、きちんと正しいリンクで開こうとしたテーブルが登録されています。

それで、最後にリンクしたのが悪いのかと思い、順番を変えると、
そのエラーは起こらずに通常に起動しました。

ですが、順番を変えただけで普通に動く、というのが
なんだか腑に落ちません。(まあ、無事に動いているのでいいのですが(汗 )

以下にリンク処理を記載します。
何故、このようなことが起こるのかわかる方いらっしゃいましたら、ご教授お願い致します。
予想でもかまいません。


Public Sub DBLink()
LFlag = False

Dim rs As ADODB.Recordset = New ADODB.Recordset
Dim Sql As String = String.Empty
Dim dbPName As String = String.Empty

Dim tName() As String

'リンク先のパスを指定
Dim f As New frmLinkPath
f.ShowDialog()
f.Close()
f = Nothing

'パスを指定したか否か
If LFlag Then
'TMPのパスは固定
dbPName = PathLast(Application.StartupPath) & "TMP.mdb"

'リンクするテーブル名を取得
'mdbLには、テーブル名がカンマ区切りで入っています
tName = mdbL.Split(",")

'リンク先のテーブルを削除
For i = 0 To tName.Length - 1
Sql = "DROP TABLE " & tName(i)
rs.Open(Sql, cn)
Call SLink(tName(i), dbPName)
Next


dbPName = PathLast(DBPath) & "MST.mdb"

'リンクするテーブル名を取得
tName = mdbS.Split(",")

'リンク先のテーブルを削除
For i = 0 To tName.Length - 1
Sql = "DROP TABLE " & tName(i)
rs.Open(Sql, cn)
Call SLink(tName(i), dbPName)
Next

Else
MsgBox("リンク先が指定されなかったので、" & vbCrLf & "テーブルの再リンクをキャンセルします", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "")
End If

End Sub

''' <summary>
''' データベース再リンク
''' </summary>
''' <param name="psNm">リンクするテーブル名</param>
''' <param name="psMdb">リンク元データベース名</param>
''' <remarks></remarks>
Public Sub SLink(ByVal psNm As String, ByVal psMdb As String)
Try
Dim lodDb As dao.Database
Dim ltDef As dao.TableDef
Dim lsSource As String
Dim lsTarget As String
Dim daoE As New dao.DBEngine
'リンク先データベースとリンクデータベース名を指定
lsSource = psMdb
lsTarget = PathLast(Application.StartupPath) & "DATA.mdb"

'既存のデータベースの場合は OpenDatabase を使用する)
lodDb = daoE.OpenDatabase(lsTarget)

'任意の名前でテーブル定義を作成する
ltDef = lodDb.CreateTableDef(psNm)

'リンク先のテーブル名を指定する
ltDef.SourceTableName = psNm

'リンク先のデータベースを指定する(対象がMDBの場合セミコロンの前は省略)
ltDef.Connect = ";Database=" & lsSource

'定義したテーブルをアペンド(追加)する
lodDb.TableDefs.Append(ltDef)

lodDb.Close()
lodDb = Nothing
Catch ex As Exception
Debug.Print(ex.Message)
'Throw
End Try
End Sub

A 回答 (1件)

Access2010のヘルプには


////////////////////
TableDefs.Refresh メソッド
指定されたコレクション内のオブジェクトを更新して、データベースの現在のスキーマを反映させます。
構文

式.Refresh

式 TableDefs オブジェクトを表す変数。
(以下割愛、続きはAccessのヘルプを。)
というのが有りますので

ここいら辺か
lodDb.TableDefs.Append(ltDef)
lodDb.TableDefs.refresh
この辺のどちらかに
Call SLink(tName(i), dbPName)
Next
lodDb.TableDefs.refresh

と追加してみたらどうでしょう?
保証の限りではございませぬ。。
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています