2−2 Accessの無い環境でAccessのDBを利用

 2−1でAccessのデータベースをVisual Basic 2008 Express Editionから利用するやり方を書いたが、Accessが無い場合はどうしたら良いのであろうか?現在 一般的に販売されているパソコンにはEXCELやWORDが組み込まれている事が比較的多いが、Accessのようなソフトは一般的では無い。(企業では使われている場合も多いが)。そんなパソコンの場合にどうしようか?
 色々な考え方はあるだろう。それこそ、全てVisual Basic 2008 Express Editionから書くとか、データベースエクスプローラーから書き込むとか、SQL Server Compact3.5をメインで使うとか・・・。でも、私としてはあのAccessの使い勝手の良さは捨て難い。(けど、これが高いんだよね)。「それなら」と、考えた私なりの方法は、Visual Basic 2008 Express EditionでAccessのデータベースだけ作っておいて、データベースとして利用する。テーブルの作成や中身の確認はOpenOfficeOrgのBASEで行う事。これである。

 単純にデータベースエクスプローラーでデータベースを作成してしまえば良いのだが画面のイメージ、ここで勉強のため(簡単にデータベースを作るため)プログラムを書く事にした。画面のイメージは右のようにした。それぞれのコントロールの名前は以下のようにしている。
フォーム−frmAccdb:テキスト−”AccessのDBを作成”
ラベル1−LblSet:テキスト−”データベースの位置指定”
テキスト−TxtDbset:テキスト−””
ボタン1−btnSerch:テキスト−”参照”
ラベル2−lblMessage:テキスト−””
ボタン2−btnEnd:テキスト−”データベース作成”
ボタン3−btnOwari:テキスト−”終了”
この他、ファイルの位置を指定する為のSaveFileDialog1、タイマー処理用にTimer1、Timer2を画面に配置した。なお、アイコンはパソコン内を検索したら 図のようなアイコンが見つかったので これを流用させてもらっている。
 実際の作成は以下の環境で行った。(あまり問題ないとは思ったのだが、Accessを入れていないパソコンでテストしたかった為)
 現在使用していない古いノートパソコンをインストールCDで初期化し、Windows98SEで立ち上げる。このPCをWindows2000にアップデート。SP4を当て、次にIE6のSP1を当てる。ウイルスの対応ソフトを入れてから、EXCEL2003をインストールしSP2を当てる。このPCに対し、OpenOfficeOrg2.4のWriterとBaseをインストール。プリンタドライバのみインストールしてから、最後にVisual Basic 2005 Express Editionをインストール。(2008はXPのSP2以降でないと動かせない為。なお、2005のユーザー認証はサーバーに繋がらず行えなかった。もっとも、テスト用い、後で再び初期化する予定)。ソリューションエクスプローラーの画面
 このようにして、他のソフトが殆ど無い環境で動作確認をしているので、他のマシンでも問題なく動かせる筈である。

  メイン部分のAccessデータベースを作成する部分がどうもうまく動いてくれず、仕方が無いので以前VisualBasic6.0で作成したプログラムをアップグレードして利用した為、これらの参照設定が必要となった。設定は、まず上に示したように画面を作成し、ソリューションエクスプローラの画面の参照設定でMicrosoftDAO 3.6 及び、Microsoft.Visual.Basic.Compatibility.dllを追加した。
 (このファイルは私の環境の場合には、C:\Windows\Microsoft.net\Framework\V2.0.50727配下に存在していた。なお、通常は「参照設定」は表示されてはいないので、「全て表示」に表示を切り替えて設定する。
右の図の2番目のアイコンを使用)。
 この部分は、各自で調査して直してみると良いと思う。なお、標準モジュールとして、mjlApg.vbを追加している。(右画面の一番下の部分)。これは、DAOを用いたプログラムの名前空間の参照に使われるもののようで、アップグレードしたソースに自動的に追加されていたものと同じ内容を書いた。そのソフトは以下の通り。

Module mjlApg
   Friend DAODBEngine_definst As New DAO.DBEngine
End Module

 ほんの一行しかないのだが、この設定を登録しないとプログラムを入力する事が出来なかった。後は簡単に書いてみたので、参照してみてください。

Public Class frmAccdb

Dim Jmsg As String 'メッセージ
Dim MyStream As String '作成MDB名称
Dim Fumflg As Boolean 'ファイルの上書き確認

Sub Msgset(ByVal Wkmsg As String)
    Me.lblMessage.Text = Wkmsg '引き渡されたメッセージをラベルコントロールに表示する
    System.Windows.Forms.Application.DoEvents()
End Sub

Private Sub btnOwari_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOwari.Click
    End
End Sub

