SQLSetPos 함수

규칙
도입된 버전: ODBC 1.0 표준 준수: ODBC

요약
SQLSetPos는 행 집합에서 커서 위치를 설정하고 애플리케이션이 행 집합의 데이터를 새로 고치거나 결과 집합의 데이터를 업데이트하거나 삭제할 수 있도록 합니다.

구문

  
SQLRETURN SQLSetPos(  
      SQLHSTMT        StatementHandle,  
      SQLSETPOSIROW   RowNumber,  
      SQLUSMALLINT    Operation,  
      SQLUSMALLINT    LockType);  

인수

StatementHandle
[입력] 문 핸들입니다.

RowNumber
[입력] Operation 인수로 지정된 작업을 수행할 행 집합의 행 위치입니다. RowNumber가 0이면 행 집합의 모든 행에 작업이 적용됩니다.

자세한 내용은 "설명"을 참조하세요.

작업
[입력] 수행할 작업:

SQL_POSITION SQL_REFRESH SQL_UPDATE SQL_DELETE

참고 항목

Operation 인수의 SQL_ADD 값은 ODBC 3.x에서 더 이상 사용되지 않습니다. ODBC 3.x 드라이버는 이전 버전과의 호환성을 위해 SQL_ADD 지원해야 합니다. 이 기능은 SQL_ADD 작업으로 SQLBulkOperations에 대한 호출대체되었습니다. ODBC 3.x 애플리케이션이 ODBC 2.x 드라이버에서 작동하는 경우 드라이버 관리자는 SQL_ADD 연산을 사용하여 SQLSetPos에 SQL_ADD 연산사용하여 SQLBulkOperations에 대한 호출을매핑합니다.

자세한 내용은 "설명"을 참조하세요.

LockType
[입력] Operation 인수에 지정된 작업을 수행한 후 행을 잠그는 방법을 지정합니다.

SQL_LOCK_NO_CHANGE SQL_LOCK_EXCLUSIVE SQL_LOCK_UNLOCK

자세한 내용은 "설명"을 참조하세요.

반품

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NEED_DATA, SQL_STILL_EXECUTING, SQL_ERROR 또는 SQL_INVALID_HANDLE.

진단

SQLSetPos가 SQL_ERROR 또는 SQL_SUCCESS_WITH_INFO 반환하는 경우 SQL_HANDLE_STMT HandleTypeHandle of StatementHandle을 사용하여 SQLGetDiagRec 를 호출하여 관련 SQLSTATE 값을 가져올 수 있습니다. 다음 표에서는 SQLSetPos에서 일반적으로 반환되는 SQLSTATE 값을 나열하고 이 함수의 컨텍스트에서 각 값을 설명합니다. 표기법 "(DM)"은 드라이버 관리자가 반환한 SQLSTATE에 대한 설명 앞에 나와 있습니다. 달리 명시되지 않는 한 각 SQLSTATE 값과 연결된 반환 코드는 SQL_ERROR.

SQL_SUCCESS_WITH_INFO 또는 SQL_ERROR 반환할 수 있는 모든 SQLSTATE의 경우(01xxx SQLSTATE 제외) SQL_SUCCESS_WITH_INFO 다중 행 작업의 행 중 하나 이상에서 오류가 발생하는 경우 반환되고 단일 행 작업에서 오류가 발생하면 SQL_ERROR 반환됩니다.

SQLSTATE Error 설명
01000 일반 경고 드라이버 관련 정보 메시지입니다. 함수는 SQL_SUCCESS_WITH_INFO 반환합니다.
01001 커서 작업 충돌 Operation 인수가 SQL_DELETE 또는 SQL_UPDATE 행 또는 둘 이상의 행이 삭제되거나 업데이트되지 않았습니다. (둘 이상의 행에 대한 업데이트에 대한 자세한 내용은 SQL_ATTR_SIMULATE_CURSOR 설명 참조하세요.SQLSetStmtAttr.)의 특성(Function은 SQL_SUCCESS_WITH_INFO 반환합니다.)

Operation 인수가 SQL_DELETE 또는 SQL_UPDATE 낙관적 동시성 때문에 작업이 실패했습니다. 함수는 SQL_SUCCESS_WITH_INFO 반환합니다.
01004 문자열 데이터 오른쪽 잘림 Operation 인수는 SQL_REFRESH 데이터 형식이 SQL_C_CHAR 또는 SQL_C_BINARY 열에 대해 반환된 문자열 또는 이진 데이터로 인해 비블랭크 문자 또는 NULL이 아닌 이진 데이터가 잘렸습니다.
01S01 행의 오류 RowNumber 인수는 0이고 Operation 인수로 지정된 작업을 수행하는 동안 하나 이상의 행에서 오류가 발생했습니다.

