共用方式為


使用資料執行中資料行 (ODBC)

若要使用資料執行中的 text、ntext 或 image 資料行

  1. 針對每個資料執行中的資料行,將特殊值放入先前由SQLBindCol 所繫結的緩衝區:

    • 針對最後一個參數,使用 SQL_LEN_DATA_AT_EXEC(length),其中 length 是以位元組表示的 text、ntext 或 image 資料行資料。

    • 針對第四個參數,放入程式定義的資料行識別碼。

  2. 呼叫 SQLSetPos 會傳回 SQL_NEED_DATA,這表示資料執行中資料行已準備就緒,可進行處理。

  3. 針對每一個資料執行中資料行:

    • 呼叫 SQLParamData 以取得資料行陣列指標。 如果有另一個資料執行中資料行,它將會傳回 SQL_NEED_DATA。

    • 呼叫 SQLPutData 一次或多次來傳送資料行資料,直到傳送長度為止。

  4. 呼叫 SQLParamData 以指出最終資料執行中資料行的所有資料都已傳送。 它不會傳回 SQL_NEED_DATA。

範例

此範例顯示如何使用 SQLGetData 讀取 SQL_LONG 變數字元資料。 IA64 不支援此範例。

您需要名為 AdventureWorks 的 ODBC 資料來源,其預設資料庫為 AdventureWorks 範例資料庫 (您可以從 Microsoft SQL Server 範例和社群專案首頁 (英文) 下載 AdventureWorks 範例資料庫)。此資料來源必須以作業系統提供的 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)