실행 시 데이터 텍스트, ntext 또는 이미지 열을 사용하려면
각 실행 시 데이터 열에 대해 이전에 SQLBindCol에 의해 바인딩된 버퍼에 특수 값을 넣습니다.
마지막 매개 변수의 경우 길이가 텍스트, ntext 또는 이미지 열 데이터의 총 길이인 SQL_LEN_DATA_AT_EXEC(length)를 바이트 단위로 사용합니다.
네 번째 매개 변수의 경우 프로그램 정의 열 식별자를 배치합니다.
SQLSetPos를 호출하면 실행 중인 데이터 열이 처리할 준비가 되었음을 나타내는 SQL_NEED_DATA 반환됩니다.
각 실행 시 데이터 열에 대해 다음을 수행합니다.
SQLParamData를 호출하여 열 배열 포인터를 가져옵니다. 실행 시 다른 데이터 열이 있는 경우 SQL_NEED_DATA 반환합니다.
SQLPutData를 한 번 이상 호출하여 길이가 전송될 때까지 열 데이터를 보냅니다.
SQLParamData를 호출하여 최종 실행 시 데이터 열에 대한 모든 데이터가 전송됨을 나타냅니다. SQL_NEED_DATA 반환하지 않습니다.
예시
이 샘플에서는 SQLGetData를 사용하여 SQL_LONG 변수 문자 데이터를 읽는 방법을 보여줍니다. 이 샘플은 IA64에서 지원되지 않습니다.
기본 데이터베이스가 AdventureWorks 샘플 데이터베이스인 AdventureWorks라는 ODBC 데이터 원본이 필요합니다. ( Microsoft SQL Server 샘플 및 커뮤니티 프로젝트 홈페이지에서 AdventureWorks 샘플 데이터베이스를 다운로드할 수 있습니다.) 이 데이터 원본은 운영 체제에서 제공하는 ODBC 드라이버를 기반으로 해야 합니다(드라이버 이름은 "SQL Server"). 이 샘플을 64비트 운영 체제에서 32비트 애플리케이션으로 빌드하고 실행하는 경우 %windir%\SysWOW64\odbcad32.exeODBC 관리자를 사용하여 ODBC 데이터 원본을 만들어야 합니다.
이 샘플은 컴퓨터의 기본 SQL Server 인스턴스에 연결합니다. 명명된 인스턴스에 연결하려면 ODBC 데이터 원본의 정의를 변경하여 서버\namedinstance 형식을 사용하여 인스턴스를 지정합니다. 기본적으로 SQL Server Express는 명명된 인스턴스에 설치됩니다.
첫 번째 (Transact-SQL) 코드 목록을 실행하여 샘플에서 사용하는 테이블을 만듭니다.
odbc32.lib를 사용하여 두 번째(C++) 코드 목록을 컴파일합니다. 그런 다음 프로그램을 실행합니다.
세 번째(Transact-SQL) 코드 목록을 실행하여 샘플에서 사용하는 테이블을 삭제합니다.
use AdventureWorks
CREATE TABLE emp3 (NAME char(30), AGE int, BIRTHDAY datetime, Memo1 text)
INSERT INTO emp3 (NAME, AGE, Memo1) VALUES ('Name1', '12', 'This is the first employee')
INSERT INTO emp3 (NAME, AGE, Memo1) VALUES ('Name2', '18', 'This is the second employee')
// compile with: odbc32.lib
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <odbcss.h>
#define BUFFERSIZE 450
SQLHENV henv = SQL_NULL_HENV;
SQLHDBC hdbc1 = SQL_NULL_HDBC;
SQLHSTMT hstmt1 = SQL_NULL_HSTMT;
void Cleanup() {
if (hstmt1 != SQL_NULL_HSTMT)
SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
if (hdbc1 != SQL_NULL_HDBC) {
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
}
if (henv != SQL_NULL_HENV)
SQLFreeHandle(SQL_HANDLE_ENV, henv);
};
int main() {
RETCODE retcode;
SWORD cntr;
// SQLGetData variables.
UCHAR Data[BUFFERSIZE];
SDWORD cbBatch = (SDWORD)sizeof(Data)-1;
SQLLEN cbTxtSize;
// Clear data array.
for (cntr = 0 ; cntr < BUFFERSIZE ; cntr++)
Data[cntr] = 0x00;
// Allocate the ODBC environment and save handle.
retcode = SQLAllocHandle (SQL_HANDLE_ENV, NULL, &henv);
if( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
printf("SQLAllocHandle(Env) Failed\n\n");
Cleanup();
return(9);
}
// Notify ODBC that this is an ODBC 3.0 app.
retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER);
if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
printf("SQLSetEnvAttr(ODBC version) Failed\n\n");
Cleanup();
return(9);
}
// Allocate ODBC connection handle and connect.
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);
if( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {
printf("SQLAllocHandle(hdbc1) Failed\n\n");
Cleanup();
return(9);
}
// Sample uses Integrated Security, create SQL Server DSN using Windows NT authentication.
retcode = SQLConnect(hdbc1, (UCHAR*)"AdventureWorks", SQL_NTS, (UCHAR*)"", SQL_NTS, (UCHAR*)"", SQL_NTS);
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLConnect() Failed\n\n");
Cleanup();
return(9);
}
// Allocate statement handle; prepare, then execute command.
retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLAllocHandle(hstmt1) Failed\n\n");
Cleanup();
return(9);
}
retcode = SQLExecDirect(hstmt1, (UCHAR*)"SELECT Memo1 FROM emp3", SQL_NTS);
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLExecDirect Failed\n\n");
Cleanup();
return(9);
}
// Get first row.
retcode = SQLFetch(hstmt1);
if( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("SQLFetch(hstmt1) Failed\n\n");
Cleanup();
return(9);
}
// Get the SQL_LONG column.
cntr = 1;
while ( (retcode = SQLGetData(hstmt1, 1, SQL_C_CHAR, Data, cbBatch, &cbTxtSize)) != SQL_NO_DATA) {
printf("GetData iteration %d, pcbValue = %d,\n", cntr++, cbTxtSize);
printf("Data = %s\n\n", Data);
if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) {
printf("GetData(hstmt1) Failed\n\n");
Cleanup();
return(9);
}
}
// Clean up
//SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
use AdventureWorks
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'emp3')
DROP TABLE emp3
GO