bcp_init
Dotyczy:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Inicjuje operację kopiowania zbiorczego.
Składnia
RETCODE bcp_init (
HDBC hdbc,
LPCTSTR szTable,
LPCTSTR szDataFile,
LPCTSTR szErrorFile,
INT eDirection);
Nazwy Unicode i ANSI:
- bcp_initA (ANSI)
- bcp_initW (Unicode)
Argumenty
hdbc
Czy obsługa połączenia ODBC z obsługą kopiowania zbiorczego.
szTable
To nazwa tabeli bazy danych, która ma zostać skopiowana do lub z tabeli. Ta nazwa może również zawierać nazwę bazy danych lub nazwę właściciela. Na przykład pubs.gracie.titles, pubs.. tytuły, gracie.titlesi tytuły są nazwami tabel prawnych.
Jeśli eDirection jest DB_OUT, table może być również nazwą widoku bazy danych.
Jeśli eDirection jest DB_OUT, a instrukcja SELECT jest określona przy użyciu bcp_control przed wywołaniem bcp_exec, bcp_init tabeli szTable musi być ustawiona na wartość NULL.
szDataFile
To nazwa pliku użytkownika, który ma zostać skopiowany do lub z pliku. Jeśli dane są kopiowane bezpośrednio ze zmiennych przy użyciu bcp_sendrow, ustaw szDataFile na wartość NULL.
szErrorFile
To nazwa pliku błędu, który ma być wypełniony komunikatami postępu, komunikatami o błędach i kopiami jakichkolwiek wierszy, które z jakiegokolwiek powodu nie mogą być kopiowane z pliku użytkownika do tabeli. Jeśli wartość NULL jest przekazywana jako szErrorFile, nie jest używany plik błędu.
eDirection
To kierunek kopiowania, DB_IN lub DB_OUT. DB_IN wskazuje kopię ze zmiennych programu lub plik użytkownika do tabeli. DB_OUT wskazuje kopię z tabeli bazy danych do pliku użytkownika. Musisz określić nazwę pliku użytkownika z DB_OUT.
Zwraca
POWODZENIE lub NIEPOWODZENIE.
Uwagi
Wywołaj bcp_init przed wywołaniem dowolnej innej funkcji kopiowania zbiorczego. bcp_init wykonuje niezbędne inicjacje dla zbiorczej kopii danych między stacją roboczą a programem SQL Server.
Funkcja bcp_init musi być dostarczana z włączonym dojściem połączenia ODBC do użycia z funkcjami kopiowania zbiorczego. Aby włączyć dojście, użyj SQLSetConnectAttr z SQL_COPT_SS_BCP ustawioną na SQL_BCP_ON na przydzielonym, ale nie połączonym dojściu połączenia. Próba przypisania atrybutu na połączonym dojściu powoduje wystąpienie błędu.
Po określeniu pliku danych bcp_init bada strukturę źródłowej lub docelowej tabeli bazy danych, a nie pliku danych. bcp_init określa wartości formatu danych dla pliku danych na podstawie każdej kolumny w tabeli bazy danych, widoku lub zestawu wyników SELECT. Ta specyfikacja obejmuje typ danych każdej kolumny, obecność lub brak wskaźnika długości lub wartości null oraz ciągi bajtów zakończenia w danych oraz szerokość typów danych o stałej długości. bcp_init ustawia następujące wartości:
Określony typ danych to typ danych kolumny w tabeli bazy danych, widoku lub wybierz zestaw wyników. Typ danych jest wyliczany przez natywne typy danych programu SQL Server określone w pliku sqlncli.h. Dane są reprezentowane w postaci komputera. Oznacza to, że dane z kolumny całkowitej typu danych są reprezentowane przez sekwencję 4-bajtową, która jest big-or little-endian oparta na komputerze, który utworzył plik danych.
Jeśli typ danych bazy danych ma stałą długość, dane pliku danych są również stałe. Funkcje kopiowania zbiorczego przetwarzające dane (na przykład bcp_exec) analizują wiersze danych, które oczekują, że długość danych w pliku danych będzie taka sama jak długość danych określonych w tabeli bazy danych, widoku lub liście kolumn SELECT. Na przykład dane dla kolumny bazy danych zdefiniowanej jako char(13) muszą być reprezentowane przez 13 znaków dla każdego wiersza danych w pliku. Dane o stałej długości mogą być poprzedzone wskaźnikiem o wartości null, jeśli kolumna bazy danych zezwala na wartości null.
Po zdefiniowaniu sekwencji terminatora bajtów długość sekwencji terminatora-bajtów wynosi 0.
Podczas kopiowania do programu SQL Server plik danych musi zawierać dane dla każdej kolumny w tabeli bazy danych. Podczas kopiowania z programu SQL Server dane ze wszystkich kolumn w tabeli bazy danych, widoku lub zestawu wyników SELECT są kopiowane do pliku danych.
Podczas kopiowania do programu SQL Server położenie porządkowe kolumny w pliku danych musi być identyczne z położeniem porządkowym kolumny w tabeli bazy danych. Podczas kopiowania z programu SQL Server bcp_exec umieszcza dane na podstawie porządkowej pozycji kolumny w tabeli bazy danych.
Jeśli typ danych bazy danych jest zmienną długością (na przykład varbinary(22)) lub jeśli kolumna bazy danych może zawierać wartości null, dane w pliku danych są poprzedzone wskaźnikiem długości/wartości null. Szerokość wskaźnika różni się w zależności od typu danych i wersji kopii zbiorczej.
Aby zmienić wartości formatu danych określone dla pliku danych, wywołaj bcp_columns i bcp_colfmt.
Kopie zbiorcze do programu SQL Server można zoptymalizować pod kątem tabel, które nie zawierają indeksów, ustawiając model odzyskiwania bazy danych na SIMPLE lub BULK_LOGGED. Aby uzyskać więcej informacji, zobacz Wymagania wstępne dotyczące minimalnego rejestrowania w importowania zbiorczego i ALTER DATABASE.
Jeśli plik danych nie jest używany, należy wywołać bcp_bind, aby określić format i lokalizację w pamięci danych dla każdej kolumny, a następnie skopiować wiersze danych do programu SQL Server przy użyciu bcp_sendrow.
Przykład
W tym przykładzie pokazano, jak używać funkcji bcp_init ODBC z plikiem formatu.
Przed skompilowanie i uruchomieniem kodu C++ należy wykonać następujące czynności:
Utwórz źródło danych ODBC o nazwie Test. To źródło danych można skojarzyć z dowolną bazą danych.
Uruchom następujące Transact-SQL w bazie danych:
CREATE TABLE BCPDate (cola int, colb datetime);
W katalogu, w którym jest uruchamiana aplikacja, dodaj plik o nazwie Bcpfmt.fmt i dodaj tę zawartość do pliku:
8.0 2 1SQLCHAR04"\t"1colaSQL_Latin1_General_Cp437_Bin 2SQLCHAR08"\r\n"2colbSQL_Latin1_General_Cp437_Bin
W katalogu, w którym uruchamiasz aplikację, dodaj plik o nazwie Bcpodbc.bcp i dodaj zawartość do pliku:
1 2
Teraz możesz przystąpić do kompilowania i uruchamiania kodu C++.
// 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);
}