(SQL_SUCCESS_WITH_INFO 다중 행 작업의 행 중 하나 이상에서 오류가 발생하는 경우 반환되고, 단일 행 작업에서 오류가 발생하면 SQL_ERROR 반환됩니다.

(이 SQLSTATE는 SQLSetPos는 드라이버가 ODBC 2.x 드라이버이고 커서 라이브러리가 사용되지 않는 경우 SQLExtendedFetch 후에 호출됩니다.)
01S07 분수 잘림 Operation 인수가 SQL_REFRESH, 애플리케이션 버퍼의 데이터 형식이 SQL_C_CHAR 또는 SQL_C_BINARY 않았으며 하나 이상의 열에 대한 애플리케이션 버퍼로 반환된 데이터가 잘렸습니다. 숫자 데이터 형식의 경우 숫자의 소수 부분이 잘렸습니다. 시간, 타임스탬프 및 시간 구성 요소가 포함된 간격 데이터 형식의 경우 시간의 소수 부분이 잘렸습니다.

함수는 SQL_SUCCESS_WITH_INFO 반환합니다.
07006 제한된 데이터 형식 특성 위반 결과 집합에 있는 열의 데이터 값을 SQLBindCol 호출에서 TargetType에 지정된 데이터 형식으로 변환할 수 없습니다.
07009 설명자 인덱스가 잘못되었습니다. 인수 연산 이 SQL_REFRESH 또는 SQL_UPDATE 열이 결과 집합의 열 수보다 큰 열 번호로 바인딩되었습니다.
21S02 파생 테이블의 정도가 열 목록과 일치하지 않음 인수 연산 이 SQL_UPDATE 모든 열이 바인딩되지 않았거나 읽기 전용이거나 바인딩된 길이/표시기 버퍼의 값이 SQL_COLUMN_IGNORE 열이 없습니다.
22001 문자열 데이터, 오른쪽 잘림 Operation 인수가 SQL_UPDATE 열에 문자 또는 이진 값을 할당하면 비블랭크(문자의 경우) 또는 null이 아닌 문자 또는 바이트가 잘렸습니다.
22003 숫자 값이 범위를 벗어났습니다. 인수 연산 이 SQL_UPDATE 결과 집합의 열에 숫자 값을 할당하면 숫자의 전체 부분(소수점이 아닌)이 잘렸습니다.

인수 연산 이 SQL_REFRESH 하나 이상의 바인딩된 열에 대한 숫자 값을 반환하면 상당한 자릿수가 손실될 수 있습니다.
22007 날짜/시간 형식이 잘못되었습니다. 인수 작업이 SQL_UPDATE 결과 집합의 열에 날짜 또는 타임스탬프 값을 할당하면 연도, 월 또는 일 필드가 범위를 벗어났습니다.

인수 작업이 SQL_REFRESH 하나 이상의 바인딩된 열에 대한 날짜 또는 타임스탬프 값을 반환하면 연도, 월 또는 일 필드가 범위를 벗어났습니다.
22008 날짜/시간 필드 오버플로 Operation 인수는 SQL_UPDATE 결과 집합의 열로 전송되는 데이터에 대한 datetime 산술 연산의 성능으로 인해 날짜/시간 필드(연도, 월, 일, 시간, 분 또는 두 번째 필드)가 필드에 허용되는 값 범위를 벗어나거나 날짜/시간에 대한 양력의 자연 규칙에 따라 유효하지 않습니다.

작업 인수가 SQL_REFRESH 결과 집합에서 검색되는 데이터에 대한 datetime 산술 연산의 성능으로 인해 날짜/시간 필드(연도, 월, 일, 시간, 분 또는 두 번째 필드)가 필드에 허용되는 값 범위를 벗어나거나 날짜/시간에 대한 양력의 자연 규칙에 따라 유효하지 않습니다.
22015 간격 필드 오버플로 Operation 인수가 SQL_UPDATE 간격 SQL 데이터 형식에 정확한 숫자 또는 간격 C 형식을 할당하면 상당한 자릿수가 손실되었습니다.

Operation 인수는 SQL_UPDATE. 간격 SQL 형식에 할당할 때 간격 SQL 형식에서 C 형식의 값을 표현하지 않았습니다.

Operation 인수가 SQL_REFRESH 정확한 숫자 또는 간격 SQL 형식에서 간격 C 형식으로 할당하면 선행 필드에서 상당한 자릿수가 손실되었습니다.

Operation 인수는 새로 고침에 SQL_. 간격 C 형식에 할당할 때 간격 C 형식에 SQL 형식의 값에 대한 표현이 없었습니다.
22018 캐스트 사양에 잘못된 문자 값 Operation 인수는 SQL_REFRESH. C 형식은 정확하거나 근사적인 숫자, 날짜/시간 또는 간격 데이터 형식이고, 열의 SQL 형식은 문자 데이터 형식이고 열의 값은 바인딩된 C 형식의 유효한 리터럴이 아니었습니다.

인수 연산 은 SQL_UPDATE. SQL 형식은 정확하거나 근사적인 숫자, 날짜/시간 또는 간격 데이터 형식이고, C 형식은 SQL_C_CHAR; 열의 값은 바인딩된 SQL 형식의 유효한 리터럴이 아니었습니다.
23000 무결성 제약 조건 위반 인수 작업이 SQL_DELETE 또는 SQL_UPDATE 무결성 제약 조건을 위반했습니다.
24000 커서 상태가 잘못되었습니다. StatementHandle이 실행된 상태였지만 결과 집합이 StatementHandle연결되지 않았습니다.

(DM) StatementHandle에서 커서가 열려 있지만 SQLFetch 또는 SQLFetchScroll이 호출되지 않았습니다.

StatementHandle에서 커서가 열려 있고 SQLFetch 또는 SQLFetchScroll이 호출되었지만 결과 집합이 시작되기 전이나 결과 집합의 끝 뒤에 커서가 배치되었습니다.

인수 연산 이 SQL_DELETE, SQL_REFRESH 또는 SQL_UPDATE 결과 집합이 시작되기 전이나 결과 집합의 끝 뒤에 커서가 배치되었습니다.
40001 Serialization 실패 다른 트랜잭션과의 리소스 교착 상태 때문에 트랜잭션이 롤백되었습니다.
40003 문 완성을 알 수 없음 이 함수를 실행하는 동안 연결된 연결이 실패했으며 트랜잭션 상태를 확인할 수 없습니다.
42000 구문 오류 또는 액세스 위반 드라이버가 인수 작업에서 요청된 작업을 수행하기 위해 필요에 따라 행을 잠글 수 없습니다.

드라이버가 LockType 인수에서 요청된 대로 행을 잠글 수 없습니다.
44000 WITH CHECK OPTION 위반 Operation 인수는 SQL_UPDATE 업데이트가 수행되었으며, 업데이트의 영향을 받는 하나 이상의 행이 더 이상 보기 테이블에 존재하지 않도록 WITH CHECK OPTION을 지정하여 만든 뷰된 테이블에서 파생된 테이블 또는 뷰된 테이블에서 업데이트가 수행되었습니다.
HY000 일반 오류 특정 SQLSTATE가 없고 구현별 SQLSTATE가 정의되지 않은 오류가 발생했습니다. *MessageText 버퍼의 SQLGetDiagRec에서 반환된 오류 메시지는 오류와 그 원인을 설명합니다.
HY001 메모리 할당 오류 드라이버가 함수 실행 또는 완료를 지원하는 데 필요한 메모리를 할당할 수 없습니다.
HY008 작업이 취소됨 StatementHandle에 대해 비동기 처리를 사용하도록 설정했습니다. 함수가 호출되었고 실행이 완료되기 전에 StatementHandle에서 SQLCancel 또는 SQLCancelHandle이 호출된 후 StatementHandle에서 함수가 다시 호출되었습니다.

함수가 호출되었고 실행을 완료하기 전에 다중 스레드 애플리케이션의 다른 스레드에서 StatementHandle에서 SQLCancel 또는 SQLCancelHandle이 호출되었습니다.
HY010 함수 시퀀스 오류 (DM) StatementHandle과 연결된 연결 핸들에 대해 비동기적으로 실행되는 함수가 호출되었습니다. 이 비동기 함수는 SQLSetPos 함수가 호출되었을 때 계속 실행되었습니다.

(DM) 지정된 StatementHandle 이 실행된 상태가 아닙니다. 이 함수는 먼저 SQLExecDirect, SQLExecute 또는 카탈로그 함수를 호출하지 않고 호출되었습니다.

(DM) 이 함수가 아닌 비동기 실행 함수가 StatementHandle에 대해 호출되었고 이 함수가 호출되었을 때 계속 실행되고 있었습니다.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations 또는 SQLSetPos가 StatementHandle에 대해 호출되고 SQL_NEED_DATA 반환되었습니다. 이 함수는 모든 실행 시 데이터 매개 변수 또는 열에 대한 데이터를 보내기 전에 호출되었습니다.

(DM) 드라이버는 ODBC 2.x 드라이버였고 SQLFetch가 호출된 후 SQLSetPos가 StatementHandle에 대해 호출되었습니다.
HY011 지금은 특성을 설정할 수 없습니다. (DM) 드라이버는 ODBC 2.x 드라이버였고, SQL_ATTR_ROW_STATUS_PTR 문 특성이 설정되었으며 SQLFetch, SQLFetchScroll 또는 SQLExtendedFetch가 호출되기 전에 SQLSetPos가 호출되었습니다.
HY013 메모리 관리 오류 메모리 조건이 낮기 때문에 기본 메모리 개체에 액세스할 수 없기 때문에 함수 호출을 처리할 수 없습니다.
HY090 잘못된 문자열 또는 버퍼 길이 Operation 인수가 SQL_UPDATE 데이터 값이 null 포인터이고 열 길이 값이 0, SQL_DATA_AT_EXEC, SQL_COLUMN_IGNORE, SQL_NULL_DATA 또는 SQL_LEN_DATA_AT_EXEC_OFFSET 보다 작거나 같지 않았습니다.

Operation 인수가 SQL_UPDATE, 데이터 값이 null 포인터가 아니고, C 데이터 형식이 SQL_C_BINARY 또는 SQL_C_CHAR; 열 길이 값이 0보다 작지만 SQL_DATA_AT_EXEC, SQL_COLUMN_IGNORE, SQL_NTS 또는 SQL_NULL_DATA 같지 않거나 SQL_LEN_DATA_AT_EXEC_OFFSET 작거나 같지 않습니다.

길이/표시기 버퍼의 값이 SQL_DATA_AT_EXEC; SQL 형식은 SQL_LONGVARCHAR, SQL_LONGVARBINARY 또는 긴 데이터 원본별 데이터 형식입니다. SQLGetInfo의 SQL_NEED_LONG_DATA_LEN 정보 유형이 "Y"였습니다.
HY092 잘못된 특성 식별자 (DM) Operation 인수에 지정된 값이 잘못되었습니다.

(DM) LockType 인수에 지정된 값이 잘못되었습니다.

Operation 인수가 SQL_UPDATE 또는 SQL_DELETE SQL_ATTR_CONCURRENCY 문 특성이 SQL_ATTR_CONCUR_READ_ONLY.
HY107 행 값이 범위를 벗어났습니다. RowNumber 인수에 지정된 값이 행 집합의 행 수보다 큽니다.
HY109 커서 위치가 잘못되었습니다. StatementHandle연결된 커서가 정방향 전용으로 정의되었으므로 커서를 행 집합 내에 배치할 수 없습니다. SQLSetStmtAttr의 SQL_ATTR_CURSOR_TYPE 특성에 대한 설명을 참조하세요.

Operation 인수가 SQL_UPDATE, SQL_DELETE 또는 SQL_REFRESH RowNumber 인수로 식별된 행이 삭제되었거나 가져오지 않았습니다.

(DM) RowNumber 인수가 0이고 Operation 인수가 SQL_POSITION.

SQLSetPos는 SQLBulkOperations가 호출된 후 및 SQLFetchScroll 또는 SQLFetch가 호출되기 전에 호출되었습니다.
HY117 알 수 없는 트랜잭션 상태로 인해 연결이 일시 중단됩니다. 연결 끊기 및 읽기 전용 함수만 허용됩니다. (DM) 일시 중단 상태에 대한 자세한 내용은 SQLEndTran 함수를 참조 하세요.
HYC00 선택적 기능이 구현되지 않음 드라이버 또는 데이터 원본은 Operation 인수 또는 LockType 인수에서 요청된 작업을 지원하지 않습니다.
HYT00 시간 제한 만료됨 데이터 원본이 결과 집합을 반환하기 전에 쿼리 제한 시간이 만료되었습니다. 시간 제한 기간은 특성이 SQL_ATTR_QUERY_TIMEOUT SQLSetStmtAttr 통해 설정됩니다.
HYT01 연결 제한 시간이 만료됨 데이터 원본이 요청에 응답하기 전에 연결 제한 시간이 만료되었습니다. 연결 제한 시간은 SQL_ATTR_CONNECTION_TIMEOUT SQLSetConnectAttr를 통해 설정됩니다.
IM001 드라이버는 이 함수를 지원하지 않습니다. (DM) StatementHandle연결된 드라이버는 함수를 지원하지 않습니다.
IM017 비동기 알림 모드에서 폴링을 사용할 수 없습니다. 알림 모델을 사용할 때마다 폴링이 비활성화됩니다.
IM018 이 핸들에서 이전 비동기 작업을 완료하기 위해 SQLCompleteAsync 가 호출되지 않았습니다. 핸들의 이전 함수 호출이 SQL_STILL_EXECUTING 반환하고 알림 모드가 활성화된 경우 사후 처리를 수행하고 작업을 완료하려면 핸들에서 SQLCompleteAsync 를 호출해야 합니다.

주석

주의

문에 SQLSetPos호출할 수 있으며 ODBC 2.x 애플리케이션과의 호환성을 위해 수행해야 하는 작업에 대한 자세한 내용은 블록 커서, 스크롤 가능한 커서 및 이전 버전과의 호환성을 참조하세요.

RowNumber 인수

RowNumber 인수는 Operation 인수로 지정된 작업을 수행할 행 집합의 행 수를 지정합니다. RowNumber가 0이면 행 집합의 모든 행에 작업이 적용됩니다. RowNumber 는 0부터 행 집합의 행 수까지의 값이어야 합니다.

참고 항목

C 언어에서 배열은 0부터 시작하고 RowNumber 인수는 1부터 사용합니다. 예를 들어 행 집합의 다섯 번째 행을 업데이트하기 위해 애플리케이션은 배열 인덱스 4에서 행 집합 버퍼를 수정하지만 RowNumber는 5로 지정합니다.

모든 작업은 RowNumber로 지정된 행에 커서를 놓습니다. 다음 작업에는 커서 위치가 필요합니다.

  • 위치가 지정된 업데이트 및 삭제 문입니다.

  • SQLGetData호출합니다.

  • SQL_DELETE, SQL_REFRESH 및 SQL_UPDATE 옵션을 사용하여 SQLSetPos를 호출합니다.

예를 들어 SQL_DELETE 연산을 사용하여 SQLSetPos 를 호출할 때 RowNumber가 2이면 커서가 행 집합의 두 번째 행에 배치되고 해당 행이 삭제됩니다. 두 번째 행에 대한 구현 행 상태 배열(SQL_ATTR_ROW_STATUS_PTR 문 특성이 가리키는)의 항목이 SQL_ROW_DELETED 변경됩니다.

애플리케이션은 SQLSetPos를 호출 할 때 커서 위치를 지정할 수 있습니다. 일반적으로 SQL_POSITION 또는 SQL_REFRESH 작업을 사용하여 SQLSetPos를 호출하여 위치 지정된 업데이트 또는 삭제 문을 실행하거나 SQLGetData를 호출하기 전에 커서를 배치합니다.

Operation Argument

Operation 인수는 다음 작업을 지원합니다. 데이터 원본에서 지원되는 옵션을 결정하기 위해 애플리케이션은 커서 유형에 따라 SQL_DYNAMIC_CURSOR_ATTRIBUTES1, SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1, SQL_KEYSET_CURSOR_ATTRIBUTES1 또는 SQL_STATIC_CURSOR_ATTRIBUTES1 정보 유형을 사용하여 SQLGetInfo를 호출합니다.

작업

argument
Operation
SQL_POSITION 드라이버는 RowNumber로 지정된 행에 커서를 놓습니다.

SQL_ATTR_ROW_OPERATION_PTR 문 특성이 가리키는 행 상태 배열의 내용은 SQL_POSITION 작업에 대해 무시됩니다.
SQL_REFRESH 드라이버는 RowNumber로 지정된 행에 커서를 놓고 해당 행에 대한 행 집합 버퍼의 데이터를 새로 고칩니다. 드라이버가 행 집합 버퍼의 데이터를 반환하는 방법에 대한 자세한 내용은 SQLBindCol에서 행 단위 및 열 단위 바인딩에 대한 설명을 참조하세요.

SQL_REFRESH 작업이 있는 SQLSetPos는 현재 페치된 행 집합 내의 행 상태와 콘텐츠를 업데이트합니다. 여기에는 책갈피 새로 고침이 포함됩니다. 버퍼의 데이터는 새로 고쳐지지만 다시 래치되지 않으므로 행 집합의 멤버 자격은 고정됩니다. 이는 SQL_FETCH_RELATIVE FetchOrientation과 0과 같은 RowNumber를 사용하여 SQLFetchScroll 을 호출하여 수행되는 새로 고침과 다릅니다. 이 새로 고침은 추가된 데이터를 표시하고 드라이버와 커서에서 해당 작업을 지원하는 경우 삭제된 데이터를 제거할 수 있도록 결과 집합에서 행 집합을 다시 설정합니다.

SQLSetPos사용한 성공적인 새로 고침은 SQL_ROW_DELETED 행 상태를 변경하지 않습니다. 행 집합 내의 삭제된 행은 다음 페치까지 삭제된 것으로 계속 표시됩니다. 커서가 압축을 지원하는 경우(후속 SQLFetch 또는 SQLFetchScroll 이 삭제된 행을 반환하지 않음) 다음 인출 시 행이 사라집니다.

SQLSetPos를 사용하여 새로 고침을 수행할 때 추가된 행이 표시되지 않습니다. 이 동작은 fetchType이 SQL_FETCH_RELATIVE RowNumber가 0인 SQLFetchScroll다르며, 현재 행 집합도 새로 고쳐지지만 커서에서 이러한 작업을 지원하는 경우 추가된 레코드 또는 팩 삭제된 레코드가 표시됩니다.

SQLSetPos사용하여 성공적으로 새로 고침하면 행 상태 배열이 있는 경우 SQL_ROW_ADDED 행 상태가 SQL_ROW_SUCCESS 변경됩니다.

SQLSetPos사용하여 성공적으로 새로 고침하면 행 상태 배열이 있는 경우 SQL_ROW_UPDATED 행 상태가 행의 새 상태로 변경됩니다.

행의 SQLSetPos 작업에서 오류가 발생하면 행 상태가 SQL_ROW_ERROR(행 상태 배열이 있는 경우)로 설정됩니다.

SQL_CONCUR_ROWVER 또는 SQL_CONCUR_VALUES SQL_ATTR_CONCURRENCY 문 특성으로 열린 커서의 경우 SQLSetPos사용하여 새로 고침하면 데이터 원본에서 사용하는 낙관적 동시성 값을 업데이트하여 행이 변경되었음을 감지할 수 있습니다. 이 경우 서버에서 행 집합 버퍼를 새로 고칠 때마다 커서 동시성을 보장하는 데 사용되는 행 버전 또는 값이 업데이트됩니다. 새로 고쳐지는 각 행에 대해 발생합니다.

SQL_ATTR_ROW_OPERATION_PTR 문 특성이 가리키는 행 상태 배열의 내용은 SQL_REFRESH 작업에 대해 무시됩니다.
SQL_UPDATE 드라이버는 RowNumber로 지정된 행에 커서를 놓고 행 집합 버퍼의 값(SQLBindCol의 TargetValuePtr 인수)으로 데이터의 기본 행을 업데이트합니다. 길이/표시기 버퍼(SQLBindCol의 StrLen_or_IndPtr 인수)에서 데이터의 길이를 검색합니다. 열의 길이가 SQL_COLUMN_IGNORE 경우 열이 업데이트되지 않습니다. 행을 업데이트한 후 드라이버는 행 상태 배열의 해당 요소를 SQL_ROW_UPDATED 또는 SQL_ROW_SUCCESS_WITH_INFO 변경합니다(행 상태 배열이 있는 경우).

SQL_UPDATE Operation 인수가 있는 SQLSetPos 가 중복 열을 포함하는 커서에서 호출되는 경우 동작은 드라이버에서 정의됩니다. 드라이버는 드라이버 정의 SQLSTATE를 반환하거나, 결과 집합에 표시되는 첫 번째 열을 업데이트하거나, 다른 드라이버 정의 동작을 수행할 수 있습니다.

SQL_ATTR_ROW_OPERATION_PTR 문 특성이 가리키는 행 작업 배열을 사용하여 대량 업데이트 중에 현재 행 집합의 행을 무시해야 함을 나타낼 수 있습니다. 자세한 내용은 이 함수 참조의 뒷부분에 있는 "상태 및 작업 배열"을 참조하세요.
SQL_DELETE 드라이버는 RowNumber로 지정된 행에 커서를 놓고 데이터의 기본 행을 삭제합니다. 행 상태 배열의 해당 요소를 SQL_ROW_DELETED 변경합니다. 행이 삭제된 후에는 위치가 지정된 업데이트 및 삭제 문, SQLGetData 호출 및 작업이 SQL_POSITION 제외한 모든 항목으로 설정된 SQLSetPos에 대한 호출과 같은 행에 대해 유효하지 않습니다. 압축을 지원하는 드라이버의 경우 데이터 원본에서 새 데이터를 검색할 때 커서에서 행이 삭제됩니다.

행이 계속 표시되는지 여부는 커서 유형에 따라 달라집니다. 예를 들어 삭제된 행은 정적 및 키 집합 기반 커서에 표시되지만 동적 커서에는 보이지 않습니다.

SQL_ATTR_ROW_OPERATION_PTR 문 특성이 가리키는 행 작업 배열을 사용하여 대량 삭제 중에 현재 행 집합의 행을 무시해야 함을 나타낼 수 있습니다. 자세한 내용은 이 함수 참조의 뒷부분에 있는 "상태 및 작업 배열"을 참조하세요.

LockType 인수

LockType 인수는 애플리케이션이 동시성을 제어하는 방법을 제공합니다. 대부분의 경우 동시성 수준 및 트랜잭션을 지원하는 데이터 원본은 LockType 인수의 SQL_LOCK_NO_CHANGE 값만 지원합니다. LockType 인수는 일반적으로 파일 기반 지원에만 사용됩니다.

LockType 인수는 SQLSetPos가 실행된 후 행의 잠금 상태를 지정합니다. 드라이버가 요청된 작업을 수행하거나 LockType 인수를 충족하기 위해 행을 잠글 수 없는 경우 SQL_ERROR 및 SQLSTATE 42000(구문 오류 또는 액세스 위반)을 반환합니다.

LockType 인수는 단일 문에 대해 지정되지만 잠금은 연결의 모든 문에 동일한 권한을 부여합니다. 특히 연결의 한 문에서 잠금을 획득하는 잠금은 동일한 연결의 다른 문에 의해 잠금 해제될 수 있습니다.

애플리케이션이 LockType이 SQL_LOCK_UNLOCK 설정된 행에 대해 SQLSetPos를 호출하거나 애플리케이션이 SQL_CLOSE 옵션을 사용하여 문 또는 SQLFreeStmt에 대해 SQLFreeHandle을 호출할 때까지 SQLSetPos를 통해 잠긴 행은 잠깁니다. 트랜잭션을 지원하는 드라이버의 경우 애플리케이션이 SQLEndTran을 호출하여 연결에서 트랜잭션을 커밋하거나 롤백할 때 SQLSetPos를 통해 잠긴 행의 잠금이 해제됩니다(트랜잭션이 커밋되거나 롤백될 때 커서가 닫힌 경우 SQLGetInfo에서 반환된 SQL_CURSOR_COMMIT_BEHAVIOR 및 SQL_CURSOR_ROLLBACK_BEHAVIOR 정보 유형으로 표시됨).

LockType 인수는 다음과 같은 유형의 잠금을 지원합니다. 데이터 원본에서 지원되는 잠금을 확인하기 위해 애플리케이션은 커서 유형에 따라 SQL_DYNAMIC_CURSOR_ATTRIBUTES1, SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1, SQL_KEYSET_CURSOR_ATTRIBUTES1 또는 SQL_STATIC_CURSOR_ATTRIBUTES1 정보 유형을 사용하여 SQLGetInfo를 호출합니다.

LockType 인수 잠금 유형
SQL_LOCK_NO_CHANGE 드라이버 또는 데이터 원본은 행이 SQLSetPos가 호출되기 전 과 동일한 잠금 또는 잠금 해제 상태인지 확인합니다 . 이 LockType 값을 사용하면 명시적 행 수준 잠금을 지원하지 않는 데이터 원본이 현재 동시성 및 트랜잭션 격리 수준에 필요한 잠금을 사용할 수 있습니다.
SQL_LOCK_EXCLUSIVE 드라이버 또는 데이터 원본은 행을 단독으로 잠급 수 있습니다. 다른 연결 또는 다른 애플리케이션의 문은 행에 대한 잠금을 획득하는 데 사용할 수 없습니다.
SQL_LOCK_UNLOCK 드라이버 또는 데이터 원본이 행의 잠금을 해제합니다.

드라이버가 SQL_LOCK_EXCLUSIVE 지원하지만 SQL_LOCK_UNLOCK 지원하지 않는 경우 잠긴 행은 이전 단락에서 설명한 함수 호출 중 하나가 발생할 때까지 잠긴 상태로 유지됩니다.

드라이버가 SQL_LOCK_EXCLUSIVE 지원하지만 SQL_LOCK_UNLOCK 지원하지 않는 경우 애플리케이션이 문에 대해 SQLFreeHandle을 호출하거나 SQL_CLOSE 옵션을 사용하여 SQLFreeStmt를 호출할 때까지 잠긴 행이 잠깁니다. 드라이버가 트랜잭션을 지원하고 트랜잭션을 커밋하거나 롤백할 때 커서를 닫으면 애플리케이션은 SQLEndTran을 호출합니다.

SQLSetPos의 업데이트 및 삭제 작업의 경우 애플리케이션은 다음과 같이 LockType 인수를 사용합니다.

  • 행이 검색된 후 변경되지 않도록 하기 위해 애플리케이션은 작업이 SQL_REFRESH 설정되고 LockType이 SQL_LOCK_EXCLUSIVE 설정된 SQLSetPos 를 호출합니다.

  • 애플리케이션이 LockType을 SQL_LOCK_NO_CHANGE 설정하는 경우 드라이버는 애플리케이션이 SQL_ATTR_CONCURRENCY 문 특성에 대해 SQL_CONCUR_LOCK 지정한 경우에만 업데이트 또는 삭제 작업이 성공하도록 보장합니다.

  • 애플리케이션이 SQL_ATTR_CONCURRENCY 문 특성에 대한 SQL_CONCUR_ROWVER 또는 SQL_CONCUR_VALUES 지정하는 경우 드라이버는 행 버전 또는 값을 비교하고 애플리케이션이 행을 가져온 이후 행이 변경된 경우 작업을 거부합니다.

  • 애플리케이션이 SQL_ATTR_CONCURRENCY 문 특성에 대한 SQL_CONCUR_READ_ONLY 지정하는 경우 드라이버는 업데이트 또는 삭제 작업을 거부합니다.

SQL_ATTR_CONCURRENCY 문 특성에 대한 자세한 내용은 SQLSetStmtAttr을 참조하세요.

상태 및 작업 배열

SQLSetPos를 호출할 때 사용되는 상태 및 작업 배열은 다음과 같습니다.

  • 행 상태 배열(IRD 및 SQL_ATTR_ROW_STATUS_ARRAY 문 특성의 SQL_DESC_ARRAY_STATUS_PTR 필드가 가리키는 대로)에는 행 집합의 각 데이터 행에 대한 상태 값이 포함됩니다. 드라이버는 SQLFetch, SQLFetchScroll, SQLBulkOperations 또는 SQLSetPos를 호출한 후 이 배열의 상태 값을 설정합니다. 이 배열은 SQL_ATTR_ROW_STATUS_PTR 문 특성으로 가리켰습니다.

  • 행 작업 배열(ARD 및 SQL_ATTR_ROW_OPERATION_ARRAY 문 특성의 SQL_DESC_ARRAY_STATUS_PTR 필드가 가리키는 대로)에는 대량 작업에 대한 SQLSetPos 호출이 무시되는지 또는 수행되는지 여부를 나타내는 행 집합의 각 행에 대한 값이 포함됩니다. 배열의 각 요소는 SQL_ROW_PROCEED(기본값) 또는 SQL_ROW_IGNORE 설정됩니다. 이 배열은 SQL_ATTR_ROW_OPERATION_PTR 문 특성으로 가리켰습니다.

상태 및 작업 배열의 요소 수는 행 집합의 행 수와 같아야 합니다(SQL_ATTR_ROW_ARRAY_SIZE 문 특성으로 정의됨).

행 상태 배열에 대한 자세한 내용은 SQLFetch를 참조하세요. 행 작업 배열에 대한 자세한 내용은 이 섹션의 뒷부분에 나오는 "대량 작업에서 행 무시"를 참조하세요.

SQLSetPos 사용

애플리케이션이 SQLSetPos를 호출하기 전에 다음 단계 시퀀스를 수행해야 합니다.

  1. 애플리케이션이 SQL_UPDATE 작업 집합을 사용하여 SQLSetPos를 호출하는 경우 각 열에 대해 SQLBindCol(또는 SQLSetDescRec)을 호출하여 해당 데이터 형식을 지정하고 열의 데이터 및 길이에 대한 버퍼를 바인딩합니다.

  2. 애플리케이션이 작업을 SQL_DELETE 또는 SQL_UPDATE 설정하여 SQLSetPos를 호출하는 경우 SQLColAttribute를 호출하여 삭제하거나 업데이트할 열을 업데이트할 수 있는지 확인합니다.

  3. SQLExecDirect, SQLExecute 또는 카탈로그 함수를 호출하여 결과 집합을 만듭니다.

  4. SQLFetch 또는 SQLFetchScroll을 호출하여 데이터를 검색합니다.

SQLSetPos 사용에 대한 자세한 내용은 SQLSetPos를 사용하여 데이터 업데이트를 참조하세요.

SQLSetPos를 사용하여 데이터 삭제

SQLSetPos를 사용하여 데이터를 삭제하기 위해 애플리케이션은 RowNumber가 삭제할 행의 수로 설정된 SQLSetPos를 호출하고 작업은 SQL_DELETE 설정됩니다.

데이터가 삭제된 후 드라이버는 적절한 행에 대한 구현 행 상태 배열의 값을 SQL_ROW_DELETED(또는 SQL_ROW_ERROR)로 변경합니다.

SQLSetPos를 사용하여 데이터 업데이트

애플리케이션은 바인딩된 데이터 버퍼 또는 SQLPutData에 대한 하나 이상의 호출을 사용하여 열에 대한 값을 전달할 수 있습니다. SQLPutData를 사용하여 데이터가 전달되는 열을 실행시 데이터 열이라고 합니다. 일반적으로 SQL_LONGVARBINARY 및 SQL_LONGVARCHAR 열에 대한 데이터를 보내는 데 사용되며 다른 열과 혼합할 수 있습니다.

애플리케이션인 SQLSetPos를 사용하여 데이터를 업데이트하려면:

  1. SQLBindCol로 바인딩된 데이터 및 길이/표시기 버퍼에 값을 배치합니다.

    • 일반 열의 경우 애플리케이션은 *TargetValuePtr 버퍼에 새 열 값과 해당 값의 길이를 *StrLen_or_IndPtr 버퍼에 배치합니다. 행을 업데이트하지 않아야 하는 경우 애플리케이션은 행 작업 배열의 해당 행 요소에 SQL_ROW_IGNORE 배치합니다.

    • 실행 시 데이터 열의 경우 애플리케이션은 *TargetValuePtr 버퍼에 열 번호와 같은 애플리케이션 정의 값을 배치합니다. 이 값은 나중에 열을 식별하는 데 사용할 수 있습니다.

      애플리케이션은 *StrLen_or_IndPtr 버퍼에 SQL_LEN_DATA_AT_EXEC(length) 매크로의 결과를 배치합니다. 열의 SQL 데이터 형식이 SQL_LONGVARBINARY, SQL_LONGVARCHAR 또는 긴 데이터 원본별 데이터 형식이고 드라이버가 SQLGetInfo의 SQL_NEED_LONG_DATA_LEN 정보 형식에 대해 "Y"를 반환하는 경우 길이는 매개 변수에 대해 보낼 데이터의 바이트 수입니다. 그렇지 않으면 음수가 아닌 값이어야 하며 무시됩니다.

  2. 작업 인수가 SQL_UPDATE 설정된 SQLSetPos 를 호출하여 데이터 행을 업데이트합니다.

    • 실행 시 데이터 열이 없으면 프로세스가 완료됩니다.

    • 실행 시 데이터 열이 있는 경우 함수는 SQL_NEED_DATA 반환하고 3단계로 진행합니다.

  3. SQLParamData를 호출하여 처리할 첫 번째 실행 시 데이터 열에 대한 *TargetValuePtr 버퍼의 주소를 검색합니다. SQLParamData 는 SQL_NEED_DATA 반환합니다. 애플리케이션은 *TargetValuePtr 버퍼에서 애플리케이션 정의 값을 검색합니다.

    참고 항목

    실행 시 데이터 매개 변수는 실행 시 데이터 열과 유사하지만 SQLParamData에서 반환되는 값은 각각 다릅니다.

    참고 항목

    실행 시 데이터 매개 변수는 SQLExecDirect 또는 SQLExecute를 사용하여 문을 실행할 때 SQLPutData와 함께 데이터를 보내는 SQL 문의 매개 변수입니다. SQLBindParameter 또는 SQLSetDescRec를 사용하여 설명자를 설정하여 바인딩됩니다. SQLParamData에서 반환되는 값은 ParameterValuePtr 인수에서 SQLBindParameter전달된 32비트 값입니다.

    참고 항목

    실행 시 데이터 열은 행이 SQLSetPos로 업데이트될 때 SQLPutData와 함께 데이터를 보낼 행 집합의 열입니다. SQLBindCol바인딩됩니다. SQLParamData에서 반환되는 값은 처리 중인 *TargetValuePtr 버퍼에 있는 행의 주소입니다.

  4. SQLPutData를 한 번 이상 호출하여 열에 대한 데이터를 보냅니다. SQLPutData에 지정된 *TargetValuePtr 버퍼에 모든 데이터 값을 반환할 수 없는 경우 두 개 이상의 호출이 필요합니다. 동일한 열에 대해 SQLPutData에 대한 여러 호출은 문자, 이진 또는 데이터 원본별 데이터 형식이 있는 열로 문자 C 데이터를 보내거나 문자가 있는 열에 이진 C 데이터를 보낼 때만 허용됩니다. 이진 또는 데이터 원본별 데이터 형식입니다.

  5. SQLParamData를 다시 호출하여 열에 대한 모든 데이터가 전송되었음을 알릴 수 있습니다.

    • 실행 시 데이터 열이 더 많은 경우 SQLParamData는 처리할 다음 실행 시 데이터 열에 대한 SQL_NEED_DATA 및 TargetValuePtr 버퍼의 주소를 반환합니다. 애플리케이션은 4단계와 5단계를 반복합니다.

    • 실행 시 데이터 열이 더 이상 없으면 프로세스가 완료됩니다. 문이 성공적으로 실행된 경우 SQLParamData 는 SQL_SUCCESS 반환하거나 SQL_SUCCESS_WITH_INFO; 실행이 실패하면 SQL_ERROR 반환합니다. 이 시점에서 SQLParamData는 SQLSetPos에서 반환할 수 있는 모든 SQLSTATE를 반환할 수 있습니다.

데이터가 업데이트된 경우 드라이버는 적절한 행에 대한 구현 행 상태 배열의 값을 SQL_ROW_UPDATED 변경합니다.

작업이 취소되거나 SQLParamData 또는 SQLPutData에서 오류가 발생하는 경우 SQLSetPos 가 SQL_NEED_DATA 반환하고 모든 실행 시 데이터 열에 대해 데이터를 전송하기 전에 애플리케이션은 문 또는 문과 연결된 연결에 대해 SQLCancel, SQLGetDiagField, SQLGetDiagRec, SQLGetFunctions, SQLParamData 또는 SQLPutData호출할 수 있습니다. 문 또는 문과 연결된 연결에 대해 다른 함수를 호출하는 경우 함수는 SQL_ERROR 및 SQLSTATE HY010(함수 시퀀스 오류)을 반환합니다.

애플리케이션이 SQLCancel을 호출하는 동안 드라이버에 실행 시 데이터 열에 대한 데이터가 여전히 필요한 경우 드라이버는 작업을 취소합니다. 그러면 애플리케이션에서 SQLSetPos를 다시 호출할 수 있습니다. 취소는 커서 상태 또는 현재 커서 위치에 영향을 주지 않습니다.

커서와 연결된 쿼리 사양의 SELECT-list에 동일한 열에 대한 참조가 두 개 이상 포함된 경우 오류가 생성되거나 드라이버가 중복된 참조를 무시하고 요청된 작업을 수행하는지 여부는 드라이버 정의입니다.

대량 작업 수행

RowNumber 인수가 0이면 드라이버는 SQL_ATTR_ROW_OPERATION_PTR 문 특성이 가리키는 행 작업 배열의 필드에 SQL_ROW_PROCEED 값이 있는 행 집합의 모든 행에 대해 Operation 인수에 지정된 작업을 수행합니다. SQL_DELETE, SQL_REFRESH 또는 SQL_UPDATE Operation 인수에 대한 RowNumber 인수의 유효한 값이지만 SQL_POSITION 않습니다. SQL_POSITION 연산과 RowNumber가 0인 SQLSetPos는 SQLSTATE HY109(잘못된 커서 위치)를 반환합니다.

SQLSTATE HYT00(제한 시간 만료)과 같은 전체 행 집합과 관련된 오류가 발생하면 드라이버는 SQL_ERROR 및 적절한 SQLSTATE를 반환합니다. 행 집합 버퍼의 내용은 정의되지 않으며 커서 위치는 변경되지 않습니다.

단일 행과 관련된 오류가 발생하면 드라이버는 다음을 수행합니다.

  • SQL_ATTR_ROW_STATUS_PTR 문 특성이 가리키는 행 상태 배열의 행 요소를 SQL_ROW_ERROR 설정합니다.

  • 오류 큐의 오류에 대한 하나 이상의 추가 SQLSTATE를 게시하고 진단 데이터 구조의 SQL_DIAG_ROW_NUMBER 필드를 설정합니다.

오류 또는 경고를 처리한 후 드라이버가 행 집합의 나머지 행에 대한 작업을 완료하면 SQL_SUCCESS_WITH_INFO 반환합니다. 따라서 오류를 반환한 각 행에 대해 오류 큐에는 0개 이상의 추가 SQLSTATE가 포함됩니다. 드라이버가 오류 또는 경고를 처리한 후 작업을 중지하면 SQL_ERROR 반환됩니다.

드라이버가 SQLSTATE 01004(잘린 데이터)와 같은 경고를 반환하는 경우 특정 행에 적용되는 오류 정보를 반환하기 전에 행 집합의 전체 행 집합 또는 알 수 없는 행에 적용되는 경고를 반환합니다. 해당 행에 대한 다른 오류 정보와 함께 특정 행에 대한 경고를 반환합니다.

RowNumber가 0과 같고 작업이 SQL_UPDATE, SQL_REFRESH 또는 SQL_DELETE 경우 SQLSetPos작동하는 행 수는 SQL_ATTR_ROWS_FETCHED_PTR 문 특성으로 가리깁니다.

RowNumber가 0이고 작업이 SQL_DELETE, SQL_REFRESH 또는 SQL_UPDATE 경우 작업 후의 현재 행은 작업 전의 현재 행과 동일합니다.

대량 작업에서 행 무시

행 작업 배열은 SQLSetPos를 사용하여 대량 작업 중에 현재 행 집합의 행을 무시해야 함을 나타내는 데 사용할 수 있습니다. 대량 작업 중에 하나 이상의 행을 무시하도록 드라이버에 지시하려면 애플리케이션에서 다음 단계를 수행해야 합니다.

  1. SQLSetStmtAttr을 호출하여 SQLUSMALLINT 배열을 가리키도록 SQL_ATTR_ROW_OPERATION_PTR 문 특성을 설정합니다. 이 필드는 SQLSetDescField를 호출하여 애플리케이션이 설명자 핸들을 가져와야 하는 ARD의 SQL_DESC_ARRAY_STATUS_PTR 헤더 필드를 설정하여 설정할 수도 있습니다.

  2. 행 작업 배열의 각 요소를 다음 두 값 중 하나로 설정합니다.

    • SQL_ROW_IGNORE 행이 대량 작업에 대해 제외됨을 나타냅니다.

    • SQL_ROW_PROCEED 행이 대량 작업에 포함되어 있음을 나타냅니다. (기본값입니다.)

  3. SQLSetPos를 호출하여 대량 작업을 수행합니다.

행 작업 배열에 적용되는 규칙은 다음과 같습니다.

  • SQL_ROW_IGNORE 및 SQL_ROW_PROCEED SQL_DELETE 또는 SQL_UPDATE 작업과 함께 SQLSetPos사용하는 대량 작업에만 영향을 줍니다. SQL_REFRESH 또는 SQL_POSITION 작업으로 SQLSetPos에 대한 호출에는 영향을 미치지 않습니다.

  • 포인터는 기본적으로 null로 설정됩니다.

  • 포인터가 null이면 모든 요소가 SQL_ROW_PROCEED 설정된 것처럼 모든 행이 업데이트됩니다.

  • 요소를 SQL_ROW_PROCEED 설정해도 해당 특정 행에서 작업이 수행된다는 보장은 없습니다. 예를 들어 행 집합의 특정 행에 상태 SQL_ROW_ERROR 있는 경우 드라이버가 애플리케이션이 지정한 SQL_ROW_PROCEED 여부에 관계없이 해당 행을 업데이트하지 못할 수 있습니다. 애플리케이션은 항상 행 상태 배열을 확인하여 작업이 성공했는지 확인해야 합니다.

  • SQL_ROW_PROCEED 헤더 파일에서 0으로 정의됩니다. 애플리케이션은 모든 행을 처리하기 위해 행 작업 배열을 0으로 초기화할 수 있습니다.

  • 행 작업 배열의 요소 번호 "n"이 SQL_ROW_IGNORE 설정되고 대량 업데이트 또는 삭제 작업을 수행하기 위해 SQLSetPos가 호출되는 경우 행 집합의 n번째 행은 SQLSetPos를 호출한 후에도 변경되지 않습니다.

  • 애플리케이션은 자동으로 읽기 전용 열을 SQL_ROW_IGNORE 설정해야 합니다.

대량 작업에서 열 무시

하나 이상의 읽기 전용 열에 대한 업데이트 시도로 인해 생성되는 불필요한 처리 진단을 방지하기 위해 애플리케이션은 바인딩된 길이/표시기 버퍼의 값을 SQL_COLUMN_IGNORE 설정할 수 있습니다. 자세한 내용은 SQLBindCol을 참조 하세요.

코드 예

다음 예제에서 애플리케이션을 사용하면 사용자가 ORDERS 테이블을 찾아보고 주문 상태를 업데이트할 수 있습니다. 커서는 행 집합 크기가 20인 키 집합 기반이며 행 버전을 비교하는 낙관적 동시성 제어를 사용합니다. 각 행 집합을 페치한 후 애플리케이션은 이를 인쇄하고 사용자가 주문 상태를 선택하고 업데이트할 수 있도록 합니다. 애플리케이션은 SQLSetPos를 사용하여 선택한 행에 커서를 배치하고 행의 위치가 지정된 업데이트를 수행합니다. (명확성을 위해 오류 처리는 생략됩니다.)

#define ROWS 20  
#define STATUS_LEN 6  
  
SQLCHAR        szStatus[ROWS][STATUS_LEN], szReply[3];  
SQLINTEGER     cbStatus[ROWS], cbOrderID;  
SQLUSMALLINT   rgfRowStatus[ROWS];  
SQLUINTEGER    sOrderID, crow = ROWS, irow;  
SQLHSTMT       hstmtS, hstmtU;  
  
SQLSetStmtAttr(hstmtS, SQL_ATTR_CONCURRENCY, (SQLPOINTER) SQL_CONCUR_ROWVER, 0);  
SQLSetStmtAttr(hstmtS, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) SQL_CURSOR_KEYSET_DRIVEN, 0);  
SQLSetStmtAttr(hstmtS, SQL_ATTR_ROW_ARRAY_SIZE, (SQLPOINTER) ROWS, 0);  
SQLSetStmtAttr(hstmtS, SQL_ATTR_ROW_STATUS_PTR, (SQLPOINTER) rgfRowStatus, 0);  
SQLSetCursorName(hstmtS, "C1", SQL_NTS);  
SQLExecDirect(hstmtS, "SELECT ORDERID, STATUS FROM ORDERS ", SQL_NTS);  
  
