실행 시 데이터 열 사용(ODBC)

실행 시 데이터 text, ntext 또는 image 열을 사용하려면

  1. 각 실행 시 데이터 열에 대해 이전에 SQLBindCol에서 바인딩된 버퍼에 특수 값을 배치합니다.

    • 마지막 매개 변수에 대해 SQL_LEN_DATA_AT_EXEC(길이)를 사용합니다. 여기서 길이는 text, ntext 또는 image 열 데이터의 총 길이(바이트)입니다.

    • 네 번째 매개 변수에 대해 프로그램에서 정의된 열 식별자를 배치합니다.

  2. SQLSetPos를 호출하면 실행 시 데이터 열을 처리할 준비가 되었음을 나타내는 SQL_NEED_DATA가 반환됩니다.

  3. 각 실행 시 데이터 열에 대해 다음을 수행합니다.

    • SQLParamData를 호출하여 열 배열 포인터를 가져옵니다. 다른 실행 시 데이터 열이 있는 경우 SQL_NEED_DATA가 반환됩니다.

    • SQLPutData를 한 번 이상 호출하여 길이가 전달될 때까지 열 데이터를 보냅니다.

  4. SQLParamData를 호출하여 최종 실행 시 데이터 열의 모든 데이터가 전달되었음을 나타냅니다. SQL_NEED_DATA는 반환되지 않습니다.

이 예제에서는 SQLGetData를 사용하여 SQL_LONG 변수 문자 데이터를 읽는 방법을 보여 줍니다. 이 예제는 IA64에서 지원되지 않습니다.

AdventureWorks 예제 데이터베이스를 기본 데이터베이스로 사용하는 AdventureWorks라는 ODBC 데이터 원본이 필요합니다. AdventureWorks 예제 데이터베이스는 Microsoft SQL Server 예제 및 커뮤니티 프로젝트(Microsoft SQL Server Samples and Community Projects) 홈 페이지에서 다운로드할 수 있습니다. 이 데이터 원본은 운영 체제에서 제공하는 ODBC 드라이버를 기반으로 해야 합니다. 이 드라이버의 이름은 "SQL Server"입니다. 이 예제를 64비트 운영 체제에서 32비트 응용 프로그램으로 작성하여 실행하려는 경우 %windir%\SysWOW64\odbcad32.exe에서 ODBC 관리자를 사용하여 ODBC 데이터 원본을 만들어야 합니다.

이 예제는 컴퓨터의 기본 SQL Server 인스턴스에 연결됩니다. 명명된 인스턴스에 연결하려면 ODBC 데이터 원본의 정의를 변경하여 server\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

참고 항목

관련 자료

text 및 image 열 관리 방법 도움말 항목(ODBC)