ACCESSのテキスト形式のフィールドを、バイナリ形式で取得するには?


れい  2008-09-12 02:17:40  No: 140410

お世話になります。

VB6.0からACCESS97のDBにACCESSする際、DAO3.51で使用していたところを
事情によりDAO3.6に変更しています。
すると、3.51では問題なくテキスト形式のフィールドを
バイナリ形式のフィールドにUPDATEできたのですが、DAO3.6にすると
「指定されたデータ量がフィールドサイズを超えています」
というメッセージが表示されてしまいます。
そこで、このテキスト形式のフィールドのデータを、バイナリ形式として
取得できれば、バイナリ形式のフィールドに値がセットできると思うのですが、何か方法はないでしょうか?
ちなみにテキスト形式のフィールドサイズとバイナリ形式のフィールドサイズは、同じです。

以上、よろしくお願いします。


魔界の仮面弁士  2008-09-12 07:56:51  No: 140411

> テキスト形式のフィールドサイズとバイナリ形式のフィールドサイズは、同じです。
バイナリフィールドに格納したテキストのエンコーディングを確認してみてください。

JET 3.x の頃は、テキストフィールドは ANSI テキストで格納されましたが
JET 4.0 からは、Unicode テキストに変更されています。

後述のサンプルコードでは、Shift_JIS と UTF-16 の片仮名データを、
それぞれ リトルエンディアン と ビッグエンディアン にて代入していますが、
エンジン バージョンによって、使用されている文字コードが異なるため、
Access 上では、同じバイナリが異なる文字列にデコードされて表示されます。

http://www.vb-user.net/images/20080911/AccessCharset.png

> 何か方法はないでしょうか?
当方で、Access97 形式の mdb を DAO 3.60 で開き、
テキスト形式のフィールドをバイナリ形式のフィールドに
UPDATEしてみましたが、問題無く更新されました。

Sub Main()
    Dim DE As Object
    Set DE = CreateObject("DAO.DBEngine.36")
    Dim DB As Object
    Set DB = DE.OpenDatabase("C:\ac97.mdb")

    DB.Execute "CREATE TABLE TBL ( COL1 COUNTER PRIMARY KEY, COL2 TEXT(20), COL3 BINARY(20) )"

    DE.BeginTrans
    DB.Execute "INSERT INTO TBL (COL1, COL2, COL3) VALUES (1, 'あいうえお', 0x83418343834583478349)"
    DB.Execute "INSERT INTO TBL (COL1, COL2, COL3) VALUES (2, 'かきくけこ', 0xab30ad30af30b130b330)"
    DB.Execute "INSERT INTO TBL (COL1, COL2, COL3) VALUES (3, 'さしすせそ', 0x5483568358835a838c83)"
    DB.Execute "INSERT INTO TBL (COL1, COL2, COL3) VALUES (4, 'たちつてと', 0x30bf30c130c430c630c8)"
    DE.CommitTrans
    
    DE.BeginTrans
    DB.Execute "UPDATE TBL SET COL3 = COL2 WHERE COL1 = 3"
    DE.CommitTrans
    DB.Close
End Sub


れい  2008-09-12 22:28:23  No: 140412

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

すいません、私の提示した情報が少なかったようです。

古い思想で作られたACCESSのテーブルがあり、そのテーブルをDAO3.6で
取得しようとすると、文字化けしてしまう、というのが事の発端でした。

例)
DATA
0011あいうえおか0012きくけこ    0021アイウエオカ0022キクケコ    

というように、項目:DATAに何レコードかの情報を、固定長でまとめてセットしています。続きの情報かどうかを、先頭の数字4桁で表しています。
(1〜3桁がコードで4桁目が枝番です)

例のようにレコードの内容が2バイトばかりなら問題ないのですが、1バイトの文字も入る事があり、その場合2バイト文字を1バイトずつ分割して設定しています。
DAO3.5まではこれでも問題なかったのですが、3.6にしたところ、Unicodeで認識できない文字を勝手に変換してしまい、文字化けが発生してしまいました。
それを回避させるため思いついたのが、項目をテキスト型からバイナリ型にしてしまう、という方法でした。
バイナリ型にすると、文字化けせずに正しい内容で取得できるようになったのですが、現在あるテーブルをバイナリ型に変換する必要性が生まれました。
そこでUPDATE文を使い、バイナリ型の項目へデータをセットしようとしたところ、「指定されたデータ量がフィールドサイズを超えています」が表示されてしました。
元々テキストデータはフィールドサイズの長さ一杯使用しているので、
メッセージが表示されているんだろうな、とは思っていたのですが。

しかし、このまま値がセットできたとしても、魔界の仮面弁士さまに試していただいたように文字化けするならどうしようもないですね(汗)
ACCESSのテキスト型項目のデータを、文字化けしないようにバイナリ形式で直接取得できれば、それが一番良いんですが、難しそうですよね。
一応今回は、DAO3.51で行きたいと思います。
ただ、もしテキスト型項目をバイナリで取得できる方法をご存知でしたら
お教えいただけると大変助かります。

長文乱文、失礼しました。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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