Access

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

メモ型

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

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

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

メモ型クエリ


今回は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としての経験を活かして、 情報システム部門のご相談を承ります。 得意な分野はAccessによる短納期開発、 BIツール(QlikSense/QlikView)の開発です。 現在はCMSを利用したホームページの作成にも力を入れています。