Попытаюсь с другого боку.
Возможно имеет место переполнение памяти.
В С, С++ строка - это просто массив байт (UNICODE пока не трогаем). И никаких проверок на выход за пределы массива не делается (чем грозит запись за границы - отдельный разговор). Считается, что программист - умный, знает что делает.
Класс CString пытается упростить работу со строками. Он сам динамически выделяет столько памяти, сколько нужно, чтобы хранить строку. Все хорошо пока мы не пытаемся передать объект класса CString в какую-нибудь функцию вместо параметра char*. У класса CString есть оператор приведения к этому типу. Поэтому компилятор не выдаст ошибки. При приведении типов объект типа CString просто возвращает указатель на память которой он в данный момент владеет в надежде, что с ней будут обращаться "хорошо".
"Хорошая" функция чтобы не вылезти за границы строки требует также длинну переданного массива.
Так вот CString по-умолчанию, даже для пустой строки, выделяет только 64. А функция RFX_Text() по-умолчанию считает что ей передаётся массив в 255 байт и с чистой совестью будет записывать в него строки до 254 байт длинной (незабываем про завершающий 0).
Здесь еще важно понять, что если строки в поле БД меньше 64 байт, то и ошибки не возникнет, но чтобы быть уверенным в результате надо заставить объект CString выделить больше памяти под строку. Для этого вызывается функция-член класса CString GetBufferSetLength(). И предупредить RFX_Text(), сколько байт она может записать.
Допустим в БД в поле "Comment" может хранится строка до 1024 символов, тогда чтобы гарантированно получить всю строку целиком надо перед вызовом RFX_Text() попросить объект CString выделить 1024 байт:
RFX_Text(pFX, _T("[Comment]"), m_Comment.GetBufferSetLength(1024), 1024);
Вот в кратце
.