C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[13]: ACCDB操作について


(過去ログ 46 を表示中)

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■24713 / inTopicNo.1)  ACCDB操作について
  
□投稿者/ オガシン (78回)-(2008/09/08(Mon) 16:55:05)

分類:[Microsoft Office 全般] 

お世話になっております。オガシンです。

[環境]
ACCESS2007(ACCDB)
VB2008
WindowsVista or XP

現在MDBについて調査を行っているのですが不明点がいくつかでてきました。

1:ACCDB1とACCDB2でテーブルリンクをした場合ファイル名が同じ他のACCDBに
  置き換えた場合テーブルリンクはもう一度作成しないといけませんか?

2:VB側で動的にリンクを作成した場合、ACCESS2007のランタイムをインストール
  すれば動的リンクのプログラムは実行可能ですか?

以上2点ですが、なにかアドバイス頂ければと思います。
よろしくおねがいしますm(__)m
引用返信 編集キー/
■24749 / inTopicNo.2)  Re[1]: ACCDB操作について
□投稿者/ 魔界の仮面弁士 (838回)-(2008/09/09(Tue) 10:55:05)
No24713 (オガシン さん) に返信
> ACCESS2007(ACCDB)
> 現在MDBについて調査を行っているのですが不明点がいくつかでてきました。

*.mdb (jet 4.0 形式)なのですか? *.accdb (ACE 形式)なのですか?


> 1:ACCDB1とACCDB2でテーブルリンクをした場合ファイル名が同じ他のACCDBに
>   置き換えた場合テーブルリンクはもう一度作成しないといけませんか?
リンク先のパスが変更された場合は、[リンク テーブル マネージャ]での手動修正、
もしくは TableDef.Connect プロパティ(あるいは ADOX.Table オブジェクト)による
コードからの書き換えを行ってください。

パスは同じで、テーブル定義が異なる場合は、リンクテーブルの再作成が必要です。

パスは同じで、テーブル定義も同じ場合は、リンク先ファイルを置き換えても問題ありません。


> 2:VB側で動的にリンクを作成した場合、ACCESS2007のランタイムをインストール
>   すれば動的リンクのプログラムは実行可能ですか?
下記 KB を見る限りでは、可能であるように思えます。(未検証)

http://support.microsoft.com/kb/291264/en-us
http://support.microsoft.com/kb/291264/ja-jp
引用返信 編集キー/
■24752 / inTopicNo.3)  Re[2]: ACCDB操作について
□投稿者/ オガシン (79回)-(2008/09/09(Tue) 11:16:47)
No24749 (魔界の仮面弁士 さん) に返信
返信ありがとうございます。非常に参考になります。

> *.mdb (jet 4.0 形式)なのですか? *.accdb (ACE 形式)なのですか?
*.accdb (ACE 形式)を想定しています。
*.mdb(旧)を*.accdb(新)に変更するという要件があがっており、その際に構成を変えたいな〜と
言われています。

> リンク先のパスが変更された場合は、[リンク テーブル マネージャ]での手動修正、
> もしくは TableDef.Connect プロパティ(あるいは ADOX.Table オブジェクト)による
> コードからの書き換えを行ってください。
> パスは同じで、テーブル定義が異なる場合は、リンクテーブルの再作成が必要です。
> パスは同じで、テーブル定義も同じ場合は、リンク先ファイルを置き換えても問題ありません。
ふむふむ、この辺の情報がなかなか見つからずに苦戦していました。
ありがとうございます。

> 下記 KB を見る限りでは、可能であるように思えます。(未検証)
>
> http://support.microsoft.com/kb/291264/en-us
> http://support.microsoft.com/kb/291264/ja-jp
リンクテーブル作成プログラムはACCESSをインストールしていなくても操作可能な感じですね。
上記情報を元にもう少し調査してみます。


引用返信 編集キー/
■24790 / inTopicNo.4)  Re[3]: ACCDB操作について
□投稿者/ オガシン (84回)-(2008/09/09(Tue) 20:05:20)
MDBを操作する処理で行き詰っています。
(ACCDBを作る環境がなく現在はMDB(ACCESS2003)で動作検証しています)

db3.mdb
 →MainTable
db4.mdb
 →ComTable
を作成しました。

下記コンソールアプリでdb3.mdbにdb4.mdbのComTableをリンクさせたいのですが
Connectの部分で落ちてしまいます。
【無効な処理です】としかメッセージがでません。
絶対パス指定が必要とのことで絶対パスにしていますが
他に原因が思いつきません。

Sub Main()
    Dim en As dao.DBEngine
    Dim a As dao.Database
    Dim tbl As dao.TableDef
    Try
        en = New dao.DBEngine()
        a = en.OpenDatabase("C:\db3.mdb")

        tbl = a.TableDefs("MainTable")
        tbl.Connect = ";DATABASE=C:\db4.mdb"  <-ここで落ちる
        tbl.SourceTableName = "ComTable"
        tbl.RefreshLink()
    Catch ex As Exception
        Console.WriteLine(ex.Message)
    End Try
