「eText2000」のソース                  

自作のデータベースソフト「eText2000」の中からいくつかソースを公開してみたいと思います。
環境はVB6,SP3 ( 現在はSP4 ) です。
「eText2000」はWindows2000 , Windows Me用にWindowsインストーラでインストールします。
接続する「DSB.mdb」はAccess2000形式のmdbです。

  1. ADOでデータベース「DSB.mdb」に接続
  2. DAOでデータベース「DSB.mdb」に接続
  3. IEに接続
  4. バックアップ
  5. mdbの最適化
  6. ADOとDAO,DAO3.51とDAO3.6

ADOでデータベース「DSB.mdb」に接続

◆ 標準モジュール
Option Explicit

'DSBのパス名(ファイル名含む)
Public Function DBPath() As String
DBPath = App.Path & "\DSB.mdb"
End Function
--------------------------------------------------------------------------------
'データベースDSB.mdbに接続するための文字列
Public Function strcn() As String
strcn = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & DBPath
End Function
--------------------------------------------------------------------------------
◆ Formモジュール
Option Explicit
Private cn As ADODB.Connection
Private rs, rs1, rs2 As ADODB.Recordset
--------------------------------------------------------------------------------
Private Sub Form_Load()
' データベースに接続
' ConnectionStringには標準モジュールのPublic Function strcnを使用

Set cn = New ADODB.Connection
cn.ConnectionString = strcn
'以下の1行がないとデータの更新はできない。しかし、データ表示に莫大な時間がかかる。
'よってデータ更新はDAOを使うことにする。2000/3/19
'cn.CursorLocation = adUseClient 'この行がないとデータの更新はできない ( 違ってるかな ? )

cn.Open

' レコードセットを取得
Dim strSQL As String  ' "Q_Master"のSQL文
strSQL = "SELECT 番号, 入力日,ジャンル,キーワード1, キーワード2, 掲載図書等, " _
& "掲載図書名フリガナ, 参照ページ等, 記事, 詳細図版, パソコン分類, " _
& "レポート印刷済み, IIf([詳細図版] Is Not Null,-1,0) AS 図版の有無, URL " _
& "FROM T_Master ORDER BY T_Master.番号;"
Set rs = New ADODB.Recordset
rs.Open strSQL, cn, adOpenStatic 'Q_Masterでないと図版の有無が使えない
'rs.Open "T_Master", cn, adOpenStatic

' ADOデータコントロール(T_Master)にレコードセットの内容を表示
Set T_Master.Recordset = rs
T_Master.Mode = adModeRead
T_Master.Refresh

' ADOデータコントロール(Data1)に接続 DataCombo1と連結
Dim strSQL1 As String
strSQL1 = "select ジャンル,ジャンル from T_ジャンル order by ジャンル"

Set rs1 = New ADODB.Recordset
rs1.Open strSQL1, cn, adOpenStatic
Set Data1.Recordset = rs1

' ADOデータコントロール(Data2)に接続 DataCombo2と連結
Dim strSQL2 As String
strSQL2 = "select パソコン分類,パソコン分類 from T_パソコン分類 order by パソコン分類"

Set rs2 = New ADODB.Recordset
rs2.Open strSQL2, cn, adOpenStatic
Set Data2.Recordset = rs2

Form1.Visible = False

End Sub
--------------------------------------------------------------------------------

先頭に戻る

DAOでデータベース「DSB.mdb」に接続

OLEコントロールはADOデータコントロールでは連結できません。
よってDAOで「DSB.mdb」に接続します。

■VB関係のサイトに
Dataコントロールでは、Access2000で作成したデータベースファイルを認識することはできません。
詳しくは、以下を参照してください。
http://www.microsoft.com/japan/support/kb/articles/J049/7/13.htm
という記事が出ていました。
上記のマイクロソフトのサイトにも
Data コントロールは、内部で DAO 3.5 Object Library を使用していますので、Jet 4.0 形式のファイルは扱えません。
と出ております。
実は私もこの問題で悩んでおりましたが、以下のようにして接続しております。
注 ! SP4ではこの問題は解消されたようです。下記参照。
--------------------------------------------------------------------------------
◆ Formモジュール
Private Sub Form_Load() 'OLEコントロールを使用しているためDAOアクセス
Dim ws As Workspace
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim strSQL As String
strSQL = "SELECT 番号, 入力日,ジャンル,キーワード1, キーワード2, 掲載図書等, " _
& "掲載図書名フリガナ, 参照ページ等, 記事, 詳細図版, パソコン分類, " _
& "レポート印刷済み, IIf([詳細図版] Is Not Null,-1,0) AS 図版の有無, URL " _
& "FROM T_Master ORDER BY T_Master.番号;"

