Access

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

メモ型
記事内に商品プロモーションを含む場合があります

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

メモ型テキスト型
Accessの文字列型とメモ型の違い~メモ型を利用する場合の注意点Accessでテキストを格納するフィールドの型はメモ型とテキスト型の2種類があります。テキスト型は255文字までななのでもっと長い文字を格納する必要があればメモ型を使うことになります。メモ型には制限事項や注意点も多いので2つの型の違いを理解した上でメモ型を使いましょう。...

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

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

メモ型クエリ


今回は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には「?」という仕様が時々あるので、困ってしまいます。

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

ABOUT ME
アズビーパートナーズ
プログラマー→社内SE→SIerのお仕事をしています。 メーカー勤務を経て、中小企業の社内SE、フリーランスなど様々な形態で働いてきました。 業務上生まれた困った…を解決してきたTipsを備忘録も兼ねて公開しています。 困っている誰かのお役に立てれば幸いです。