Private Sub btnSerch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSerch.Click
    Dim SaveFileDialog1 As New SaveFileDialog
    Dim Jfln As Long 'ファイルの有無確認用
    '
    SaveFileDialog1.Filter = "Accessファイル (*.mdb)|*.mdb|全てのファイル (*.*)|*.*" 'フィルターを指定
    SaveFileDialog1.RestoreDirectory = True '現在のデレクトリを復元する
    MyStream = ""
    '
    If Not SaveFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.Cancel Then 'キャンセルボタン以外を押した場合
        MyStream = SaveFileDialog1.FileName 'ファイル名を取得
        Try
            Jfln = FileLen(MyStream)
            Fumflg = True 'ファイルの存在有無を指定
        Catch
            Fumflg = False
        End Try

        Jmsg = "指定されたデータベースを作成します。確認後【データベース作成】ボタンを押して下さい。"
        Call Msgset(Jmsg)
    Else
        Jmsg = "作成するデータベースを指定して下さい。"
        Call Msgset(Jmsg)
    End If
    TxtDbset.Text = MyStream 'テキストボックスに指定ファイルを表示
End Sub

Private Sub frmAccdb_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Me.Timer1.Enabled = True
End Sub

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Me.Timer1.Enabled = False
    'メッセージを表示する。
    Jmsg = "作成するデータベースを指定して 【データベース作成】ボタンを押して下さい。"
    Call Msgset(Jmsg)
End Sub

Private Sub Timer2_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    Me.Timer2.Enabled = False
    '
    End
End Sub

Private Sub btnEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnd.Click
    Dim Isuu As Integer = 0

    If TxtDbset.Text = "" Then 'ファイル未指定の場合
        Jmsg = "始めに作成するデータベースを指定してから この処理を指定して下さい。"
        Call Msgset(Jmsg)
    Else
        btnOwari.Enabled = False

        Isuu = Ctdb() 'データベース作成処理を起動します。
        Select Case Isuu
            Case 1
                Jmsg = "データベース作成終了しました。暫く待つと処理を終了しますのでお待ち下さい。"
                Call Msgset(Jmsg)
                Me.Timer2.Enabled = True
            Case 2
                Jmsg = "データベース作成中エラー。確認し処理を選択して下さい。"
                Call Msgset(Jmsg)
                btnOwari.Enabled = True
            Case Else
                Jmsg = "指定データベースが作成出来ませんでした。確認し処理を選択して下さい。"
                Call Msgset(Jmsg)
                btnOwari.Enabled = True
        End Select
    End If
End Sub

Function Ctdb() As Integer
    Dim WrkDefault As DAO.Workspace
    Dim dbsNew As DAO.Database
    '
    Ctdb = 99
    '一旦対象のMDBを削除
    Try
        If Fumflg = True Then
            Kill(MyStream)
        End If
    Catch
    End Try
    'ここからDBを作成する
    Try
        '既存のワークスペースを取得
        WrkDefault = DAODBEngine_definst.Workspaces(0)
        dbsNew = wrkDefault.CreateDatabase(MyStream, DAO.LanguageConstants.dbLangJapanese, & _             DAO.DatabaseTypeEnum.dbVersion40)
        dbsNew.Close()
        '
        Ctdb = 1
    Catch
        Ctdb = 2
    End Try
End Function

End Class

 ソース自体もそれほど長いわけではないので、別段解説も必要無いだろう。ただ、データベースの作成の部分に書かれているdbVersion40の部分は注意が必要で、この例ではAccess2003用のデータベースが作れた。ここをdbVersion30とすると何故かAccess95形式で作られてしまう。通常はdbVersion40で良いだろう。
(”データベース作成”のボタン名称がbtnEndというのは、どうかと思うが、許して下さい。こちらのミスで名称を間違いました。あと、設定としてSaveFileDialog1のフイルターに”Accessファイル(*.mdb)|*.mdb|すべてのファイル(*.*)|*.*”を指定している。さらに、timer2のインターバルを500に指定している。)。

 続いて、この出来たデータベースをOpenOfficeOrgのBaseにて開ける事を確認。次に、このデータベースに対しで Baseからテーブルを登録し、内容も入れてみた。(入れた内容は2−1の通り。)
 最後に、Excel2003を起動し 作成したデータベースを 「データ−外部データの取り込み−データの取り込み」を利用して画面上に読み込み、内容を確認。正しく読むことも出来た。(なお、Excel2007の場合は、直接Accessのテーブルを読み込む事も可能なので、確認はより簡単に出来るだろう)。
 簡単に出来て、メンテナンスもしやすいので使用してみてはいかがだろうか?OpenOfficeOrgのBaseでは、Accessのデータベースに接続は出来ても、新規に作成する事が出来ないので 役に立つと思う。(「それほどまでして、AccessのDBを使う必要があるのか?」と言われればそれまでですが。)

「市民の目」トップページへ戻る