Share via


bcp_init

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Initialisiert den Massenkopiervorgang.

Syntax

RETCODE bcp_init (  
        HDBC hdbc,  
        LPCTSTR szTable,  
        LPCTSTR szDataFile,  
        LPCTSTR szErrorFile,  
        INT eDirection);  

Unicode- und ANSI-Namen:

  • bcp_initA (ANSI)
  • bcp_initW (Unicode)

Argumente

hdbc
Das für den Massenkopiervorgang aktivierte ODBC-Verbindungshandle.

szTable
Name der Datenbanktabelle, in die bzw. aus der kopiert werden soll. Dieser Name kann auch den Namen der Datenbank oder den Namen des Besitzers enthalten. Beispiel: pubs.gracie.titles, pubs.. titles, gracie.titles und titles sind alle Juristische Tabellennamen.

Wenn eDirection DB_OUT ist, kann szTable auch der Name einer Datenbanksicht sein.

Wenn eDirection DB_OUT ist und eine SELECT-Anweisung mit bcp_control angegeben wird, bevor bcp_exec aufgerufen wird, muss bcp_initszTable auf NULL festgelegt werden.

szDataFile
Name der Benutzerdatei, in die bzw. aus der kopiert werden soll. Wenn Daten mithilfe von bcp_sendrow direkt aus Variablen kopiert werden, legen Sie szDataFile auf NULL fest.

szErrorFile
Der Name der Fehlerdatei, in die Statusmeldungen, Fehlermeldungen und Kopien von Zeilen geschrieben werden sollen, die aus einem bestimmten Grund nicht von einer Benutzerdatei in eine Tabelle kopiert werden konnten. Wenn NULL als szErrorFile übergeben wird, wird keine Fehlerdatei verwendet.

eDirection
Die Richtung der Kopie, entweder DB_IN oder DB_OUT. DB_IN bedeutet eine Kopie aus Programmvariablen oder aus einer Benutzerdatei in eine Tabelle. DB_OUT bedeutet eine Kopie von einer Datenbanktabelle in eine Benutzerdatei an. Sie müssen einen Benutzerdateinamen mit DB_OUT angeben.

Gibt zurück

SUCCEED oder FAIL.

Bemerkungen

Rufen Sie bcp_init auf, bevor Sie eine andere Massenkopierfunktion aufrufen. bcp_init führt die erforderlichen Initialisierungen für eine Massenkopie von Daten zwischen der Arbeitsstation und SQL Server durch.

Die funktion bcp_init muss mit einem ODBC-Verbindungshandle bereitgestellt werden, das für die Verwendung mit Massenkopierfunktionen aktiviert ist. Um das Handle zu aktivieren, verwenden Sie SQLSetConnectAttr , wobei SQL_COPT_SS_BCP für ein zugeordnetes, aber nicht verbundenes Verbindungshandle auf SQL_BCP_ON festgelegt ist. Wenn Sie versuchen, das Attribut einem bereits verbundenen Verbindungshandle zuzuweisen, tritt ein Fehler auf.

