コミュニティでの活動の履歴として、自身(Orator/魔界の仮面弁士)が掲示板・Mailing List・Newsgroup等へ発言した内容の中で、再利用できそうな物を拾い出して、掲載しています。

« .NET | Main | Oracle »
Access2007 へのバージョンアップ作業 / 2008年09月18日(木)

MDB ファイルを操作する VB6 製プログラムを、Access 2007 の accdb 形式に対応させたいという質問があったので、その時にまとめた資料です。

各原典へのリンクも貼りたかったのですが、Access の開発者向けヘルプには記述があっても、Web 上には記載されているところが見当たらなかったので、リンクを断念…。


[09/18/2008]Programming Library(VB掲示板)

  • 《Access の UI を併用する場合》

    1. データベース ウィンドウが無くなりました。代わりに、ナビゲーション ウィンドウが採用されています。操作感が異なるので、ユーザー向けにマニュアル等を作成していた場合、その内容を見直す必要があるかと思います。
    2. ご存知の通り、Office のツールバー(CommandBar)が、リボンに変更されました。CommandBar とはバーのサイズが異なるため、Access 側のフォーム等を用いていた場合、利用可能な画面領域に差が生じるため、画面デザインの見直しが必要になる可能性があります。
    3. メニュー項目が変更されているため、SendKeys によるメニュー制御は見直しが必要です。
    4. DoCmd.DoMenuItem メソッドへの変更はありません。従来の acMenuVer70 等のコードはそのまま利用できます。ただし、2007 のメニューを DoMenuItem で操作する事はできません。
  • 《DAO の場合》

    1. 参照設定するライブラリが、DAO360.DLL から ACEDAO.DLL に変更になります。
    2. 新機能サポートのため、ComplexType/Field2/Recordset2 という型が追加されました。
    3. ODBCDirect ワークスペースがサポートされなくなりました。この機能を用いたコードは、RDO 2.0 や ADO を用いたコードに置き換える必要があります。
    4. Jet ワークスペースからの ODBC 接続や ODBC パススルーは、引き続き利用可能です。
  • 《ADO の場合》

    1. ADO は、2.5 以上のバージョンを参照してください。
    2. 使用するOLE DB Provider の名前は、"Microsoft.JET.OLEDB.4.0" ではなく、"Microsoft.ACE.OLEDB.12.0" となります。
    3. 今のところ、JET 4.0 用 JetOLEDBConstants に替わる ACE 12 対応版の定数定義は見当たりませんが、MDAC 2.5 SDK / Windows DAC 6.0 SDK で定義される定数群は、accdb でも引き続き利用可能なようです。(なお、"Jet OLEDB:Engine Type" プロパティは *.accdb では「6」を返します)
  • 《文書化されていない開発者向け機能について》

    1. DAO の ISAMStats メソッドや、ADO の"Jet OLEDB:Reset ISAM Stats" プロパティは、引き続き利用可能です。
    2. ShowPlan の設定箇所が変更になっているようです。従来、JETSHOWPLAN=ON の設定箇所は HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\Debug のレジストリキーでしたが、2007 では HKLM\SOFTWARE\Microsoft\Office\12.0\Access\Access Connectivity Engine\Debug であるとの情報を海外サイトで幾つか発見できます。(ただし当方環境では、この設定を行っても、Access 2007 では showplan.out が出力されませんでした)
  • 《その他の変更点》

    1. 外部データのインポート機能として、Microsoft SharePoint がサポートされました。
    2. エクスポートできる形式が増えています。Excel/Access/Word の 2007 形式はもちろんのこと、PDF、XPS への出力も可能となっています。SharePoint への発行も可能です。
    3. エンジン設定の既定値を格納する場所が変更になっています。従来のバージョンでは、HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines のレジストリキーでしたが、2007 では HKLM\SOFTWARE\Microsoft\Office\12.0\Access\Access Connectivity Engine にて設定されることになります。

 
Posted at 18:51 / Jet/Access / この記事のURL
コメント(0)
[ACE 12.0] メモ型フィールドの動作について / 2007年06月05日(火)

以前、[Jet 4.0] メモ型フィールドの最大長について という記事の中で、メモ型フィールドの最大値について書きましたので、あらためて Access 2007 バージョンで再実験してみました。


最初に実験結果から書くと、『最大で、536,870,911 文字を登録できる』ようです。

これは VB6 から ADO 2.8 + Microsoft.ACE.OLEDB.12.0 を用いて、AppendChunk を繰り返し呼び出して実験した結果です。

あれ。Jet 4.0 の時は、536,870,910 文字という結果だったような…?


最大長までデータを追加した後、ADO 2.8 の「ADODB.Field オブジェクトの ActualSize プロパティ」や、DAO 12.0 の「DAO.Field2 オブジェクトの FieldSize プロパティ」で再測定してみると、 1,073,741,822 バイトという値を返してきました。

1文字を2バイトとして換算すると、確かに一致していますね。


ただし、この FieldSize で得た値を、GetChunk メソッドに対して使う際には注意が必要です。

ヘルプでは、引数に指定する値は「バイト数」と書かれていますが、実際には、メモ型フィールドに対しては「文字数」として働くようですので…。


Dim RS As DAO.Recordset2
Set RS = DB.OpenRecordset(TableName)
If Not RS.EOF Then
    Dim F As DAO.Field2
    Set F = RS.Fields(FieldName)

    '「1073741822」と返された
    Debug.Print F.FieldSize

    Dim v As Variant
    v = F.GetChunk(600000000, 100)
    '「0」と返された
    Debug.Print LenB(v)

    v = F.GetChunk(500000000, 100)
    '「200」と返された
    Debug.Print LenB(v)
End If
RS.Close

 
Posted at 19:46 / Jet/Access / この記事のURL
コメント(0)
[DAO]新バージョンの違いに関する考察 / 2007年03月17日(土)
ようやく Office 2007 を入れたので、今更ながらに Jet 関連を調査。
いつの間にか、DAOのバージョンが大幅に上がっている事に吃驚。


DAO 3.5 は、Access 97 で使われていて。
それ以降は、DAO 3.6 が Access 2000, 2002, 2003 と長らく使われていたのに。
それが Access 2007 では突然、DAO 12.0 となっている、と。

そもそも、Microsoft Jet (Joint-Engine Technology) Database Engine 自体が、その後方互換たる ACE (Access Database Engine) に変更されている様子。


とりあえず、表面的な部分だけ見れば、
 Set engine = CreateObject("DAO.DBEngine.35") 'JET 3.5x
 Set engine = CreateObject("DAO.DBEngine.36") 'JET 3.60
 Set engine = CreateObject("DAO.DBEngine.120") 'ACE 12.0
とか、
 Cn.Provider = "Microsoft.Jet.OLEDB.3.51" 'JET 3.5x
 Cn.Provider = "Microsoft.Jet.OLEDB.4.0" 'JET 3.60
 Cn.Provider = "Microsoft.ACE.OLEDB.12.0" 'ACE 12.0
とか、
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\3.5
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0
 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Access Connectivity Engine
という形で切り替えれば済むとは思うのだけれども、チューニング設定のためには、幾つか追調査の余地がありそう。


たとえば、レジストリにある Engines エントリ。

\Jet\4.0\Engines キーには、[Jet 2.x]、[Jet 3.x]、[Jet 4.0] のエントリが並んでいるのに、12.0 の方は、[Jet 2.x]、[Jet 3.x] のエントリが残っているのに、何故か [Jet 4.0] のエントリが用意されていない様子。([ACE] はあるのだけれども)

「もしや、ACE エントリが Jet 4.0 の役目を持っているのか?」とも一瞬思ったのだけれども、その既定値を見ると、実は Jet 4.0 のそれとは微妙に異なっていた(※)ので、実験を重ねないと何とも言い難いところ。

そうすると、DAO 12.0 で Jet 4.0 データベースを開くときの設定は、どこに書けばよいのだろう…。
まぁ、そういう時は DAO 3.6 を使い続ければ良いのだろうけれども。


具体的には、LV ページの再利用フラグ。JET 4.0 までは「オフ」がデフォルトだったのに、12.0 のデフォルトは「オン」にされている様子。

 
Posted at 18:37 / Jet/Access / この記事のURL
コメント(0)
[Jet]古い日付値を扱う場合の注意点 / 2006年12月03日(日)
table1
id date1 date2
1 1899/12/31 10:00:00 1899/12/31 20:00:00
2 1899/12/01 10:00:00 1899/12/01 20:00:00

上記のようなデータに対し、下記のクエリを発行してみます。

SELECT * FROM table1 WHERE date1 < date2

すると、id=1 はヒットするが、id=2 はヒットしないという、不都合のある状況になります。


これは、Jetの日付型の特性によるものです。

Jet の日付型は、「1899/12/30 00:00:00 からの経過日数」を、『倍精度浮動小数点型(Double)』で管理したものとなっています。

日付部の範囲は 100年1月1日〜9999年12月31日で、内部値の整数部は、 -657,434 〜 2,958,465 という範囲の値となります。

時刻部に関しては、たとえば 18:00:00 ならば、1日の 4分の3 として、0.750 という値をとります。06:00:00 なら、0.250 です。

そして、ここからが問題となる箇所なのですが…。

この時刻部というのは、内部値の絶対値に対する小数部として表されるため、負数となる範囲では、同一日の時刻判定に不都合が生じ、今回の例のような問題が発生します。

言葉で書くと分かりにくいので、表にしてみますと、1899/12/30 以上と未満とで、時刻部の方向が逆転している事がわかるかと思います。

+1.50……1899/12/31 12:00:00
+1.00……1899/12/31 00:00:00
+0.75……1899/12/30 18:00:00
+0.50……1899/12/30 12:00:00
+0.25……1899/12/30 06:00:00
0.00……1899/12/30 00:00:00
-0.25……(未使用領域)
-0.50……(未使用領域)
-0.75……(未使用領域)
-1.00……1899/12/29 00:00:00
-1.25……1899/12/29 06:00:00
-1.50……1899/12/29 12:00:00
-1.75……1899/12/29 18:00:00
-2.00……1899/12/28 00:00:00
-2.50……1899/12/28 12:00:00

もっとも、こんな古い日付値を(それも時刻部も含めた形で)保持する事は、稀だと思いますので、実運用上は、さほど支障は無いと思います。

とはいえ、この現象は、Jetのみならず、VBA/VB6/VBScript にも言える事なので、注意しておいた方が良いでしょうね。(VB.NETのDate型は問題なし)。


 
Posted at 02:43 / Jet/Access / この記事のURL
コメント(1)
Access97互換のMsgBox関数 / 2005年04月13日(水)

Access 97では、[ツール]-[起動時の設定]メニューにて、『アプリケーション タイトル』を指定する事ができます。

これを設定しておくと、それがMsgBox関数のタイトルを省略した時の初期値として反映されていました。

MsgBox "ABC@DEF@GHI", vbInformation

また、上記のように、"@"を2つ使うことで、本文部の表現が変化するという特徴もありました。

しかし、Access 2000以降ではこれらがサポートされません。

今回のコードは、Access 2000以降でもこれらの機能を使う方法です。


[04/13/2005]microsoft.public.jp.access

Public Function MsgBox(ByVal Prompt As String, Optional ByVal Buttons As VbMsgBoxStyle = vbOKOnly, Optional ByVal Title As Variant, Optional ByVal HelpFile As Variant, Optional ByVal Context As Variant) As VbMsgBoxResult
	Dim Params(2) As String
	Params(0) = """" & Replace(Prompt, """", """""") & """"
	Params(1) = CStr(Buttons)
	If Not IsMissing(Title) Then
		Params(2) = """" & Replace(Title, """", """""") & """"
		If Params(2) = """""" Then Params(2) = """ """
	End If
	If Not (IsMissing(HelpFile) Or IsMissing(Context)) Then
		Params(3) = """" & Replace(HelpFile, """", """""") & """"
		Params(4) = CStr(Context)
	End If
	Dim Expr As String
	Expr = Join(Params, ",")
	Do While Right(Expr, 1) = ","
		Expr = Left(Expr, Len(Expr) - 1)
	Loop
	Expr = "MsgBox(" & Expr & ")"
	On Error Resume Next
	MsgBox = Eval(Expr)
	If Err.Number <> 0 Then
		MsgBox = VBA.Interaction.MsgBox(Prompt, Buttons, Title, HelpFile, Context)
	End If
End Function

続きを読む...  
Posted at 22:25 / Jet/Access / この記事のURL
コメント(0)
[Jet 4.0] データベースパスワードの変更(3) / 2005年04月06日(水)

mdbファイルのデータベースパスワードを変更するには、Accessを用いる方法SQLを用いる方法JROを用いる方法DAOを用いる方法があります。

今回は、DAOを用いる方法について書いておきます。


  1. DAOを用いる方法

    DAOでデータベースパスワードを指定するには、DatabaseオブジェクトのNewPasswordメソッドを使います。

    DAOによる接続では、DAO360.DLLを参照設定して使う人が多いようですが、ここではあえて、参照設定せずに使う方法を提示しています。

    Dim DE As Object 'As DAO.DBEngine
    Dim WS As Object 'As DAO.Workspace
    Dim DB As Object 'As DAO.Database
    
    Dim TargetMDB As String
    Dim OldPassword As String, NewPassword As String
    TargetMDB = "C:\db1.mdb"
    OldPassword = "Square"
    NewPassword = "Enix"
    Set DE = CreateObject("DAO.DBEngine.36")
    Set WS = DE.CreateWorkspace("#Default Workspace", "admin", "")
    Set DB = WS.OpenDatabase(TargetMDB, True, False, ";pwd=" & OldPassword)
    
    DB.NewPassword OldPassword, NewPassword
    
    DB.Close
    Set DB = Nothing
    WS.Close
    Set WS = Nothing
    Set DE = Nothing

    上記では、「Square」というパスワードを「Enix」というパスワードに変更しています。


 
Posted at 18:12 / Jet/Access / この記事のURL
コメント(4)
[Jet 4.0] データベースパスワードの変更(2) / 2005年04月06日(水)

mdbファイルのデータベースパスワードを変更するには、Accessを用いる方法SQLを用いる方法JROを用いる方法DAOを用いる方法があります。

今回は、JROを用いる方法について書いておきます。


  1. JROを用いる方法

    JROでデータベースパスワードを指定するには、JetEngineオブジェクトのCompactDatabaseメソッドを使います。

    なお、JROは MSJRO.DLL によって提供されるライブラリです。参照設定して使う事もできますが、今回は参照設定しない場合のコードを提示しておきます。

    Dim JE As Object     'As JRO.JetEngine
    Dim OldMDB As String
    Dim NewMDB As String
    Dim OldPassword As String
    Dim NewPassword As String
    
    OldMDB = "C:\db1.mdb"
    NewMDB = "C:\db2.mdb"
    OldPassword = "Square"
    NewPassword = "Enix"
    
    Set JE = CreateObject("JRO.JetEngine")
    JE.CompactDatabase _
        "Data Source=" & OldMDB & ";Locale Identifier=1041;Jet OLEDB:Database Password=" & OldPassword, _
        "Data Source=" & NewMDB & ";Locale Identifier=1041;Jet OLEDB:Database Password=" & NewPassword
    Set JE = Nothing

    上記では、「Square」というパスワードの C:\db1.mdb から、「Enix」というパスワードの C:\db2.mdb に変換しています。

    この方法を使う場合、変換前のmdbが他のユーザーによって開かれているとエラーになるようです。

    なお、上記にある Locale Identifier というのは、データベースの『照合順序』の指定となります。(ここでは、日本語をあらわす1041を指定しています。)

    CompactDatabaseメソッドでは、必要に応じてその他のパラメータも付加する事ができます。その他のパラメータ情報は、MDAC SDKなどを参照してみてください。


 
Posted at 17:23 / Jet/Access / この記事のURL
コメント(0)
[Jet 4.0] データベースパスワードの変更(1) / 2005年04月06日(水)

mdbファイルのデータベースパスワードを変更するには、Accessを用いる方法SQLを用いる方法JROを用いる方法DAOを用いる方法があります。

今回は、Accessを用いた方法とSQLを用いる方法について書いておきます。


  1. Microsoft Accessを用いる方法

    手作業での変更でよければ、Accessのメニューから[ツール]-[セキュリティ]-[データベース パスワードの設定]を選択するだけです。

    これにより、変更用のダイアログが表示されます。

    このダイアログを VBA から表示させる場合は、下記のコードを使います。

    DoCmd.RunCommand acCmdSetDatabasePassword

    なお、この機能を用いる場合は、mdbを開く際に「排他モード」を指定しておく必要があります。

  2. SQLを用いる方法

    SQLで変更する場合には、ALTER DATABASEステートメントを用います。このSQLはADOを用いて実行する必要があります。(DAOは利用できません。)

    ALTER DATABASE PASSWORD Enix Square
  3. 上記では、「Square」というパスワードを「Enix」というパスワードに変更しています。

    mdb自体をロックする必要があるため、このSQLを実行するには、mdbを「排他モード」で開いておく必要があります。(共有モードでは実行できません)

    なお、このSQLを Microsoft Accessのクエリデザイナから データ定義クエリ として実行する事もできますが、その場合はオプション設定にて、ANSI-92構文に設定されている必要があります。


 
Posted at 16:11 / Jet/Access / この記事のURL
コメント(0)
[Jet 4.0] SQLでバイナリデータの登録を行う方法 / 2004年11月16日(火)

『0x01234567890ABCDEF…』形式の16進数表記文字列を使うと、SQL文にてバイナリデータを渡す事ができます。


実験対象となるテーブルの定義(IMG列がバイナリを渡す列です)

CREATE TABLE MyTable
(
	ID  	IDENTITY(100,1),
	TITLE  	TEXT(20),
	IMG 	OLEOBJECT,
	CONSTRAINT PKEY PRIMARY KEY (ID)
)

バイナリデータを登録するためのSQLの作成

Dim Cn As ADODB.Connection
Dim I As Long
Dim Binary() As Byte

Set Cn = New ADODB.Connection
Cn.Provider = "Microsoft.Jet.OLEDB.4.0"
Cn.Open "C:\Sample.mdb"

'ここでは、"C:\Project1.exe" のバイナリを
'Byte配列の変数に読み込んでいます。
With New ADODB.Stream
    .Type = adTypeBinary
    .Open
    .LoadFromFile "C:\Project1.exe"
    Binary = .Read(adReadAll)   'バイナリ取得
    .Close
End With

'バイナリを、0x01234567890ABCDEF……形式の文字列にして
'SQL文の中に埋め込みます。
Dim SQL As String
SQL = "INSERT INTO MyTable (TITLE, IMG) VALUES ('Project1.exe', 0x"
For I = LBound(Binary) To UBound(Binary)
    SQL = SQL & Right("00" & Hex(Binary(I)), 2)
Next
SQL = SQL & ")"

'確認用
Debug.Print SQL

'SQLの実行
Cn.Execute SQL

Cn.Close
Set Cn = Nothing

 
Posted at 22:55 / Jet/Access / この記事のURL
コメント(0)
[Jet 4.0] メモ型フィールドの最大長について / 2004年10月21日(木)

Microsoft Acceess のヘルプで『Access の定義』の項を調べてみると、メモ型フィールドに格納できる上限は、

  • ユーザー インターフェイスを使用してデータを入力するときには 65,535 文字
  • データをプログラムで入力するときには文字格納領域は 1 GB
と書かれています。

ここには 1GB と書いてありますが、正確には『536,870,910 文字』です。

Jet 4.0 では、文字列を Unicode (UCS-2)で扱い、1 文字につき 2バイトが消費されるので、文字数をバイト数に換算するならば、「 1 ギガバイト − 4バイト」が仕様上の上限サイズという事になります。

まぁ、そんなに巨大なテキストを格納する事は稀でしょうけれども。


 
Posted at 11:26 / Jet/Access / この記事のURL
コメント(0)
P R

Microsoft Most Valuable Professional, Visual Developer - Visual BasicMSMVP for Visual Basic


| 次へ
Global Media Online INC.