Compartir a través de


Usar columnas de datos en ejecución (ODBC)

Para utilizar columnas text, ntext o image de datos en ejecución

  1. Para cada columna de datos en ejecución, incluya valores especiales en los búferes previamente enlazados con SQLBindCol:

    • Para el último parámetro, utilice SQL_LEN_DATA_AT_EXEC(longitud) donde longitud es la longitud total de los datos de la columna text, ntext o image en bytes.

    • Para el cuarto parámetro, incluya un identificador de columna definido por el programa.

  2. La llamada a SQLSetPos devuelve SQL_NEED_DATA, que indica las columnas de datos en ejecución listas para procesarse.

  3. Para cada columna de datos en ejecución:

    • Llame a SQLParamData para obtener el puntero a la matriz de columnas. Devolverá SQL_NEED_DATA si hay otra columna de datos en ejecución.

    • Llame a SQLPutData una o más veces para enviar los datos de columna, hasta que se envíe la longitud.

  4. Llame a SQLParamData para indicar que se han enviado todos los datos de la columna de datos en ejecución final. No devolverá SQL_NEED_DATA.

Ejemplo

En este ejemplo se muestra cómo leer datos de caracteres variables SQL_LONG mediante SQLGetData. Este ejemplo no es compatible con IA64.

Necesitará un origen de datos ODBC denominado AdventureWorks, cuya base de datos predeterminada sea la base de datos de ejemplo AdventureWorks. Puede descargar la base de datos de ejemplo AdventureWorks de la página principal que muestra ejemplos y proyectos de la comunidad de Microsoft SQL Server. Este origen de datos debe estar basado en el controlador ODBC proporcionado por el sistema operativo (el nombre del controlador es "SQL Server"). Si compila y ejecuta este ejemplo como una aplicación de 32 bits en un sistema operativo de 64 bits, debe crear el origen de datos ODBC con el Administrador ODBC en %windir%\SysWOW64\odbcad32.exe.

Este ejemplo se conecta a la instancia predeterminada de SQL Server del equipo. Para conectarse a una instancia con nombre, cambie la definición del origen de datos ODBC para especificar la instancia mediante el formato servidor\instanciaConNombre. De forma predeterminada, SQL Server Express se instala en una instancia con nombre.

Ejecute la primera lista de código (Transact-SQL) para crear la tabla utilizada por el ejemplo.

Compile el segundo fragmento de código (C++) código con odbc32.lib. A continuación, ejecute el programa.

Ejecute la tercera lista de código (Transact-SQL) para eliminar la tabla utilizada por el ejemplo.

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

Vea también

Otros recursos

Temas de procedimientos de administración de columnas de texto e imagen (ODBC)