Wenn eine Datendatei angegeben wird, untersucht bcp_init die Struktur der Quell- oder Zieltabelle der Datenbank, nicht der Datendatei. bcp_init gibt Datenformatwerte für die Datendatei basierend auf jeder Spalte in der Datenbanktabelle, sicht oder SELECT-Resultset an. Diese Spezifikation enthält unter anderem den Datentyp jeder Spalte, das Vorhandensein bzw. Nichtvorhandensein eines Längen- oder NULL-Wertindikators und von Bytezeichenfolgen des Abschlusszeichens der Daten, sowie die Breite von Datentypen fester Länge. bcp_init legt diese Werte wie folgt fest:

  • Der angegebene Datentyp entspricht dem Datentyp der Spalte in der Datenbanktabelle, der Sicht oder dem SELECT-Resultset. Der Datentyp wird durch SQL Server nativen Datentypen aufgelistet, die in sqlncli.h angegeben sind. Die Daten selbst werden in computereigenem Format dargestellt, Das heißt, Daten aus einer Spalte des Ganzzahldatentyps werden durch eine Vier-Byte-Sequenz dargestellt, die big- oder little-endian ist, basierend auf dem Computer, der die Datendatei erstellt hat.

  • Wenn ein Datenbankdatentyp eine feste Länge hat, haben auch die Daten der Datendatei eine feste Länge. Massenkopierfunktionen, die Daten verarbeiten (z . B. bcp_exec), analysieren Datenzeilen, wobei erwartet wird, dass die Länge der Daten in der Datendatei mit der Länge der Daten identisch ist, die in der Datenbanktabelle, Sicht oder SELECT-Spaltenliste angegeben ist. Beispielsweise müssen Daten für eine Datenbankspalte, die als char(13) definiert ist, durch 13 Zeichen für jede Datenzeile in der Datei dargestellt werden. Für Daten mit fester Länge kann ein NULL-Indikator verwendet werden, wenn die Datenbankspalte NULL-Werte zulässt.

  • Wenn eine Bytesequenz für Abschlusszeichen definiert ist, wird deren Länge auf 0 festgelegt.

  • Beim Kopieren in SQL Server muss die Datendatei Daten für jede Spalte in der Datenbanktabelle enthalten. Beim Kopieren aus SQL Server werden Daten aus allen Spalten in der Datenbanktabelle, der Ansicht oder dem SELECT-Resultset in die Datendatei kopiert.

  • Beim Kopieren in SQL Server muss die Ordnungsposition einer Spalte in der Datendatei mit der Ordnungsposition der Spalte in der Datenbanktabelle identisch sein. Beim Kopieren aus SQL Server platziert bcp_exec Daten basierend auf der Ordnungsposition der Spalte in der Datenbanktabelle.

  • Wenn ein Datenbankdatentyp eine variable Länge aufweist (z. B. varbinary(22)) oder wenn eine Datenbankspalte NULL-Werte enthalten kann, wird den Daten in der Datendatei ein Längen-/NULL-Indikator vorangestellt. Die Breite des Indikators ändert sich auf der Grundlage des Datentyps und der Version der Massenkopierfunktion.

Rufen Sie bcp_columns und bcp_colfmt auf, um die für eine Datendatei angegebenen Datenformatwerte zu ändern.

Massenkopien in SQL Server können für Tabellen optimiert werden, die keine Indizes enthalten, indem Sie das Datenbankwiederherstellungsmodell auf SIMPLE oder BULK_LOGGED festlegen. Weitere Informationen finden Sie unter Voraussetzungen für minimale Protokollierung im Massenimport und ALTER DATABASE.

Wenn keine Datendatei verwendet wird, müssen Sie bcp_bind aufrufen, um das Format und den Speicherort im Arbeitsspeicher der Daten für jede Spalte anzugeben, und dann datenzeilen mithilfe von bcp_sendrow in die SQL Server kopieren.

Beispiel

Dieses Beispiel zeigt, wie die ODBC-Funktion bcp_init mit einer Formatdatei verwendet wird.

Bevor Sie den C++-Code kompilieren und ausführen, sind folgende Schritte erforderlich:

  • Erstellen einer ODBC-Datenquelle mit dem Namen "Test". Sie können diese Datenquelle einer beliebigen Datenbank zuordnen.

  • Führen Sie die folgende Transact-SQL-Instanz für die Datenbank aus:

    CREATE TABLE BCPDate (cola int, colb datetime);  
    
  • Fügen Sie dem Verzeichnis, in dem Sie die Anwendung ausführen, eine Datei namens Bcpfmt.fmt hinzu, und fügen Sie Folgendes in die Datei ein:

    8.0  
    2  
    1SQLCHAR04"\t"1colaSQL_Latin1_General_Cp437_Bin  
    2SQLCHAR08"\r\n"2colbSQL_Latin1_General_Cp437_Bin  
    
  • Fügen Sie dem Verzeichnis, in dem Sie die Anwendung ausführen, eine Datei namens Bcpodbc.bcp hinzu, und fügen Sie Folgendes in die Datei ein:

    1  
    2  
    

Nun sind Sie bereit, C++-Code zu kompilieren und auszuführen.

// compile with: odbc32.lib sqlncli11.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*)"Test", 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);  
}  
  

Weitere Informationen

Bulk Copy Functions