Compartir a través de


Copia masiva mediante un archivo de formato (ODBC)

En este ejemplo se muestra cómo se usa la función ODBC bcp_init con un archivo de formato.

Para realizar una copia masiva mediante un archivo de formato

  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 Microsoft SQL Server.

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

    • Nombre de la tabla o vista a la que se va a copiar de forma masiva desde o hacia.

    • Nombre del archivo de datos que contiene los datos que se van a copiar en la base de datos o que recibe datos al copiar desde la base de datos.

    • 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_IN del archivo a la tabla o vista.

  5. Llame a bcp_readfmt para leer el archivo de formato que describe el archivo de datos que usará la operación de copia masiva.

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

Ejemplo

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 que usará el ejemplo.

Copie la segunda lista de código y péguela en un archivo denominado Bcpfmt.fmt. Cada columna de la tabla está separada por un carácter de tabulación.

Copie la tercera lista de código y péguela en un archivo denominado Bcpodbc.bcp. Un carácter de tabulación precede a cada retorno de carro en el archivo.

Compile la cuarta lista de código (C++) con odbc32.lib y odbcbcp.lib. Si ha compilado con MSBuild.exe, copie Bcpfmt.fmt y Bcpodbc.bcp desde el directorio del proyecto en el directorio con el .exe y, a continuación, invoque el .exe.

Ejecute la quinta lista de código (Transact-SQL) para eliminar la tabla que usó el ejemplo.

use AdventureWorks  
CREATE TABLE BCPDate (cola int, colb datetime)  
8.0  
2  
1SQLCHAR04"\t"1colaSQL_Latin1_General_Cp437_Bin  
2SQLCHAR08"\r\n"2colbSQL_Latin1_General_Cp437_Bin  
1  
2  
// compile with: odbc32.lib odbcbcp.lib  
#include <stdio.h>  
#include <windows.h>  
#include <sql.h>  
#include <sqlext.h>  
#include <odbcss.h>  
  
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;  
   SDWORD cRows;  
  
   // 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 BCP mode, 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);  
   }  
  
   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 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);  
   }  
  
   // Initialize the bulk copy.  
   retcode = bcp_init(hdbc1, "BCPDate", "BCPODBC.bcp", NULL, DB_IN);  
   if ( (retcode != SUCCEED) ) {  
      printf("bcp_init(hdbc1) Failed\n\n");  
      Cleanup();  
      return(9);  
   }  
  
   // Read the format file.  
   retcode = bcp_readfmt(hdbc1, "BCPFMT.fmt");  
   if ( (retcode != SUCCEED) ) {  
      printf("bcp_readfmt(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 in = %d.\n", cRows);  
  
   // Cleanup  
   SQLDisconnect(hdbc1);  
   SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);  
   SQLFreeHandle(SQL_HANDLE_ENV, henv);  
}  
use AdventureWorks  
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'BCPDate')  
     DROP TABLE BCPDate  
GO  

Véase también

Copia masiva con temas de procedimientos del controlador ODBC de SQL Server (ODBC)
Uso de archivos de datos y archivos de formato