Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Para usar columnas de texto, ntext o imagen de datos en ejecución
Para cada columna de datos en ejecución, coloque valores especiales en los búferes enlazados anteriormente por SQLBindCol:
Para el último parámetro, use SQL_LEN_DATA_AT_EXEC(length) donde length es la longitud total de los datos de columna text, ntext o image en bytes.
Para el cuarto parámetro, coloque un identificador de columna definido por programa.
La llamada a SQLSetPos devuelve SQL_NEED_DATA, lo que indica que las columnas de datos en ejecución están listas para su procesamiento.
Para cada columna de datos en ejecución:
Llame a SQLParamData para obtener el puntero de matriz de columnas. Devolverá SQL_NEED_DATA si hay otra columna de datos en ejecución.
Llame a SQLPutData una o varias veces para enviar los datos de columna, hasta que se envíe la longitud.
Llame a SQLParamData para indicar que se envían todos los datos de la columna final data-at-execution. No devolverá SQL_NEED_DATA.
Ejemplo
En el ejemplo se muestra cómo leer un SQL_LONG datos de caracteres de variable mediante SQLGetData. Este ejemplo no se admite en IA64.
Necesitará un origen de datos ODBC llamado AdventureWorks, cuya base de datos predeterminada es la base de datos de ejemplo AdventureWorks. (Puede descargar la base de datos de ejemplo AdventureWorks desde la página principal Ejemplos de Microsoft SQL Server y Proyectos de comunidad ). Este origen de datos debe basarse en el controlador ODBC proporcionado por el sistema operativo (el nombre del controlador es "SQL Server"). Si va a compilar y ejecutar 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 con el siguiente formato: servidor\namedinstance. 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 usada por el ejemplo.
Compile la segunda lista de código (C++) con odbc32.lib. A continuación, ejecute el programa.
Ejecute la tercera lista de código (Transact-SQL) para eliminar la tabla usada 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
Véase también
Administración de temas de procedimientos de columnas de texto e imagen (ODBC)