Udostępnij za pośrednictwem


bcp_init

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics 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);  
}  
  

Zobacz też

funkcje kopiowania zbiorczego