次の方法で共有


実行時データ列の使用 (ODBC)

実行時データ text 列、ntext 列、または image 列を使用するには

  1. 実行時データ列ごとに、「SQLBindCol」でバインド済みのバッファーに特別な値を格納します。

    • 最後のパラメーターとして、SQL_LEN_DATA_AT_EXEC(length) を使用します。この length は、text 列、ntext 列、または image 列データの合計の長さ (バイト単位) です。

    • 4 番目のパラメーターとして、プログラム定義の列 ID を指定します。

  2. SQLSetPos を呼び出すと、SQL_NEED_DATA が返されます。これは、実行時データ列を処理する準備ができていることを示します。

  3. 実行時データの各列に対して次の操作を行います。

    • SQLParamData を呼び出して、列の配列のポインターを取得します。 実行時データ列が他にもある場合は、SQL_NEED_DATA が返されます。

    • SQLPutData を 1 回以上呼び出して、列データを length の長さまで送信します。

  4. SQLParamData を呼び出して、最後の実行時データ列のデータがすべて送信されたことを確認します。 SQL_NEED_DATA は返されません。

使用例

このサンプルでは、SQLGetData を使用して SQL_LONG 型の可変長文字データを読み取る方法を示します。 このサンプルは IA64 ではサポートされていません。

AdventureWorks と呼ばれる ODBC データ ソース (既定のデータベースは AdventureWorks サンプル データベース) が必要です (AdventureWorks サンプル データベースは、Microsoft SQL Server のサンプルとコミュニティのプロジェクトのホーム ページからダウンロードできます)。このデータ ソースには、オペレーティング システムに用意されている ODBC ドライバーが使用されている必要があります (ドライバー名は "SQL Server")。 このサンプルを 64 ビット オペレーティング システムで 32 ビット アプリケーションとしてビルドし、実行する場合、%windir%\SysWOW64\odbcad32.exe の ODBC アドミニストレーターを使用して ODBC データ ソースを作成する必要があります。

このサンプルでは、コンピューターの既定の SQL Server インスタンスに接続します。 名前付きインスタンスに接続するには、ODBC データ ソースの定義を変更し、server\namedinstance 形式でそのインスタンスを指定します。 SQL Server Express は、既定で名前付きインスタンスとしてインストールされます。

1 つ目の (Transact-SQL) コード リストを実行して、サンプルで使用するテーブルを作成します。

odbc32.lib を使用して 2 つ目の (C++) コード リストをコンパイルします。 次に、プログラムを実行します。

3 つ目の (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)