TN045: Поддержка MFC/баз данных для длительного Varchar/Varbinary

В настоящей записке описывается, как получить и отправить типы данных ODBC SQL_LONGVARCHAR и SQL_LONGVARBINARY , с помощью классов базы данных MFC.

Обзор длительного Varchar/Varbinary поддержка

ODBC SQL_LONG_VARCHAR и SQL_LONGBINARY типы данных (именуется здесь длинные столбцы данных) может хранить огромное количество данных. Есть 3 способа, вы можете обрабатывать эти данные:

Длинных данных столбцы не поддерживаются для параметров к запросу. Они поддерживаются только для outputColumns.

Привязка к CString/CByteArray длинный столбец данных

Преимущества:

Этот подход прост для понимания, и вы работаете с знакомые классы. Framework обеспечивает поддержку CFormView для CString с DDX_Text. У вас есть много общей строкой или функциональные возможности коллекции с CString и CByteArray классов, и вы можете контролировать объем памяти, выделенной на местах для хранения значения данных. Рамки поддерживает старая копия данных поля во время редактирования или вызовы функции AddNew , и рамки может автоматически обнаруживать изменения данных для вас.

Примечаниеnbsp;  Так как CString предназначена для работы на символьные данные и CByteArray для работы на бинарных данных, мы рекомендуем что вы положили в CStringсимвольные данные (SQL_LO&NGVARCHAR) и двоичные данные (SQL_LONGVARBINARY) в CByteArray.

Функции RFX для CString и CByteArray имеют дополнительный аргумент, который позволяет переопределить установленный по умолчанию размер выделенной памяти для хранения возвращаемого значения для столбца данных. Примечание nMaxLength аргумент в следующие объявления функций:

 void AFXAPI RFX_Text(CFieldExchange* pFX, const char *szName,
 nbsp;  CString & значение, int nMaxLength = 255, int nColumnType =
    SQL_VARCHAR);

void AFXAPI RFX_Binary(CFieldExchange* pFX, const char *szName, CByteArray& value,int nMaxLength = 255)

Если вы извлечь столбец данных long в CString или CByteArray, максимальная возвращается количество данных по умолчанию — 255 байт. Ничего за это учитывается. В этом случае рамки будет сгенерировано исключение AFX_SQL_ERROR_DATA_TRUNCATED. К счастью можно явным образом увеличить nMaxLength для большей ценности, вплоть до MAXINT.

ClassWizard будет привязан к CString, или SQL_LONGVARBINARY к CByteArray SQL_LONGVARCHAR для вас. Если вы хотите передать более 255 байт, на которые вы получить ваши длинных данных столбца, затем можно передать значение для nMaxLength.

Когда длинных данных столбец привязан к CString или CByteArray, обновления поля работает так же как когда он привязан к SQL_VARCHAR или SQL_VARBINARY. Во время редактированиязначение данных от кэшируется и позднее чем при вызове Update , чтобы обнаружить изменения в значения данных и соответствующим образом установить грязную и Null значения для столбца.

Привязка к CLongBinary длинный столбец данных

Если ваш длинных данных столбец может содержать больше MAXINT байт данных, скорее всего можно извлекать их в CLongBinary.

Преимущества:

Это извлекает весь длинный столбец - вплоть до доступной памяти.

Недостатки:

Данных хранится в памяти. Этот подход также является слишком дорого для очень больших объемов данных. Вам необходимо вызвать SetFieldDirty для связанных данных-членов для обеспечения поле включено в операции обновления.

При получении столбцов данных long в CLongBinaryклассы базы данных будут проверять общий размер столбца данных long, а затем выделить сегмент памяти HGLOBAL достаточно большой для хранения значения данных. Классы базы данных затем извлечь значение переменной в выделенный HGLOBAL.

Если источник данных не возвращает ожидаемый размер столбца данных long, рамки будет сгенерировано исключение AFX_SQL_ERROR_SQL_NO_TOTAL. Если не удается выделить HGLOBAL , Стандартная память исключение.

