긴 Varchar/Varbinary의 TN045: MFC/데이터베이스 지원
[!참고]
온라인 설명서의을 처음 포함 되었습니다 때문 다음 기술 참고 업데이트 되지 않았습니다.따라서 일부 절차 및 항목 오래 되었거나 잘못 된 수 있습니다.최신 정보는 온라인 설명서 색인에서 관심 있는 주제에 대해 검색 하는 것이 좋습니다.
이 참고는 ODBC를 보내고 검색 하는 방법에 설명 합니다. SQL_LONGVARCHAR 및 SQL_LONGVARBINARY 데이터베이스 클래스를 MFC를 사용 하 여 데이터 형식입니다.
긴 Varchar/Varbinary의 개요를 지원 합니다.
ODBC SQL_LONG_VARCHAR 및 SQL_LONGBINARY (여기에는 긴 데이터 열으로 라고도 함) 데이터 형식은 대량의 데이터를 저장할 수 있습니다.3 가지 방법으로이 데이터를 처리할 수 있습니다.
Bind it to a CString/CByteArray.
바인딩하는 CLongBinary.
하지 않는 전혀 바인딩할 검색 및 long 데이터 값 수동으로 데이터베이스 클래스의 독립적인 보내기.
세 가지 방법을 각각 장단점이 있습니다.
긴 데이터 열에 쿼리 매개 변수에 대 한 지원 되지 않습니다.이러한 Outputcolumns에만 지원 됩니다.
CString/Cbytearray에 긴 열의 데이터 바인딩
장점:
이해 하기 위해서는이 접근 방식은 간단 하 고 익숙한 클래스와 함께 작동 합니다.프레임 워크를 제공 합니다. CFormView 에 대 한 지원 CString 와 DDX_Text.일반 문자열이 나 컬렉션 기능을 사용 하는 많은 경우에 CString 및 CByteArray 클래스 및 사용자 데이터 값을 로컬로 저장을 위해 할당할 메모리 양을 제어할 수 있습니다.이전 복사본 중 필드 데이터 프레임 워크를 유지 편집 또는 AddNew 함수 호출 및 데이터 변경 내용을 자동으로 감지 하는 자동으로 해당 프레임 워크 수입니다.
[!참고]
이후 CString 문자 데이터에 대해 작업을 위해 설계 되었습니다 및 CByteArray 이진 데이터에서 작업을 위한 문자 데이터를 저장 하는 것입니다 (SQL_LONGVARCHAR)로 CString, 및 이진 데이터 (SQL_LONGVARBINARY)로 CByteArray.
RFX 함수에 대 한 CString 및 CByteArray 추가 인수 데이터 열에 대해 검색된 된 값을 보유할 할당 된 메모리의 기본 크기를 재정의할 수 있습니다.참고 다음 함수 선언의 nMaxLength 인수:
void AFXAPI RFX_Text(CFieldExchange* pFX, const char *szName,
CString& value, int nMaxLength = 255, int nColumnType =
SQL_VARCHAR);
void AFXAPI RFX_Binary(CFieldExchange* pFX, const char *szName,
CByteArray& value,int nMaxLength = 255);
에 긴 데이터 열을 검색 하는 경우는 CString 또는 CByteArray, 최대 데이터 양입니다, 기본적으로 255 바이트를 반환 합니다.이 외에 아무 것도 무시 됩니다.이 경우 프레임 워크 예외를 throw 합니다 AFX_SQL_ERROR_DATA_TRUNCATED.다행히 하면 명시적으로 Nmaxlength을 큰 값으로 최대 증가 될 수 있습니다 MAXINT.
[!참고]
값의 nMaxLength MFC에서의 로컬 버퍼 설정 되는 SQLBindColumn 함수.이 데이터 저장소의 로컬 버퍼 이며 ODBC 드라이버에 의해 반환 되는 데이터의 양을 실제로 적용 되지 않습니다.RFX_Text및 RFX_Binary 만 하나를 사용 하 여 호출을 확인 SQLFetch 백 엔드 데이터베이스에서 데이터를 검색 합니다.각 ODBC 드라이버의 다른 수는 단일 페치 프로세스에서 반환 된 데이터의 양에 제한이 있습니다.이 제한 예외 nMaxLength 어떤 경우에서에 값을 설정 하는 것 보다 훨씬 작은 수 있습니다 AFX_SQL_ERROR_DATA_TRUNCATED throw 됩니다.이러한 상황에서 사용 하도록 전환 RFX_LongBinary 대신 RFX_Text 또는 RFX_Binary 의 모든 데이터를 검색할 수 있도록 합니다.
바인딩할 클래스 마법사는 SQL_LONGVARCHAR 에 CString, 또는 SQL_LONGVARBINARY 에 CByteArray 를.255 바이트 보다 긴 데이터 열을 검색할 크기를 할당 하려면 다음의 nMaxLength 명시적 값을 제공할 수 있습니다.
때 긴 데이터 열에 바인딩되는 CString 또는 CByteArray, 필드 업데이트 작동은 똑같이 하는 SQL_ 바인딩될 때로VARCHAR 또는 SQL_VARBINARY.동안 편집를 멀리 하 고 나중에 언제 비교 데이터 값 캐시 된 업데이트 데이터 값 및 Dirty는 설정 하 고 적절 하 게 값 열에 대해 Null을 검색 하기 위해 호출 됩니다.
Clongbinary에 긴 열의 데이터 바인딩
긴 데이터 열을 더 포함 될 수 있습니다 경우 MAXINT 바이트의 데이터를 아마도 고려해 야로 검색 하는 CLongBinary.
장점:
이 사용 가능한 메모리 전체 긴 데이터 열을 검색합니다.
단점:
데이터를 메모리에 보관 됩니다.이 방법은 매우 많은 양의 데이터에 대해 엄청나게 비싼 이기도합니다.호출 해야 SetFieldDirty 에 바인딩된 데이터 필드를 확인 하는 멤버 포함 되어 있는 업데이트 작업.
긴 데이터 열에 검색 하는 경우는 CLongBinary, 데이터베이스 클래스 긴 데이터 열의 총 크기를 확인 하 고 할당 합니다는 HGLOBAL 메모리 세그먼트 전체 데이터 값을 보유할 수 있을 만큼 큰 합니다.데이터베이스 클래스는 다음 전체 데이터 값의 할당 된 검색 HGLOBAL.
데이터 소스 열 긴 데이터의 예상된 크기를 반환할 수 없습니다 경우 프레임 워크는 예외를 throw 합니다 AFX_SQL_ERROR_SQL_NO_TOTAL.경우 할당 하려고는 HGLOBAL 실패, 표준 메모리 예외가 throw 됩니다.
바인딩할 클래스 마법사는 SQL_LONGVARCHAR 또는 SQL_LONGVARBINARY 에 있는 CLongBinary 를.선택 CLongBinary 멤버 변수 추가 대화 상자에서 변수 형식으로 합니다.클래스 마법사 다음 추가 됩니다는 RFX_LongBinary 호출을 DoFieldExchange 호출 하 여 바인딩된 필드의 총 증가 합니다.
긴 데이터 열의 값을 업데이트 하려면 먼저 해당 할당 된 있는지 확인 HGLOBAL 를 호출 하 여 새 데이터를 보유할 정도로 크지 :: GlobalSize 에 있는 m_hData 소속은 CLongBinary.너무 작은 경우 릴리스는 HGLOBAL 하나 적절 한 크기를 할당 합니다.그런 다음 설정 m_dwDataLength 새 크기를 반영 합니다.
그렇지 않으면 if m_dwDataLength 크기 보다 큰 중인 대체는 데이터의 사용자 중 재할당 늘린 수는 HGLOBAL, 또는 할당할 수 있습니다.실제로 사용 되는 바이트 수를 지정 해야 m_dwDataLength.
어떻게 업데이트는 CLongBinary 작동
이해 하는 것이 필요 하지 않습니다 어떻게 업데이트는 CLongBinary 작동 있지만 될 수 예를 들어 long 데이터 값이 데이터 원본에 보내는 방법에 유용한 아래에서 설명 하는이 세 번째 방법을 선택 하는 경우.
[!참고]
위해에서는 CLongBinary 업데이트에 포함 될 필드를 명시적으로 호출 해야 SetFieldDirty 필드.이 Null 설정을 포함 하는 필드를 변경 하면 호출 해야 SetFieldDirty.또한 호출 해야 SetFieldNull, 두 번째 매개 변수가 되 고 있는 FALSE는 필드의 값을 표시 하는.
업데이트 하는 경우는 CLongBinary 필드 데이터베이스 클래스는 ODBC의 사용 DATA_AT_EXEC 메커니즘 (ODBC 설명서를 참조 하십시오 SQLSetPos의 rgbValue 인수).때 프레임 워크 준비를 가리키는 대신는 insert 또는 update 문을 HGLOBAL 데이터를 포함 하는 주소 의 CLongBinary 로 설정의 값 열 대신 길이 표시기로 설정 하 고 SQL_DATA_AT_EXEC.데이터 소스에 update 문을 보낼 때 이후 SQLExecDirect 반환 합니다 SQL_NEED_DATA.이 프레임 워크의 param이 열의 값의 주소를 실제로 경고 메시지는 CLongBinary.프레임 워크 호출 SQLGetData 번 드라이버 데이터의 실제 길이 반환 합니다 작은 버퍼를 기대 합니다.드라이버 이진 대형 개체 (BLOB)의 실제 길이 반환 하는 경우 MFC에 BLOB을 페치 (fetch) 하는 데 필요한 만큼 공간이 다시 할당 합니다.데이터 원본 반환 하는 경우 SQL_NO_TOTAL를 나타내는 BLOB의 크기를 확인할 수 없습니다, MFC 작은 블록을 만듭니다.기본 초기 크기 64 K 이며 이후에 블록 크기를 두 배로 됩니다. 예를 들어, 128 K 수 두 번째, 세 번째 256 K가 됩니다.초기 크기를 구성할 수 있습니다.
바인딩 없습니다: 검색/데이터 SQLGetData ODBC에서 직접 전송
이 메서드를 사용 하면 완전히 데이터베이스 클래스를 무시 하 고 긴 데이터 열을 사용자가 직접 처리.
장점:
필요한 경우 디스크 또는 검색할 수 동적으로 데이터의 양을 결정 하는 데이터를 캐시할 수 있습니다.
단점:
프레임 워크의 얻지 못할 편집 또는 AddNew 를 지원 하 고 작성 해야 기본 기능을 수행 하려면 사용자가 직접 코드 (삭제 열 수준 작업이 없기 때문에 그러나 작동 하지).
이 경우는 긴 데이터 열 레코드 집합에 선택 목록에 있어야 하지만 하는 프레임 워크에 의해 바인딩되지 않습니다.SQL 문을 통해 제공 된 작업을 수행 하는 한 가지 방법은이 GetDefaultSQL 또는 lpszSQL 인수로 CRecordset의 열기 작동, 및 추가 열은 RFX_ 함수 호출에 바인딩할 수 없습니다.언바운드 필드에 바인딩된 필드의 오른쪽에 나타나도록 ODBC 필요, 지금 선택 목록 끝에는 바인딩되지 않은 열 또는 열을 추가 합니다.
[!참고]
프레임 워크에서 긴 데이터 열에 바인딩되지 않은 때문에 변경 내용을 함께 처리 되지 않습니다 CRecordset::Update 호출 합니다.만들어 보낼 필요 SQL 삽입 및 업데이트 문을 직접.