Sdílet prostřednictvím


bcp_init

platí pro:SQL ServerAzure SQL Databaseazure SQL Managed InstanceAzure Synapse AnalyticsPlatform Platform System (PDW)

Inicializuje operaci hromadného kopírování.

Syntax

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

Názvy Unicode a ANSI:

  • bcp_initA (ANSI)
  • bcp_initW (Unicode)

Argumenty

hdbc
Je popisovač připojení ODBC s podporou hromadného kopírování.

szTable
Je název databázové tabulky, do které se má zkopírovat nebo zkopírovat. Tento název může obsahovat také název databáze nebo jméno vlastníka. Například pubs.gracie.titles, pubs.. názvy, gracie.titlesa názvy jsou názvy právních tabulek.

Pokud je DB_OUT eDirection, tabulky szTable může být také název zobrazení databáze.

Pokud je eDirection DB_OUT a příkaz SELECT je zadán pomocí bcp_control před zavolání bcp_exec, bcp_initszTable musí být nastavena na HODNOTU NULL.

szDataFile
Je jméno uživatelského souboru, do které se má zkopírovat nebo zkopírovat. Pokud se data kopírují přímo z proměnných pomocí bcp_sendrow, nastavte szDataFile null.

szErrorFile
Je název souboru chyby, který se má vyplnit zprávami o průběhu, chybovými zprávami a kopiemi všech řádků, které z jakéhokoli důvodu nebylo možné zkopírovat ze souboru uživatele do tabulky. Pokud je hodnota NULL předána jako szErrorFile, nepoužívá se žádný chybový soubor.

eDirection
Je směr kopie, a to buď DB_IN, nebo DB_OUT. DB_IN označuje kopii z proměnných programu nebo souboru uživatele do tabulky. DB_OUT označuje kopii z databázové tabulky do souboru uživatele. Je nutné zadat uživatelské jméno souboru s DB_OUT.

Návraty

ÚSPĚŠNÉ nebo NEÚSPĚŠNÉ.

Poznámky

Před voláním jakékoli jiné funkce hromadného kopírování volejte bcp_init. bcp_init provádí potřebná inicializace pro hromadnou kopii dat mezi pracovní stanicí a SQL Serverem.

Funkce bcp_init musí být k dispozici s povoleným popisovačem připojení ODBC pro použití s funkcemi hromadného kopírování. Pokud chcete popisovač povolit, použijte sqlSetConnectAttr s SQL_COPT_SS_BCP nastaveným na SQL_BCP_ON u přiděleného, ale ne připojeného popisovače připojení. Při pokusu o přiřazení atributu na připojeném popisovači dojde k chybě.

Při zadání datového souboru bcp_init prozkoumá strukturu zdroje databáze nebo cílové tabulky, nikoli datového souboru. bcp_init určuje hodnoty formátu dat pro datový soubor na základě každého sloupce v tabulce databáze, zobrazení nebo sadě výsledků SELECT. Tato specifikace zahrnuje datový typ každého sloupce, přítomnost nebo nepřítomnost indikátoru délky nebo hodnoty null a ukončovací bajtové řetězce v datech a šířku datových typů s pevnou délkou. bcp_init tyto hodnoty nastaví takto:

  • Zadaný datový typ je datový typ sloupce v tabulce databáze, zobrazení nebo sadě výsledků SELECT. Datový typ je uveden nativními datovými typy SQL Serveru zadanými v sqlncli.h. Data jsou reprezentována v počítačové podobě. To znamená, že data ze sloupce celé číslo jsou reprezentována 4 bajtovou sekvencí, která je velká nebo malá endian založená na počítači, který datový soubor vytvořil.

  • Pokud je datový typ databáze pevně dlouhý, data datového souboru jsou také pevná. Funkce hromadného kopírování, které zpracovávají data (například bcp_exec) analyzují řádky dat, které očekávají, že délka dat v datovém souboru bude stejná jako délka dat zadaných v seznamu sloupců databáze, zobrazení nebo SELECT. Například data pro databázový sloupec definovaný jako char(13) musí být reprezentována 13 znaky pro každý řádek dat v souboru. Data s pevnou délkou mohou být předponou s indikátorem null, pokud sloupec databáze povoluje hodnoty null.

  • Pokud je definována sekvence ukončovací bajtů, je délka sekvence ukončovacího bajtu nastavena na hodnotu 0.

  • Při kopírování na SQL Server musí mít datový soubor data pro každý sloupec v tabulce databáze. Při kopírování z SQL Serveru se data ze všech sloupců v tabulce databáze, zobrazení nebo sadě výsledků SELECT zkopírují do datového souboru.

  • Při kopírování na SQL Server musí být pořadové umístění sloupce v datovém souboru shodné s pořadovým umístěním sloupce v tabulce databáze. Při kopírování z SQL Serveru bcp_exec data umístí na základě pořadí sloupců v tabulce databáze.

  • Pokud je datový typ databáze proměnlivý (například varbinary(22)) nebo pokud sloupec databáze může obsahovat hodnoty null, data v datovém souboru mají předponu indikátor délky/null. Šířka ukazatele se liší podle datového typu a verze hromadného kopírování.

Pokud chcete změnit hodnoty formátu dat zadané pro datový soubor, zavolejte bcp_columns a bcp_colfmt.

Hromadné kopie na SQL Server je možné optimalizovat pro tabulky, které neobsahují indexy, nastavením modelu obnovení databáze na SIMPLE nebo BULK_LOGGED. Další informace najdete v tématu Požadavky pro minimální protokolování v hromadného importu a ALTER DATABASE.

Pokud se nepoužívá žádný datový soubor, je nutné volat bcp_bind určit formát a umístění v paměti dat pro každý sloupec a potom zkopírovat datové řádky na SQL Server pomocí bcp_sendrow.

Příklad

Tato ukázka ukazuje, jak používat funkci ODBC bcp_init se souborem formátu.

Před kompilací a spuštěním kódu C++ musíte provést následující kroky:

  • Vytvořte zdroj dat ODBC s názvem Test. Tento zdroj dat můžete přidružit k jakékoli databázi.

  • V databázi spusťte následující Transact-SQL:

    CREATE TABLE BCPDate (cola int, colb datetime);  
    
  • Do adresáře, ve kterém aplikaci spouštíte, přidejte soubor s názvem Bcpfmt.fmt a přidejte do souboru tento obsah:

    8.0  
    2  
    1SQLCHAR04"\t"1colaSQL_Latin1_General_Cp437_Bin  
    2SQLCHAR08"\r\n"2colbSQL_Latin1_General_Cp437_Bin  
    
  • Do adresáře, ve kterém aplikaci spouštíte, přidejte soubor s názvem Bcpodbc.bcp a přidejte do souboru obsah:

    1  
    2  
    

Teď jste připraveni zkompilovat a spustit kód 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);  
}  
  

Viz také

funkce hromadného kopírování