End Sub

よろしくお願いします。

引用返信 編集キー/
■24791 / inTopicNo.5)  Re[4]: ACCDB操作について
□投稿者/ 魔界の仮面弁士 (841回)-(2008/09/09(Tue) 20:48:00)
No24790 (オガシン さん) に返信
> MDBを操作する処理で行き詰っています。
DAO を使うのであれば、Marshal.ReleaseComObject による解放が必要になるかと。
それから、Close 処理も忘れずに。

>(ACCDBを作る環境がなく現在はMDB(ACCESS2003)で動作検証しています)
早めに合わせた方が良いですよ。DAO.dll (DAO 3.6 の PIA) と
Microsoft.Office.Interop.Access.Dao.dll (DAO 12.0 の PIA) では
名前空間のパスなどが、微妙に異なっていますから。

> tbl = a.TableDefs("MainTable")
そうではなく、一度、TableDefs コレクションへの参照を変数にとり、
そこから MainTable への TableDef オブジェクトを得るようにしてください。


> Connectの部分で落ちてしまいます。
MainTable が、リンクテーブルになっていることを確認してください。
非リンクテーブルの場合、Connect プロパティにはアクセスできません。
引用返信 編集キー/
■24802 / inTopicNo.6)  Re[5]: ACCDB操作について
□投稿者/ オガシン (85回)-(2008/09/10(Wed) 09:35:50)
魔界の仮面弁士さん

返信ありがとうございます。
・・・やはり開放が必要でしたか。
プロセス見てもAccessがいなかったので大丈夫かなぁ
なんて甘い考えでした。

加えて処理の手順もめちゃくちゃですね^^;
アドバイスありがとうございます。

Access2007のRuntimeインストールしたのですが
なにが追加されているのか分からずDAOを使用していました。
VisualStudioからMicrosoft.Office.Interop.Access.Dao.dllがあったと
思いますのでそちらを参照するようにして修正してみたいと思います。
引用返信 編集キー/
■24816 / inTopicNo.7)  Re[6]: ACCDB操作について
□投稿者/ こあら (21回)-(2008/09/10(Wed) 11:30:16)
VBScriptではこんな感じでした。

■用意するもの
    db1.accdb --- 空っぽ
    db2.accdb --- srcテーブル
    db3.accdb --- db2.accdbのコピー

■db1.accdbにlinktblリンクテーブルを作成する
    Set dbe = CreateObject("DAO.DBEngine.120")
    Set db = dbe.Workspaces(0).OpenDatabase("C:\db1.accdb", False)
    Set tbl = db.CreateTableDef("linktbl")
    tbl.Connect = ";DATABASE=C:\db2.accdb;"
    tbl.SourceTableName = "src"
    db.TableDefs.Append tbl
    db.Close

■db1.accdbのlnktblリンクテーブルのリンク先を変更する
    Set dbe = CreateObject("DAO.DBEngine.120")
    Set db = dbe.Workspaces(0).OpenDatabase("C:\db1.accdb", False)
    set tbl = db.TableDefs("linktbl")
    tbl.Connect = ";DATABASE=C:\db3.accdb;"
    tbl.RefreshLink
    db.Close

引用返信 編集キー/
■24821 / inTopicNo.8)  Re[7]: ACCDB操作について
□投稿者/ オガシン (86回)-(2008/09/10(Wed) 12:52:53)
こあらさん

返信ありがとうございます。
掲示していただいたVBScriptのソースコードを参考にさせていただきます。

現在、コーディング&検証中なのででき次第報告できればと思っています。
#他の仕事も頼まれれてなかなか着手できていませんがOrz
引用返信 編集キー/
■24837 / inTopicNo.9)  Re[8]: ACCDB操作について
□投稿者/ オガシン (88回)-(2008/09/10(Wed) 18:07:20)
目的の処理が実行できました。
指摘して頂いたClose、開放も行っています。
アドバイスしていただいた皆様ありがとうございますm(__)m

Dim engin As DBEngine
Dim db As Database
Dim tbldf As TableDef
Dim DaoStack As New Stack(Of Object)

Try
    engin = New DBEngine()
    DaoStack.Push(engin)

    db = engin.OpenDatabase("C:\db3.mdb")
    DaoStack.Push(db)

    tbldf = db.CreateTableDef("ComTable")
    DaoStack.Push(tbldf)

    tbldf.Connect = ";DATABASE=C:\db4.mdb"
    tbldf.SourceTableName = "ComTable"

    db.TableDefs.Append(tbldf)
    db.Close()

    For Each obj As Object In DaoStack
        Dim cnt As Integer
        Do
            cnt = ReleaseComObject(obj)
        Loop While cnt > 0
    Next

    MessageBox.Show("Link OK")

Catch ex As Exception
    MessageBox.Show(ex.Message)
