Copia massiva senza file di formato (ODBC)

Questo esempio illustra come usare le funzioni di copia bulk per creare un file di dati in modalità nativa, senza un file di formato. Questo esempio è stato sviluppato per ODBC versione 3.0 o successiva.

Importante

Se possibile, usare l'autenticazione di Windows. Se l'autenticazione di Windows non è disponibile, chiedere agli utenti di immettere le credenziali in fase di esecuzione. Evitare di archiviare le credenziali in un file. Se è necessario rendere persistenti le credenziali, è necessario crittografarle con l'API di crittografia Win32.

Per eseguire la copia bulk senza un file di formato

  1. Allocare un handle di ambiente e un handle di connessione.

  2. Impostare SQL_COPT_SS_BCP e SQL_BCP_ON per abilitare le operazioni di copia bulk.

  3. Connettersi a SQL Server.

  4. Chiamare bcp_init per impostare le informazioni seguenti:

    • Nome della tabella o della vista da cui eseguire la copia bulk da o a.

    • Nome del file di dati che contiene i dati da copiare nel database o che riceve i dati durante la copia dal database.

    • Nome di un file di dati per ricevere eventuali messaggi di errore di copia bulk (specificare NULL se non si desidera un file di messaggio).

    • Direzione della copia: DB_IN dal file alla vista o alla tabella oppure DB_OUT al file dalla tabella o dalla vista.

  5. Chiamare bcp_exec per eseguire l'operazione di copia bulk.

Quando DB_OUT è impostato con questi passaggi, il file viene creato in formato nativo. Il file può quindi essere copiato in blocco in un server seguendo questi stessi passaggi, ad eccezione del fatto che DB_OUT è impostato invece di DB_IN. Questa operazione funziona solo se le tabelle di origine e di destinazione hanno esattamente la stessa struttura.

Esempio

Questo esempio non è supportato in IA64.

Sarà necessaria un'origine dati ODBC denominata AdventureWorks, il cui database predefinito è il database di esempio AdventureWorks. È possibile scaricare il database di esempio AdventureWorks dalla home page degli esempi di Microsoft SQL Server e dei progetti della community . Questa origine dati deve essere basata sul driver ODBC fornito dal sistema operativo (il nome del driver è "SQL Server"). Se si compila ed esegue questo esempio come applicazione a 32 bit in un sistema operativo a 64 bit, è necessario creare l'origine dati ODBC con l'amministratore ODBC in %windir%\SysWOW64\odbcad32.exe.

Questo esempio si connette all'istanza predefinita di SQL Server del computer. Per connettersi a un'istanza denominata, modificare la definizione dell'origine dati ODBC per specificare l'istanza usando il formato seguente: server\namedinstance. Per impostazione predefinita, SQL Server Express viene installato in un'istanza denominata.

Compilare con odbc32.lib e 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;  
  
   // 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 uses Integrated Security, create the 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, "Purchasing.Vendor", "BCPODBC.bcp", "BCPERROR.out", DB_OUT);  
   // 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);  
   }  
  
   // 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);  
}  

Vedere anche

Procedure per la copia bulk con il driver ODBC di SQL Server (ODBC)