Set ws = DBEngine.Workspaces(0)
Set db = ws.OpenDatabase(DBPath)

Set rs = db.OpenRecordset(strSQL)

Set rs1 = db.OpenRecordset("select ジャンル,ジャンル from T_ジャンル order by ジャンル")
Set rs2 = db.OpenRecordset("select パソコン分類,パソコン分類 from T_パソコン分類 order by パソコン分類")

Set T_Master.Recordset = rs 'Dataコントロール(T_Master)に接続
Set Data1.Recordset = rs1 'Dataコントロール(Data1)に接続 DBCombo1に連結
Set Data2.Recordset = rs2 'Dataコントロール(Data2)に接続 DBCombo2に連結

End Sub

--------------------------------------------------------------------------------
 データコントロールはDAOをGUI化して視覚的に操作できるコントロールですね。
普通データコントロールを使ってmdbに接続するには、プロパティを設定して、mdbに接続すると思いますが、私は、データコントロールのDatabaseNameプロパティとか、RecordSourceプロパティには何も入れてません。接続コードでDAOを介してmdbに接続し、レコードセットを取得して、それをデータコントロールに与えてやり、各TextBoxのDataSourceはデータコントロールから取得しているわけです。DataFieldプロパティにはmdbのテーブルのフィールド名を入れてます。そしたらデータコントロールでAccess2000形式のmdbを操作できました。というか、データコントロールでレコードの移動を行ったりしてるぐらいですけど・・・

 それとデータコントロールのプロパティに設定してmdbに接続しても時間がかかってたような記憶があります・・・

 DATAコントロールとDBGridを連結させて、グリッドにデータを表示させてみましたが、これもうまくいきました。4/27 etTomio

2000/6/27に発表されたVisual Studio 6.0 Service Pack 4では
Dataコントロールでは、Access2000で作成したデータベースファイルを認識することはできないという問題は解消されたようです。

Visual Studio 6.0 Service Pack 4 
http://www.asia.microsoft.com/japan/developer/vstudio/download/sp/vs6sp.htm
5.2.2.1. Service Pack 4 で修正された問題
http://www.asia.microsoft.com/japan/developer/vstudio/download/sp/vs6fixes.htm#VisualBasic
コントロールに関する次の問題が修正されました。

・J053395: Access 2000 データベースのバインドを試みると、データ (Data) コントロールによって "データ ベース形式 <ファイル名>.mdb を認識できません。" というエラーが報告されます。 

先頭に戻る


IEに接続

私のHPに接続します。
◆ Formモジュール
Option Explicit
'インターネットスタイルのハイパーリンクを作成する
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Private Const SW_SHOWNORMAL = 1
--------------------------------------------------------------------------------
Private Sub etTomio_Open_Click()
Dim IRet As Long
Dim sText As String
sText = "http://www.urban.ne.jp/home/ettomio/"
IRet = ShellExecute(hWnd, "open", sText, vbNull, vbNull, SW_SHOWNORMAL)
If IRet >= 0 And IRet <= 32 Then
MsgBox "IE に接続できません。"
End If
End Sub
--------------------------------------------------------------------------------

先頭に戻る

バックアップ

「DSB.mdb」のバックアップファイルを作成します。
◆ Formモジュール
Private Sub backup()
Dim ret As Integer
Dim strTitle As String
strTitle = " バックアップ "
Beep
ret = MsgBox("「バックアップダイアログ」で保存する場所を選んでください。" & Chr(13) & _
"次に「ファイル名」にバックアップするファイル名を書いてください。" & Chr(13) & _
"拡張子 mdb,mde などは書かないでください。" & Chr(13) & _
"よろしいですか ?", vbYesNo + vbQuestion + vbDefaultButton1, strTitle)
If ret = vbNo Then
Exit Sub
Else
End If

