bcp_init
Initialisiert den Massenkopiervorgang.
Syntax
RETCODE bcp_init (
HDBC hdbc,
LPCTSTR szTable,
LPCTSTR szDataFile,
LPCTSTR szErrorFile,
INT eDirection);
Argumente
hdbc
Das für das Massenkopieren 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. Beispielsweise sind pubs.gracie.titles, pubs..titles, gracie.titles oder titles gültige Tabellennamen.Wenn eDirection DB_OUT ist, kann szTable auch der Name einer Datenbanksicht sein.
Wenn eDirection DB_OUT ist und eine SELECT-Anweisung unter Verwendung von bcp_control angegeben wird, bevor bcp_exec aufgerufen wird, muss für bcp_initszTable NULL festgelegt werden.
szDataFile
Name der Benutzerdatei, in die bzw. aus der kopiert werden soll. Wenn Daten unter Verwendung von bcp_sendrow direkt aus Variablen kopiert werden sollen, legen Sie für szDataFile 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 als szErrorFile NULL ü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.
Rückgabewerte
SUCCEED oder FAIL
Hinweise
Rufen Sie bcp_init vor dem Aufruf aller anderen Massenkopierfunktionen auf. bcp_init führt die erforderlichen Initialisierungen für einen Massenkopiervorgang zwischen der Arbeitsstation und SQL Server durch.
Für die bcp_init-Funktion muss ein ODBC-Verbindungshandle bereitgestellt und für die Verwendung mit den Massenkopierfunktionen aktiviert werden. Verwenden Sie SQLSetConnectAttr, und legen Sie für ein zugeordnetes, aber nicht verbundenes Verbindungshandle SQL_COPT_SS_BCP auf SQL_BCP_ON fest, um das Handle zu aktivieren. 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 der Zieltabelle, nicht jedoch die Datendatei. bcp_init gibt basierend auf jeder Spalte in der Datenbanktabelle, jeder Sicht oder jedem SELECT-Resultset Datenformatwerte für die Datendatei an. Diese Angaben enthalten unter anderem den Datentyp jeder Spalte, das Vorhandensein bzw. Nichtvorhandensein eines Längen- oder NULL-Wertindikators und von Bytezeichenfolgen des Abschlusszeichens in den 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 von den in der Datei sqlncli.h angegebenen systemeigenen Datentypen von SQL Server aufgelistet. Die Daten selbst werden in computereigenem Format dargestellt, d. h. Daten aus einer Spalte vom integer-Datentyp werden in einer Sequenz aus vier Byte dargestellt, die, abhängig von dem Computer, auf dem die Datendatei erstellt wurde, das Format Big-Endian oder Little-Endian aufweisen.
Wenn ein Datenbankdatentyp eine feste Länge hat, haben auch die Daten der Datendatei eine feste Länge. Beim Verarbeiten der Daten durch Massenkopierfunktionen (beispielsweise bcp_exec) werden die Datenzeilen analysiert. Dabei wird erwartet, dass die Länge der Daten in der Datendatei identisch mit der Länge der Daten in der Datenbanktabelle, Sicht oder SELECT-Spaltenliste ist. So müssen beispielsweise Daten für eine als char(13) definierte Datenbankspalte in jeder Zeile der Datei 13 Zeichen belegen. 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.
Zum Kopieren von Daten in SQL Server muss die Datendatei für jede Spalte der Datenbanktabelle Daten aufweisen. Beim Kopieren von Daten aus SQL Server werden Daten von allen Spalten der Datenbanktabelle, der Sicht oder dem SELECT-Resultset in die Datendatei kopiert.
Beim Kopieren von Daten in SQL Server muss die Ordnungsposition einer Spalte in der Datendatei der Ordnungsposition einer Spalte in der Datenbanktabelle genau entsprechen. Beim Kopieren von Daten aus SQL Server platziert bcp_exec Daten auf der Grundlage der Ordnungsposition der Spalte in der Datenbanktabelle.
Für Datenbank-Datentypen variabler Länge (beispielsweise varbinary(22)) und Datenbankspalten, die NULL-Werte zulassen, wird den Daten in der Datendatei ein Längen-/NULL-Indikator als Präfix hinzugefügt. Die Breite des Indikators ändert sich auf der Grundlage des Datentyps und der Version der Massenkopierfunktion.
Um für eine Datendatei angegebene Datenformatwerte zu ändern, rufen Sie bcp_columns und bcp_colfmt auf.
Massenkopiervorgänge in SQL Server können für Tabellen, die keine Indizes enthalten, optimiert werden, indem das Datenbank-Wiederherstellungsmodul auf SIMPLE oder BULK_LOGGED festgelegt wird. Weitere Informationen finden Sie unter Optimieren der Leistung des Massenimportierens und ALTER DATABASE.
Wenn keine Datendatei verwendet wird, müssen Sie bcp_bind aufrufen, um das Format und den Speicherort der Daten für jede Spalte anzugeben, und anschließend die Datenzeilen mithilfe von bcp_sendrow in 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 für die Datenbank die folgende Transact-SQL-Anweisung 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 sqlncli10.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);
}