SQLBindCol(hstmtS, 1, SQL_C_ULONG, &sOrderID, 0, &cbOrderID);  
SQLBindCol(hstmtS, 2, SQL_C_CHAR, szStatus, STATUS_LEN, &cbStatus);  
  
while ((retcode == SQLFetchScroll(hstmtS, SQL_FETCH_NEXT, 0)) != SQL_ERROR) {  
   if (retcode == SQL_NO_DATA_FOUND)  
      break;  
   for (irow = 0; irow < crow; irow++) {  
      if (rgfRowStatus[irow] != SQL_ROW_DELETED)  
         printf("%2d %5d %*s\n", irow+1, sOrderID, NAME_LEN-1, szStatus[irow]);  
   }  
   while (TRUE) {  
      printf("\nRow number to update?");  
      gets_s(szReply, 3);  
      irow = atoi(szReply);  
      if (irow > 0 && irow <= crow) {  
         printf("\nNew status?");  
         gets_s(szStatus[irow-1], (ROWS * STATUS_LEN));  
         SQLSetPos(hstmtS, irow, SQL_POSITION, SQL_LOCK_NO_CHANGE);  
         SQLPrepare(hstmtU,  
          "UPDATE ORDERS SET STATUS=? WHERE CURRENT OF C1", SQL_NTS);  
         SQLBindParameter(hstmtU, 1, SQL_PARAM_INPUT,  
            SQL_C_CHAR, SQL_CHAR,  
            STATUS_LEN, 0, szStatus[irow], 0, NULL);  
         SQLExecute(hstmtU);  
      } else if (irow == 0) {  
         break;  
      }  
   }  
}  

자세한 예제는 SQLSetPos 를 사용하여 행 집합의 위치 지정 업데이트 및 삭제 문 및 행 업데이트를 참조하세요.

추가 정보 참조
결과 집합의 열에 버퍼 바인딩 SQLBindCol 함수
블록 커서 위치와 관련이 없는 대량 작업 수행 SQLBulkOperations 함수
문 처리 취소 SQLCancel 함수
데이터 블록을 가져오거나 결과 집합을 스크롤합니다. SQLFetchScroll 함수
설명자의 단일 필드 가져오기 SQLGetDescField 함수
설명자의 여러 필드 가져오기 SQLGetDescRec 함수
설명자의 단일 필드 설정 SQLSetDescField 함수
설명자의 여러 필드 설정 SQLSetDescRec 함수
문 특성 설정 SQLSetStmtAttr 함수

참고 항목

ODBC API 참조
ODBC 헤더 파일