이 노트를 검색 하 고 MFC 데이터베이스 클래스를 사용 하 여 ODBC SQL_LONGVARCHAR 및 SQL_LONGVARBINARY 데이터 형식을 전송 하는 방법을 설명합니다。
긴 Varchar/Varbinary의 개요 지원
ODBC SQL_LONG_VARCHAR 및 SQL_LONGBINARY 데이터 형식 (긴 데이터 열으로 여기 참조)는 엄청난 양의 데이터를 저장할 수 있습니다. 3 가지 방법으로이 데이터를 처리할 수 있습니다.:
긴 데이터 열 쿼리 매개 변수는 지원 되지 않습니다. 그들은 Outputcolumns에 대 한 지원。
CString/Cbytearray에 긴 데이터 열을 바인딩
장점:
이 접근 이해 하 고, 간단 하 고 친숙 한 클래스와 함께 작동 합니다. 프레임 워크에서는 CFormView CString DDX_Text함께 지원 합니다. 당신은 일반 문자열 또는 CString 및 CByteArray 클래스에 컬렉션 기능을 많이 하 고 데이터 값을 로컬로 할당 된 메모리 양을 제어할 수 있습니다. 편집 또는 AddNew 함수 호출 하는 동안 필드 데이터의 오래 된 복사본을 유지 하는 프레임 워크 및 프레임 워크 자동으로 데이터 변경에 대 한 검색。
메모nbsp;CString 문자 데이터 및 CByteArray 에 이진 데이터에 대 한 작업에 대 한 작업을 위해 설계 되었습니다, 이후 CByteArray 에 CString, 문자 데이터 (SQL_LONGVARCHAR) 및 이진 데이터 (SQL_LONGVARBINARY)를 넣어 하는 것이 좋습니다(&N).
CString 및 CByteArray RFX 함수는 데이터 열에 대 한 검색된 값을 할당 된 메모리의 기본 크기를 재정의할 수 있는 추가 인수. 참고 다음 함수 선언에 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)
CString 에 CByteArray는 긴 데이터 열을 검색 하는 경우 최대 데이터 양입니다, 기본적으로 255 바이트 반환. 이 외에도 아무것도 무시 됩니다. 이 경우 프레임 워크 AFX_SQL_ERROR_DATA_TRUNCATED예외를 throw 합니다. 다행히도, 명시적으로 nMaxLength MAXINT 최대에 더 큰 값으로 늘릴 수 있습니다.
ClassWizard 바인딩합니다 SQL_LONGVARCHAR CString또는 SQL_LONGVARBINARY CByteArray 를 당신을 위해. 255 바이트 보다 긴 데이터 열을 읽어들일 할당 하려는 경우 Nmaxlength에 대 한 명시적 가치를 제공할 수 있습니다.
긴 데이터 열 CString 또는 CByteArray에 바인딩될 때 그냥 같은 SQL_VARCHAR 또는VARBINARYSQL_ 바인딩된 경우 작동 필드를 업데이트 합니다. 편집하는 동안 데이터 값은 멀리 캐시 하 고 데이터 값의 변경 내용을 검색 하 고 해당 열에 대 한 더러운 및 Null 값을 적절 하 게 설정 하려면 업데이트 를 호출 하면 나중에 비교。
Clongbinary에 긴 데이터 열을 바인딩
경우에 긴 데이터 열에는 더 많은 MAXINT 바이트의 데이터가 포함 될 수 있습니다, 당신은 아마 고려해 CLongBinary 에 검색。
장점:
이 사용 가능한 메모리를 최대 전체 긴 데이터 열-검색。
단점:
데이터를 메모리에 보관 됩니다. 이 접근법은 또한 매우 많은 양의 데이터에 대 한 엄청나게 비싸다. 필드 업데이트 작업에 포함 되도록 바인딩된 데이터 멤버에 대 한 SetFieldDirty 를 호출 해야 합니다.
CLongBinary에 long 데이터 열을 검색 하는 경우 데이터베이스 클래스는 긴 데이터 열의 총 크기를 확인 하 다음 전체 데이터 값을 저장할 수 있을 만큼 큰 HGLOBAL 메모리 세그먼트를 할당할 것입니다. 데이터베이스 클래스는 다음 할당된 HGLOBAL 으로 전체 데이터 값을 검색。
데이터 소스는 긴 데이터 열의 예상된 크기를 반환할 수 없습니다, 프레임 워크에서 AFX_SQL_ERROR_SQL_NO_TOTAL예외를 throw 합니다. 표준 메모리 예외 throw HGLOBAL 할당할 시도가 실패 하는 경우。
ClassWizard 바인딩합니다 SQL_LONGVARCHAR 또는 SQL_LONGVARBINARY CLongBinary 를 당신을 위해. CLongBinary 멤버 변수 추가 대화 상자에서 변수 유형을 선택 합니다. ClassWizard 다음 DoFieldExchange 를 호출 하는 RFX_LongBinary 호출을 추가 하 고 바인딩된 필드의 총 수를 증가。
긴 데이터 열 값을 업데이트 하려면 먼저 호출 하 여 새 데이터를 저장할 수 있을 만큼 큰 할당된 HGLOBAL 인지 확인 :: GlobalSize CLongBinary 그런 멤버에. 너무 작은 경우 HGLOBAL 놓고 하나 적절 한 크기를 할당 합니다. 그런 다음 새 크기를 반영 하도록 m_dwDataLength 설정。
그렇지 않으면, m_dwDataLength 대체 하는 데이터의 크기 보다 큰 경우, 무료 및 HGLOBAL을 재할당 하거나 할당 그것을 두고. M_dwDataLength 에서 실제로 사용 된 바이트 수를 나타냅니다 있는지 확인。
작동 하는 방법 업데이트는 CLongBinary
CLongBinary 업데이트 작동 하는 방법을 이해 하는 것이 필요 하지 않습니다 하지만 긴 데이터 값 데이터 원본에 보내는 방법에 대 한 예로 것이 유용할 수 있습니다 아래에서 설명 하는이 세 번째 방법 선택 하는 경우。
메모nbsp;??업데이트에 포함 될 CLongBinary 필드에서 필드에 대 한 SetFieldDirty 를 명시적으로 호출 해야 합니다. 필드에 Null 설정 등 어떠한 변경 SetFieldDirty 를 호출 해야 합니다(&N).
데이터베이스 클래스는 ODBC의 DATA_AT_EXEC 메커니즘 사용 CLongBinary 필드를 업데이트할 때 ( SQLSetPosrgbValue 인수에 ODBC 설명서 참조). 때 삽입을 준비 하는 프레임 워크 또는 CLongBinary 주소 데이터가 포함 된 HGLOBAL 를 가리키는 대신 update 문 대신, 열 값 으로 설정 되어 및 길이 표시기는 SQL_DATA_AT_EXEC로 설정 합니다. 나중에, 데이터 소스에 update 문을 보내면 SQLExecDirect 는 SQL_NEED_DATA를 반환 합니다. 이 프레임 워크를이 열에 대 한 매개 변수 값은 실제로 CLongBinary주소 경으십시오. 프레임 워크 데이터의 실제 길이 반환 하려면 드라이버를 기대 하 고 작은 버퍼를 가진 SQLGetData 를 한 번 호출 합니다. 드라이버 이진 대형 개체 (BLOB)의 실제 길이 반환 하는 경우 MFC 다시 BLOB를 인출 하는 데 필요한 많은 공간을 할당 합니다. Datasource SQL_NO_TOTAL, 그것은 BLOB의 크기를 확인할 수 없습니다 나타내는 반환 하는 경우 MFC 작은 블록을 만듭니다. 기본 초기 크기는 64 K 되며 후속 블록 크기의 두 배; 예를 들어, 128 K 것입니다 두 번째, 세 번째는 256 K. 초기 크기는 구성할 수。
구속력이 없습니다: 검색/데이터 전송 Sqlgetdata와 ODBC에서 직접
이 방법으로 당신이 완전히 데이터베이스 클래스를 우회와 거래 긴 데이터 열과 자신。
장점:
필요한 경우 디스크 또는 동적으로 얼마나 많은 검색할 데이터를 결정할 데이터를 캐시할 수 있습니다.
단점:
프레임 워크의 편집 또는 AddNew 지원의 얻을 하지 않습니다 하 고 작성 해야 합니다 자신을 (삭제 작동 하지만, 그것은 열 수준 작업 이후) 기본적인 기능을 수행할 코드。
이 경우 긴 데이터 열 recordset의 선택 목록에 있어야 하지만 안 프레임 워크에 의해 바인딩되어 있어야 합니다. 이렇게 하는 한 가지 방법은 GetDefaultSQL 을 통해 또는 CRecordset Open 함수의 lpszSQL 인수로 직접 SQL 문을 제공 하 고 RFX_ 함수 호출 추가 열에 바인딩할 수입니다. ODBC 언바운드 필드가 바인딩된 필드의 오른쪽에 나타납니다 필요 합니다, 그리고 그래서 언바운드 열 선택 목록 끝에 추가。
경고nbsp;??때문에 long 데이터 열 프레임 워크에 의해 바인딩되지 않습니다 변경 CRecordset::Update 호출으로 처리 되지 않습니다. 만들고 필요한 SQL 삽입 및 업데이트 문을 보냅니다 해야 합니다(&N).
기술 노트 번호로 |nbsp; 카테고리별 기술 노트(&N)