bcp_init
Initialisiert den Massenkopiervorgang.
Syntax
RETCODE bcp_init (
HDBC
hdbc
,
LPCTSTR
szTable
,
LPCTSTR
szDataFile
,
LPCTSTR
szErrorFile
,
INT
eDirection
);
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 Rechtlichen Tabellennamen.
Wenn eDirection DB_OUT ist, kann szTable auch der Name einer Datenbankansicht 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 bcp_init-Funktion 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 auf SQL_BCP_ON für ein zugeordnetes, aber nicht verbundenes Verbindungshandle 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 Datenbankquelle oder Zieltabelle, nicht die Datendatei. bcp_init gibt Datenformatwerte für die Datendatei basierend auf jeder Spalte in der Datenbanktabelle, -ansicht oder im 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 mit ganzzahligem Datentyp 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 in der Datenbanktabelle, Sicht oder SELECT-Spaltenliste angegebenen Daten identisch 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, 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 längenvariabel ist (z. B . varbinary(22)) oder wenn eine Datenbankspalte NULL-Werte enthalten kann, wird den Daten in der Datendatei ein Länge/NULL-Indikator vorangestellt. Die Breite des Indikators ändert sich auf der Grundlage des Datentyps und der Version der Massenkopierfunktion.
Um die für eine Datendatei angegebenen Datenformatwerte zu ändern, rufen Sie bcp_columns und bcp_colfmt auf.
Massenkopien in SQL Server können für Tabellen ohne Indizes optimiert werden, indem Sie das Datenbankwiederherstellungsmodell auf SIMPLE oder BULK_LOGGED festlegen. Weitere Informationen finden Sie unter Voraussetzungen für die 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 Speicher der Datens fsor 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);
}