Compartir a través de


Copia masiva de un conjunto de resultados SELECT (ODBC)

En este ejemplo se muestra cómo usar funciones de copia masiva para copiar de forma masiva el conjunto de resultados de una instrucción SELECT. Este ejemplo se desarrolló para ODBC versión 3.0 o posterior.

Importante

Siempre que sea posible, utilice la autenticación de Windows. Si la autenticación de Windows no está disponible, pida a los usuarios que escriban sus credenciales en tiempo de ejecución. Evite almacenar credenciales en un archivo. Si debe conservar las credenciales, debe cifrarlas con la API de cifrado win32.

Para copiar de forma masiva el conjunto de resultados de una instrucción SELECT

  1. Asigne un identificador de entorno y un identificador de conexión.

  2. Establezca SQL_COPT_SS_BCP y SQL_BCP_ON para habilitar las operaciones de copia masiva.

  3. Conéctese a SQL Server.

  4. Llame a bcp_init para establecer la siguiente información:

    • Especifique NULL para el parámetro szTable .

    • Nombre del archivo de datos que recibe los datos del conjunto de resultados.

    • Nombre de un archivo de datos para recibir cualquier mensaje de error de copia masiva (especifique NULL si no desea un archivo de mensaje).

    • Dirección de la copia: DB_OUT.

  5. Llame a bcp_control, establezca eOption en BCPHINTS y coloque en iValue un puntero a una matriz SQLTCHAR que contenga la instrucción SELECT.

  6. Llame a bcp_exec para ejecutar la operación de copia masiva.

Al usar estos pasos, el archivo se crea en formato nativo. Puede convertir los valores de datos en otros tipos de datos mediante bcp_colfmt. Para obtener más información, vea Crear un archivo de formato de copia masiva (ODBC).

Ejemplo

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.

Compile con odbc32.lib y odbcbcp.lib.

// compile with: odbc32.lib odbcbcp.lib  
#include <stdio.h>  
#include <string.h>  
#include <windows.h>  
#include <sql.h>  
#include <sqlext.h>  
#include <odbcss.h>  
  
#define MAXBUFLEN 256  
  
SQLHENV henv = SQL_NULL_HENV;  
HDBC hdbc1 = SQL_NULL_HDBC;  
  
void Cleanup() {  
   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;  
  
   // Bulk copy variables.  
   SDWORD cRows;  
   SQLTCHAR szBCPQuery[] = "SELECT BirthDate FROM HumanResources.Employee";  
  
   // 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, set bulk copy mode, and then 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);  
   }  
  
   retcode = SQLSetConnectAttr(hdbc1, SQL_COPT_SS_BCP, (void *)SQL_BCP_ON, SQL_IS_INTEGER);  
   if ( (retcode != SQL_SUCCESS_WITH_INFO) && (retcode != SQL_SUCCESS)) {  
      printf("SQLSetConnectAttr(hdbc1) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Sample use 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);  
   }  
  
   // Initialize the bulk copy.  
   retcode = bcp_init(hdbc1, NULL, "BCPODBC.bcp", "BCPERROR.out", DB_OUT);  
   // The test is for the bulk copy return of SUCCEED, not the ODBC return of SQL_SUCCESS.  
   if ( (retcode != SUCCEED) ) {  
      printf("bcp_init(hdbc1) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Specify the query to use.  
   retcode = bcp_control(hdbc1, BCPHINTS, (void *)szBCPQuery);  
   if ( (retcode != SUCCEED) ) {  
      printf("bcp_control(hdbc1) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Execute the bulk copy.  
   retcode = bcp_exec(hdbc1, &cRows);  
   if ( (retcode != SUCCEED) ) {  
      printf("bcp_exec(hdbc1) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   printf("Number of rows bulk copied out = %d.\n", cRows);  
  
   // Cleanup  
   SQLDisconnect(hdbc1);  
   SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);  
   SQLFreeHandle(SQL_HANDLE_ENV, henv);  
}  

Véase también

Copia masiva con temas de procedimientos del controlador ODBC de SQL Server (ODBC)