Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo esempio illustra come usare le funzioni di copia bulk per creare sia un file di dati che 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 creare un file di formato di copia bulk
Allocare un handle di ambiente e un handle di connessione.
Impostare SQL_COPT_SS_BCP e SQL_BCP_ON per abilitare le operazioni di copia bulk.
Connettersi a SQL Server.
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_OUT al file dalla tabella o dalla vista.
Chiamare bcp_columns per impostare il numero di colonne.
Chiamare bcp_colfmt per ogni colonna per definirne le caratteristiche nel file di dati.
Chiamare bcp_writefmt per creare un file di formato che descrive il file di dati da creare tramite l'operazione di copia bulk.
Chiamare bcp_exec per eseguire l'operazione di copia bulk.
Un'operazione di copia bulk eseguita in questo modo crea sia un file di dati contenente i dati copiati in blocco che un file di formato che descrive il layout del file di dati.
Esempio
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.
Eseguire il primo listato di codice (Transact-SQL) per creare la tabella che verrà usata dall'esempio.
Compilare il secondo listato di codice (C++) con odbc32.lib e odbcbcp.lib.
Eseguire il terzo listato di codice (Transact-SQL) per eliminare la tabella usata dall'esempio.
use AdventureWorks
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'BCPDate')
DROP TABLE BCPDate
GO
CREATE TABLE BCPDate (cola int, colb datetime)
insert BCPDate(cola) values(1)
insert BCPDate(cola) values(2)
insert BCPDate(cola) values(3)
insert BCPDate(cola) values(4)
// compile with: odbc32.lib odbcbcp.lib
#include <stdio.h>
#include <string.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;
// BCP 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 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("SQLSetEnvAttr(ODBC version) 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_OUT);
if (retcode != SUCCEED) {
printf("bcp_init() Failed\n\n");
Cleanup();
return(9);
}
// Set the number of output columns.
retcode = bcp_columns(hdbc1, 2);
if (retcode != SUCCEED) {
printf("bcp_init() Failed\n\n");
Cleanup();
return(9);
}
// Describe the format of column 1 in the data file.
retcode = bcp_colfmt(hdbc1, 1, SQLCHARACTER, -1, 5, NULL, 0, 1);
if (retcode != SUCCEED) {
printf("bcp_init() Failed\n\n");
Cleanup();
return(9);
}
// Describe the format of column 2 in the data file.
retcode = bcp_colfmt(hdbc1, 2, SQLCHARACTER, -1, 20, NULL, 0, 2);
if (retcode != SUCCEED) {
printf("bcp_init() Failed\n\n");
Cleanup();
return(9);
}
// Create the format file.
retcode = bcp_writefmt(hdbc1, "c:\\BCPFMT.fmt");
if (retcode != SUCCEED) {
printf("bcp_init() Failed\n\n");
Cleanup();
return(9);
}
// Execute the bulk copy.
retcode = bcp_exec(hdbc1, &cRows);
if (retcode != SUCCEED) {
printf("bcp_init() 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);
return(0);
}
use AdventureWorks
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'BCPDate')
DROP TABLE BCPDate
GO
Vedere anche
Procedure per la copia bulk con il driver ODBC di SQL Server (ODBC)
Uso di file di dati e file di formato