メモ型のフィールドをレコードセットで取得すると255文字で切れる?

当ページのリンクには広告が含まれています。
メモ型
  • URLをコピーしました!

メモ型のフィールドをレコードセットでオープンして使おうとすると、256文字以降が切れる、または文字化けするという状況になり調査を開始しました。

目次

文字切れ(文字化け)の現象再現

以下のクエリーをレコードセットで開きます。

メモ型クエリ
Private Sub cmdテスト_Click()
    Dim myDB            As Dao.Database
    Dim FreeRs          As Dao.Recordset
    Dim strMemo         As String
    
    On Error GoTo Err_Exit
       
    Set myDB = CurrentDb
    Set WkRs = myDB.OpenRecordset("Qryテスト", dbOpenSnapshot, dbReadOnly)
    
    With WkRs
        If Not .EOF Then
            .MoveFirst
            
            While Not .EOF
                strMemo = .Fields("メモ型テスト")
                MsgBox strMemo
                .MoveNext
            Wend
        End If
    End With
    
    Set WkRs = Nothing: Close
    Set myDB = Nothing: Close
    
    Exit Sub
    
Err_Exit:
    MsgBox "テスト():" & Err.Number & ":" & Err.Description, vbOKOnly + vbCritical
    Set WkRs = Nothing: Close
    Set myDB = Nothing: Close
End Sub

今回はAccess内のテーブルなのでDAOを使っています。

変数strMemoにフィールド【メモ型テスト】を代入してMsgbox()で表示するのですが、strMemo変数に代入された時点で【メモ型テスト】が255文字で切られてしまうという現象です。

クエリーを表示するだけであれば256文字以上も表示できているのにレコードセットとして開いて【メモ型テスト】を取得すると255文字で切れます。

複数レコードがヒットするケースだと文字切れ+文字化けという現象になっていました。

原因はnz()関数

DAOレコードセットが悪いのか?ADOならいいのか?

テーブルから直接レコードセット取得ならいいのか?

あれこれ試した結論は、nz()関数でした。

そこか・・・。という感じです。

クエリーでフィールド関数としてnz()を使う際、表示に問題はなかったのですが、このフィールドをレコードセットとして取得すると上記のような現象になります。

nz()関数とは?

nz()関数とは取得した値がNULLなら長さ0の文字列(””)に変換して返してくれる関数です。

取得した値を別テーブルに格納する場合など、IsNull()で事前にNull値の判断しなくても代入ができるのでよく使っています。

※Null値をフィールドにそのまま代入するとエラーになります。

クエリーでnz()関数を使わずにVBAで回避する

結局、クエリーでnz()関数を使用する際、256文字以上は問題があるようなのでnz()関数を使わないように変更しました。

nz関数なし

この変更により、メモ型テストフィールドにNULL値が入る可能性が出てきました。

このため、strMemo変数に値を代入する際にNz()関数を使いました。

strMemo = Nz(.Fields(“メモ型テスト”))

この部分はNz()関数を使用する場合は問題なく処理できるようです。(不思議・・・)

Accessには「?」という仕様が時々あるので、困ってしまいます。

困っている方の参考になれば幸いです。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次