ClassWizard привязка SQL_LONGVARCHAR или SQL_LONGVARBINARY CLongBinary для вас. Выберите в качестве типа переменной в диалоговом окне Добавление переменной-члена класса CLongBinary . ClassWizard затем добавьте вызов RFX_LongBinary для звонка DoFieldExchange и увеличить общее количество связанных полей.

Чтобы обновить длинные значения столбцов данных, сначала убедитесь выделенного HGLOBAL достаточно большой для хранения новых данных посредством вызова :: GlobalSize на m_hData члена класса CLongBinary. Если он слишком мал, отпустите HGLOBAL и выделить один соответствующий размер. Затем установите m_dwDataLength отразить новый размер.

В противном случае если m_dwDataLength больше, чем размер данных, которые замене, можно либо свободные и перераспределить HGLOBALили оставить его выделены. Не забудьте указать количество байтов, фактически использовавшихся в m_dwDataLength.

Работает как обновления CLongBinary

Это не нужно понимать, как работает обновление CLongBinary , но может оказаться полезным в качестве примера о том, как отправить значения длинных данных к источнику данных, если вы выбираете этот третий метод, описанных ниже.

Примечаниеnbsp;  Для того чтобы CLongBinary поля включаться в обновление необходимо явно вызывать SetFieldDirty для поля. Если вы сделаете какие-либо изменения к полю, включая настройку &Null, необходимо вызвать SetFieldDirty.

При обновлении поля класса CLongBinary , используют классы баз данных ODBC в DATA_AT_EXEC механизм (см документации ODBC SQLSetPosrgbValue аргумент). Когда рамки готовит insert или инструкции update, вместо того, указывая на HGLOBAL , содержащие данные, адрес CLongBinary задается как значение столбца вместо этого и индикатор длины, равным SQL_DATA_AT_EXEC. Позже когда инструкция update отправляется в источник данных, SQLExecDirect вернет SQL_NEED_DATA. Это предупреждает рамки, что значение param для этого столбца является на самом деле адрес CLongBinary. Платформа вызывает функцию SQLGetData один раз с небольшой буфер, ожидая водителю вернуть фактическую длину данных. Если драйвер возвращает фактическую длину больших двоичных объектов (BLOB), MFC перераспределяет столько же места, необходимые для получения BLOB. Если источник данных возвращает SQL_NO_TOTAL, указав, что он не может определить размер BLOB, MFC создаст блоки меньшего. Первоначальный размер по умолчанию составляет 64 K, и последующих блоков будет двойной размер; к примеру вторая будет 128 K, третий — в 256 K и так далее. Первоначальный размер задается.

Не имеют обязательной силы: Получение/Отправка данных непосредственно из ODBC с SQLGetData

С помощью этого метода вы полностью обойти классы базы данных и справиться с длинных данных столбца себя.

Преимущества:

Можно кэшировать данные на диск, при необходимости, или решить динамически сколько данных для извлечения.

Недостатки:

Вы не получите framework редактировать или поддержки AddNew , и вы должны написать код себя для выполнения базовых функций (Удалить работать, так как это не операция уровня столбца).

В этом случае столбец длинных данных должны находиться в списке выбора набора записей, но не должна быть связана с рамками. Одним из способов сделать это заключается в собственную инструкцию SQL через GetDefaultSQL или в качестве аргумента lpszSQL функции Open CRecordsetопределено, а не связывать дополнительный столбец с вызова функции RFX_. ODBC, что свободные поля справа присоединенных полях, поэтому добавьте ваши несвязанных столбцов в конец списка выбора.

Предупреждениеnbsp;  Так как столбец длинных данных не связаны рамки, внесение в нее изменений не обрабатываются с CRecordset::Update вызовов. Необходимо создать и отправить необходимые инструкции SQL I&NSERT и UPDATE.

Технические примечания по номеру |nbsp; Технические примечания по категориям

Index