다음을 통해 공유


Long Data 및 SQLSetPos 및 SQLBulkOperations

SQL 문의 매개 변수와 마찬가지로 SQLBulkOperations 또는 SQLSetPos를 사용하여 행을 업데이트하거나 SQLBulkOperations를 사용하여 행을 삽입할 때 긴 데이터를 보낼 수 있습니다. 데이터는 SQLPutData에 대한 여러 호출과 함께 파트로 전송됩니다. 실행 시 데이터를 전송하는 열을 실행 시 데이터 열이라고 합니다.

참고 항목

문자 및 이진 데이터만 파트로 보낼 수 있지만 애플리케이션은 SQLPutData사용하여 실행 시 모든 형식의 데이터를 보낼 수 있습니다. 그러나 데이터가 단일 버퍼에 맞게 충분히 작은 경우 일반적으로 SQLPutData를 사용할 이유가 없습니다. 버퍼를 바인딩하고 드라이버가 버퍼에서 데이터를 검색하도록 하는 것이 훨씬 쉽습니다.

긴 데이터 열은 일반적으로 바인딩되지 않으므로 애플리케이션은 SQLBulkOperations 또는 SQLSetPos를 호출하기 전에 열을 바인딩하고 SQLBulkOperations 또는 SQLSetPos를 호출한 후 바인딩을 해제해야 합니다. SQLBulkOperations 또는 SQLSetPos는 바인딩된 열에서만 작동하며 SQLGetData를 사용하여 열에서 데이터를 검색할 수 있도록 바인딩되지 않아야 하므로 열이 바인딩되어야 합니다.

실행 시 데이터를 보내기 위해 애플리케이션은 다음을 수행합니다.

  1. 데이터 값 대신 행 집합 버퍼에 32비트 값을 배치합니다. 이 값은 나중에 애플리케이션에 반환되므로 애플리케이션은 열 수 또는 데이터가 포함된 파일의 핸들과 같은 의미 있는 값으로 설정해야 합니다.

  2. 길이/표시기 버퍼의 값을 SQL_LEN_DATA_AT_EXEC(길이) 매크로의 결과로 설정합니다. 이 값은 매개 변수에 대한 데이터가 SQLPutData와 함께 전송됨을 드라이버에 나타냅니다. 길이 값은 공간을 미리 할당할 수 있도록 전송될 긴 데이터의 바이트 수를 알아야 하는 데이터 원본에 긴 데이터를 보낼 때 사용됩니다. 데이터 원본에 이 값이 필요한지 여부를 확인하기 위해 애플리케이션은 SQL_NEED_LONG_DATA_LEN 옵션을 사용하여 SQLGetInfo를 호출합니다. 모든 드라이버는 이 매크로를 지원해야 합니다. 데이터 원본에 바이트 길이가 필요하지 않으면 드라이버는 이를 무시할 수 있습니다.

  3. SQLBulkOperations 또는 SQLSetPos를 호출합니다. 드라이버는 길이/표시기 버퍼가 SQL_LEN_DATA_AT_EXEC(length) 매크로의 결과를 포함하고 SQL_NEED_DATA 함수의 반환 값으로 반환합니다.

  4. SQL_NEED_DATA 반환 값에 대한 응답으로 SQLParamData를 호출합니다. 긴 데이터를 보내야 하는 경우 SQLParamDataSQL_NEED_DATA 반환합니다. ValuePtrPtr 인수가 가리키는 버퍼에서 드라이버는 애플리케이션이 행 집합 버퍼에 배치한 고유 값을 반환합니다. 실행 시 데이터 열이 두 개 이상 있는 경우 애플리케이션은 이 값을 사용하여 데이터를 보낼 열을 결정합니다. 드라이버는 특정 순서로 실행 시 데이터 열에 대한 데이터를 요청할 필요가 없습니다.

  5. SQLPutData를 호출하여 열 데이터를 드라이버로 보냅니다. 긴 데이터가 있는 경우처럼 열 데이터가 단일 버퍼에 맞지 않는 경우 애플리케이션은 SQLPutData를 반복적으로 호출하여 데이터를 파트로 보냅니다. 데이터를 다시 어셈블하는 것은 드라이버와 데이터 원본에 달려 있습니다. 애플리케이션이 null로 종료된 문자열 데이터를 전달하는 경우 드라이버 또는 데이터 원본은 리어셈블리 프로세스의 일부로 null 종료 문자를 제거해야 합니다.

  6. SQLParamData를 다시 호출하여 열에 대한 모든 데이터를 전송했음을 나타냅니다. 데이터가 전송되지 않은 실행 시 데이터 열이 있는 경우 드라이버는 다음 실행 시 데이터 열에 대한 SQL_NEED_DATA 및 고유 값을 반환합니다. 애플리케이션이 5단계로 돌아갑니다. 모든 실행 시 데이터 열에 대한 데이터를 전송한 경우 행에 대한 데이터가 데이터 원본으로 전송됩니다. 그런 다음 SQLParamData는 SQL_SUCCESS 또는 SQL_SUCCESS_WITH_INFO 반환하고 SQLBulkOperations 또는 SQLSetPos가 반환할 수 있는 모든 SQLSTATE를 반환할 수 있습니다.

SQLBulkOperations 또는 SQLSetPos가 SQL_NEED_DATA 반환하고 마지막 실행 시 데이터 열에 대해 데이터가 완전히 전송되기 전에 문이 데이터 필요 상태에 있습니다. 이 상태에서 애플리케이션은 SQLPutData, SQLParamData, SQLCancel, SQLGetDiagField 또는 SQLGetDiagRec호출할 수 있습니다. 다른 모든 함수는 SQLSTATE HY010(함수 시퀀스 오류)을 반환합니다. SQLCancel을 호출하면 문 실행이 취소되고 이전 상태로 반환됩니다. 자세한 내용은 부록 B: ODBC 상태 전환 테이블을 참조 하세요.