Dim Fname As String
Dim strInput As String, strOutput As String

'[バックアップ]ダイアログの表示
On Error GoTo CancelError
With CommonDialog3
.DialogTitle = " バックアップ"
.CancelError = True
.ShowSave
Fname = .FileName & ".mdb"
'Fname = .FileName & ".mde"
End With

strInput = (DBPath)
strOutput = (Fname)
Screen.MousePointer = vbHourglass
FileCopy strInput, strOutput
Screen.MousePointer = vbDefault
MsgBox (strInput & " は " & strOutput & " としてバックアップされました。")

CancelError:
'[キャンセル]ボタンをクリックしたときの処理(何もしない)
Screen.MousePointer = vbDefault
Exit Sub

End Sub

先頭に戻る

mdbの最適化

「DSB.mdb」の最適化 最適化はDAO接続でないとできない
◆ Formモジュール
Private Sub Compact1_dao() 'DSB.mdbの最適化 2000/3/5
On Error GoTo OKError

Dim ws As Workspace
Dim db As DAO.Database
Set ws = DBEngine.Workspaces(0)

Dim strInput As String, strOutput As String

strInput = (DBPath)

strOutput = (DBPath1)
Screen.MousePointer = vbHourglass
DBEngine.CompactDatabase strInput, strOutput
Screen.MousePointer = vbDefault
MsgBox (strInput & " は " & strOutput & " として最適化され保存されました。")

Dim ret As Integer
ret = MsgBox("続いて「DSB1.mdb」を元の名前「DSB.mdb」戻しますか ?", vbYesNo + vbQuestion)
If ret = vbYes Then
Kill strInput
Name strOutput As DBPath
MsgBox (strInput & " の最適化が完了しました。")
End If

On Error GoTo 0

ws.Close

Exit Sub

OKError:
Screen.MousePointer = vbDefault
If Err <> 32755 Then MsgBox Err.Description
Exit Sub
End Sub

先頭に戻る

ADOとDAO,DAO3.51とDAO3.6

 新規にデータ・アクセス・アプリケーションを開発するならADOを使った方が良いとどの雑誌にも書かれているし、MicrosoftもADOを推奨しています。
 でも、数ヶ月前のある雑誌の記事の言葉を借りると、DAOは十分に枯れていて、その分熟成されているといった意味の解説が載っていました。
 1昨年の雑誌から引用してADOデータコントロールとの連結が出来ないコントロールを書きます。
OLEコンテナ、DBグリッド、フレキシブル・グリッド・・・
 ADOで出来ない機能
MDBの作成、MDBの最適化、修復、パスワードの設定・変更、クエリーの保存・・・

 それと私自身気になる事は、ADOを使ってデータベース接続のアプリを作成して、ディストリビューションウィザードでセットアップディスクを作成すると膨大なファイル容量になるでしょ ? 
 VS Installerを使ってWindows2000用に作るなら別ですけど・・・

 「eText2000」ではDBグリッドは使わず、データグリッドを使っています。「eText Win9X」ではDBグリッドを使っているのですが、VB6を入れると、標準ではDBGRIDは入りませんので、
DBGRID32.OCX,DBGRID32.DEPをVB6のCDのCommon\Tools\Vb\ControlsからSystemにコピー(Windows2000はsystem32)、
同じ場所にあるDBGRID.REGでレジストリに登録。
DBGRDJP.DLLはVB6のCDのCommon\Tools\Vb\Cabinets\DbgrdjpからSystemにコピーしています。
 参照設定で、「eText Win9X」ではAccess97形式のmdbに接続しているので、Microsoft DAO 3.51 Object Libraryにチェック、「eText2000」ではAccess2000形式のmdbに接続しているので、Microsoft DAO 3.6 Object Libraryにチェックしています。
 先程、Access97形式のmdbに接続している方も、Microsoft DAO 3.6 Object Libraryにチェックしてみましたが、ちゃんと動作しているようで下位互換性があるようです。
 etTomio 4/15

先頭に戻る

Copyright (C) 2000  etTomio All rights reserved.
更新日 : 2001/01/19 .