sqlbindcol 예제

자세한 코드 예제는 SQLBulkOperations 함수, SQLColumn함수, SQLFetchScroll 함수 및 SQLSetPos 함수를 참조하십시오. 이러한 버퍼의 사용은 지연됩니다. 즉, 응용 프로그램은 SQLBindCol에서 바인딩하지만 드라이버는 SQLBulkOperations, SQLFetch, SQLFetchScroll 또는 SQLSetPos와 같은 다른 함수에서 액세스합니다. 바인딩이 그대로 유지되는 한 SQLBindCol에 지정된 포인터가 유효한지 확인하는 것은 응용 프로그램의 책임입니다. 응용 프로그램에서 이러한 포인터가 유효하지 않게 하는 경우(예: 버퍼를 해제한 다음 유효할 것으로 예상되는 함수를 호출하면 결과는 정의되지 않습니다). 자세한 내용은 지연 버퍼를 참조하십시오. 다음 코드는 사용자가 입력한 SELECT 문을 실행하고 결과 집합의 각 데이터 행을 인쇄합니다. 응용 프로그램은 SELECT 문에 의해 생성된 결과 집합의 모양을 예측할 수 없으므로 앞의 예제와 같이 하드 코딩된 변수를 결과 집합에 바인딩할 수 없습니다. 대신 응용 프로그램은 데이터를 포함하는 버퍼와 해당 행의 각 열에 대한 길이/표시기 버퍼를 할당합니다. 각 열에 대해 열에 대한 메모리의 시작 부분에 대한 오프셋을 계산하고 이 오프셋을 조정하여 열의 데이터 및 길이/표시기 버퍼가 선형 경계에서 시작되도록 합니다. 그런 다음 오프셋에서 시작하는 메모리를 열에 바인딩합니다. 드라이버의 관점에서 이 메모리의 주소는 앞의 예제에서 바인딩된 변수의 주소와 구별할 수 없습니다. 선형에 대한 자세한 내용은 정렬을 참조하십시오.

예를 들어 다음 코드는 SalesPerson 및 CustID 열에 변수를 바인딩합니다. 열에 대한 데이터는 영업 사원 및 CustID에서 반환됩니다. SalesPerson는 문자 버퍼이므로 응용 프로그램은 드라이버가 데이터를 트렁키지할지 여부를 결정할 수 있도록 바이트 길이(11)를 지정합니다. 반환된 제목의 바이트 길이 또는 NULL인지 여부는 SalesPersonLenOrInd에서 반환됩니다. 다음 예제에서 응용 프로그램은 Customers 테이블에서 SELECT 문을 실행하여 이름으로 정렬된 고객 ID, 이름 및 전화 번호의 결과 집합을 반환합니다. 그런 다음 SQLBindCol을 호출하여 데이터 열을 로컬 버퍼에 바인딩합니다. 마지막으로 응용 프로그램은 SQLFetch를 사용하여 데이터의 각 행을 가져오고 각 고객의 이름, ID 및 전화 번호를 인쇄합니다. 결과 집합에서 데이터를 가져온 후에도 언제든지 열을 바인딩, 언바운드 또는 리바운드할 수 있습니다. 새 바인딩은 다음에 바인딩을 사용하는 함수가 호출될 때 적용됩니다. 예를 들어 응용 프로그램이 결과 집합에서 열을 바인딩하고 SQLFetch를 호출한다고 가정합니다.

드라이버는 바인딩된 버퍼에서 데이터를 반환합니다. 이제 응용 프로그램이 다른 버퍼 집합에 열을 바인딩한다고 가정합니다. 드라이버는 새로 바인딩된 버퍼에 방금 가져온 행에 대한 데이터를 넣지 않습니다. 대신 SQLFetch가 다시 호출될 때까지 기다린 다음 새로 바인딩된 버퍼에 다음 행에 대한 데이터를 배치합니다. . . 드라이버는 BufferLength를 사용하여 문자 또는 이진 데이터와 같은 가변 길이 데이터를 반환할 때 *TargetValuePtr 버퍼의 끝을 지나서 쓰지 않도록 합니다. 드라이버는 문자 데이터를 *TargetValuePtr에 반환할 때 null 종료 문자를 계산합니다. *따라서 TargetValuePtr은 null 종료 문자에 대한 공간을 포함해야 하며, 그렇지만 드라이버는 데이터를 트렁킨다.

드라이버가 정수 또는 날짜 구조와 같은 고정 길이 데이터를 반환하면 드라이버는 BufferLength를 무시하고 버퍼가 데이터를 보유할 수 있을 만큼 충분히 크다고 가정합니다. 따라서 응용 프로그램이 고정 길이 데이터에 대해 충분히 큰 버퍼를 할당하거나 드라이버가 버퍼의 끝을 지나 서 작성하는 것이 중요합니다. 열 데이터를 성공적으로 검색하려면 응용 프로그램이 응용 프로그램 버퍼에서 데이터의 길이와 시작점을 올바르게 결정해야 합니다.