End Try

解決済み
引用返信 編集キー/
■24838 / inTopicNo.10)  Re[9]: ACCDB操作について
□投稿者/ 魔界の仮面弁士 (844回)-(2008/09/10(Wed) 19:52:38)
# 上位オブジェクト(DAO.Database 等)を Close する前に、
# 下位オブジェクト(DAO.TableDef 等)を RelaseComObject しておいた方が
# 良い気がするけれど、そこまで気にする必要は無いのかな…。


No24837 (オガシン さん) に返信
> 指摘して頂いたClose、開放も行っています。
Finally を使いましょう。途中でエラーが発生した場合のために。
(ファイルを開けなかった場合、ComTable が既に存在していた場合など)

> Dim engin As DBEngine
engine ではなく?

> db.TableDefs.Append(tbldf)
TableDefs の解放処理も含めておいた方が良いかも知れません。(未検証)

> Do
> cnt = ReleaseComObject(obj)
> Loop While cnt > 0
スタックの積み方によっては、このような解放処理は乱暴すぎる気がしますが、
もし行うなら、ループよりも FinalReleaseComObject の方がスッキリ書けるかと。
解決済み
引用返信 編集キー/
■24839 / inTopicNo.11)  Re[10]: ACCDB操作について
□投稿者/ オガシン (89回)-(2008/09/10(Wed) 20:15:01)
魔界の仮面弁士さん
返信ありがとうございます。

># 上位オブジェクト(DAO.Database 等)を Close する前に、
># 下位オブジェクト(DAO.TableDef 等)を RelaseComObject しておいた方が
># 良い気がするけれど、そこまで気にする必要は無いのかな…。
これを意識したつもりでStackオブジェクトを使用しました。
Finallyブロックで処理をするのが本来実装すべき最良の場所だと思います。

指摘して頂いたとおり乱暴で考慮漏れの部分があるかと思いますが、
mdbにリンクテーブルを追加できるかの調査をしていて組んだアプリなので
若干"使ってみたかった"ものがあります(Stackクラスとか。。)

>engine ではなくて?
すみません単純にスペルみすです(汗

多くのアドバイスありがとうございます。実際に作るときは
指摘していただいた内容を考慮していきたいと思いますm(__)m



解決済み
引用返信 編集キー/
■24840 / inTopicNo.12)  Re[10]: ACCDB操作について
□投稿者/ 渋木宏明(ひどり) (876回)-(2008/09/10(Wed) 20:31:08)
渋木宏明(ひどり) さんの Web サイト
> # 下位オブジェクト(DAO.TableDef 等)を RelaseComObject しておいた方が
> # 良い気がするけれど、そこまで気にする必要は無いのかな…。

不具合を生じるかどうかはオブジェクトの実装次第で、「不要になったらすぐに解放する」のが原則です。

>指摘して頂いたとおり乱暴で考慮漏れの部分があるかと思いますが、

ReleaseComObject() で例外が発生する可能性もあり得るので、try ~ finally のスコープも細かく切るのが適切です。

引用返信 編集キー/
■24841 / inTopicNo.13)  Re[11]: ACCDB操作について
□投稿者/ オガシン (90回)-(2008/09/10(Wed) 20:39:40)
No24840 (渋木宏明(ひどり) さん) に返信
>># 下位オブジェクト(DAO.TableDef 等)を RelaseComObject しておいた方が
>># 良い気がするけれど、そこまで気にする必要は無いのかな…。
>
> 不具合を生じるかどうかはオブジェクトの実装次第で、「不要になったらすぐに解放する」のが原則です。
>
> >指摘して頂いたとおり乱暴で考慮漏れの部分があるかと思いますが、
>
> ReleaseComObject() で例外が発生する可能性もあり得るので、try ~ finally のスコープも細かく切るのが適切です。
>
返信ありがとうございます。
じゃんぬさんのサイトを見て開放が保障されるようなつくりにしていきたいと思います。

>不要になったらすぐに解放する
忘れないようにします!
解決済み
引用返信 編集キー/
■24842 / inTopicNo.14)  Re[12]: ACCDB操作について
□投稿者/ 渋木宏明(ひどり) (877回)-(2008/09/10(Wed) 20:54:22)
渋木宏明(ひどり) さんの Web サイト
> じゃんぬさんのサイトを見て開放が保障されるようなつくりにしていきたいと思います。

開け放たずに解き放ってください。

引用返信 編集キー/
■24857 / inTopicNo.15)  Re[13]: ACCDB操作について
□投稿者/ オガシン (91回)-(2008/09/11(Thu) 11:33:12)
No24842 (渋木宏明(ひどり) さん) に返信
>>じゃんぬさんのサイトを見て開放が保障されるようなつくりにしていきたいと思います。
>
> 開け放たずに解き放ってください。
>

了解です。【解放】します。
誤字多くてはずかしや。。。(汗)
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -