MDBの最適化結果を同一にするには?

解決


RK  2007-10-23 06:31:54  No: 137910

MDBの最適化について教えてください。
現在VB6.0でMDBの最適化を行いデータを利用していたのですが、同一のMDBでもソート結果が2通り存在することを確認。
どうやらVBで最適化を行ったものと、MDBを直接開いてデータベースの最適化を行った場合とで異なるようです。

内容的にはMDBを開き直接最適化した結果が望ましいのですがVBでの最適化で同様結果とすることは可能でしょうか?
知識不足のため調べて記述しましたので最適化の方法に誤りがある可能性が高いかもしれません。
宜しくお願い致します。

Dim nOld As String
Dim nNew As String
Dim nJRO As JRO.JetEngine

Set nJRO = New JRO.JetEngine    
nOld = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & D_PATH() & "FILE.mdb" & ";Jet OLEDB:Database Password=" & DB_PASS
nNew = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & D_PATH() & "NEWFILE.mdb" & ";Jet OLEDB:Database Password=" & DB_PASS
    
Set nJRO = CreateObject("JRO.JetEngine")
nJRO.CompactDatabase nOld, nNew
Set nJRO = Nothing


魔界の仮面弁士  2007-10-23 19:54:13  No: 137911

データベースの照合順序の指定が抜け落ちていますね。nNew の最後に、
  『Locale Identifier=0x411』…16進数表記
  『Locale Identifier=1041』…10進数表記
のいずれかの指定を加えてみてください。(照合順序を日本語にする場合)

ADO でいうところの Connection.Properties("Locale Identifier").Value、
DAO でいうところの CollatingOrder プロパティの指定を意味します。

> Set nJRO = New JRO.JetEngine    
> Set nJRO = CreateObject("JRO.JetEngine")
両方同時に使うのは無意味です。
(先に生成された方が、未使用のまま破棄されていますので)

参照設定している場合は前者の表記、
参照設定していない場合は後者の表記を使ってください。


RK  2007-10-24 04:37:30  No: 137912

魔界の仮面弁士さん、ご回答ありがとうございます
自分なりに調べてはみたのですが行き詰っていましたので大変助かりました
ありがとうございます。

ソートするデータは日本語、数字、日付など様々です。
16進数と10進数表記の使い分けについて理解できていませんが『Locale Identifier=1041』を追加することでとりあえず出来ているようです。
これから比較するなどチェックを行いたいと思います。

参照設定にはJet and Replication Objects  を追加していますが、Set nJRO = CreateObject("JRO.JetEngine")をカットしたところエラーとなるため記述は残しています。
続けて複数MDBの最適化を行っていますがそれは関係ないでしょうか


魔界の仮面弁士  2007-10-24 05:10:39  No: 137913

> ソートするデータは日本語、数字、日付など様々です。
ここで使用可能な照合順序とは、Microsoft Access でいうところの
『新規データベースの並び順序』オプションの設定に基づくものです。

> をカットしたところエラーとなるため記述は残しています。
『オブジェクト変数または With ブロック変数が設定されていません。』というエラーでしょうか?
生成処理そのものを削ってしまうと、そのようなエラーになりますね。

先の投稿の意図は、New による生成と、CreateObject による生成は、いずれか一方だけを
行えばよいので、2 回行う必要は無い(処理が冗長である)という意味です。

たとえば……
  Dim a As Integer
  a = 123   '☆
  nOld = "aaaa"
  nNew = "bbbb"
  a = CInt("123")   '★
  MsgBox(a)
というコードがあった場合、☆と★の行のコードが冗長なので、通常は ★ の行を取り除きますよね。

それと同じことで、先に提示いただいた
  Set nJRO = New JRO.JetEngine   '○
  nOld = ……
  nNew = ……
  Set nJRO = CreateObject("JRO.JetEngine")   '●
  nJRO.CompactDatabase nOld, nNew
  Set nJRO = Nothing
というコードは、●の行が冗長であるという事です。

もし、RKさんの発言の意図が、上記の●の行を削るとエラーになるという意味ならば
せめて、その前にある○の行だけでも削るべきでしょう。(そのような事にはならないと思いますが)

> 続けて複数MDBの最適化を行っていますがそれは関係ないでしょうか
JRO.JetEngine は、状態を保持しない(プロパティを持っていない)オブジェクトなので、
最適化のたびに、オブジェクトの再生成を行う必要はありませんよ。まぁ、再生成しても構いませんが。


シャノン  2007-10-24 20:27:50  No: 137914

>   『Locale Identifier=0x411』…16進数表記

VB なら &H411 では?
# VB 忘れてるなぁw


魔界の仮面弁士  2007-10-24 20:45:59  No: 137915

> VB なら &H411 では?
0x 形式はサポートされていますが、&H 形式は受け付けません。

実際に試していただくと分かりますが、&H 形式で指定すると、
  [Microsoft OLE DB Service Components]
  エラー:-2147217805(0x80040E73)
  初期化文字列の形式は OLE DB 仕様に準拠していません。
が発生することになります。


RK  2007-10-25 00:15:43  No: 137916

魔界の仮面弁士さん、更に回答ありがとうございます。

参照設定しているので Set nJRO = CreateObject("JRO.JetEngine")が不要なのかと思いました。
ご丁寧に解説ありがとうございました。

1点教えていただきたいのですが、照合順序の指定として10と16進数表記はどのように使い分けるべきなのでしょうか?JISコード?

今回の目的ですが、
・MDB内での最適化と同様の最適化としたいです。
・データは漢字、日付など様々なフィールドがあります。
・漢字でソートした際、xls形式にエクスポートしてソートした漢字の並びと同一としたいです。

度々申し訳ありませんが宜しくお願い致します。


魔界の仮面弁士  2007-10-25 01:05:22  No: 137917

> 10と16進数表記はどのように使い分けるべきなのでしょうか?
使い分けません。

「2007年」と「平成19年」が同じ年を示す文字列であるように、
「0x411」と「1041」もまた、同じ値を示す文字列です。

普段使い慣れた方の表記を使ってください。どちらも見慣れぬ値なら、
いずれも同じ結果が得られるので、お好きな方を選んでください。

ちなみに、DAO の照合順序定数の場合は、
  Const dbLangJapanese As String = ";LANGID=0x0411;CP=932;COUNTRY=0"
という、「16 進数の 0x411」を採用しています。

世間一般で見ると、MSDN ライブラリの場合は、
  C:\Program Files\Microsoft Visual Studio\MSDN\2001OCT\1041\
のように、言語指定に「10進数の 1041」を採用していますし、
  http://go.microsoft.com/fwlink/?LinkID=75793&clcid=0x411
などのように、0x411 を採用する処理系もありますので、
どちらが主流という事も無いと思います。

なお、(今回の件とはまったく無関係ですが)蛇足ついでに書いておくと、
Jet/ACE の SQL においては、
  SELECT 0x015feb58 FROM テーブル名
といった「0x」表記は、数値ではなく「Unicode 文字列のバイナリ表記」
(Access 97 以下の場合は、Shift_JIS バイナリ表記)を意味するので、
混同しないようにご注意ください。


魔界の仮面弁士  2007-10-25 01:21:34  No: 137918

> ・MDB内での最適化と同様の最適化としたいです。
現在の照合順序は、
<DAO>
  Debug.Print objDatabase.CollatingOrder
<ADODB>
  Debug.Print objConnection.Properties("Locale Identifier").Value
で調べることができます。

実際の最適化時には、最適化後の mdb のバージョンを明示させるため、
  objConnection.Properties("Jet OLEDB:Engine Type").Value
の設定も、CompactDatabase の引数に含めておいた方が良いかも知れません。

> ・データは漢字、日付など様々なフィールドがあります。
使用可能な照合順序の一覧は、Access のヘルプなどで確認してください。
照合順序が異なれば、並び順も異なります。
http://support.microsoft.com/kb/416061/JA/

日本語の並び替え順序の仕様については、Access ヘルプで
『日本語の並べ替え順序について』をご覧ください。

また、(1998年5月当時の資料ですが)下記も参考になるかも。
http://www.massangeana.com/mas/comp/acccoll.htm

> ・漢字でソートした際、xls形式にエクスポートしてソートした漢字の並びと同一としたいです。
Excel のソート機能と同一の照合順序は用意されていなかったように思います。

Excel の順序に関しては、このあたり。
http://support.microsoft.com/kb/412061/ja
http://support.microsoft.com/kb/416983/ja


RK  2007-10-25 18:39:35  No: 137919

魔界の仮面弁士さん、再度ご回答ありがとうございます。

教えて頂いた点を調べたいと思います。
貴重なご回答ありがとうございます。本当に助かりました!!
また質問させて頂く事がありましたら宜しくお願い致します。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加