Delen via


bcp_init

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Initialiseert de bulkkopiebewerking.

Syntaxis

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

Unicode- en ANSI-namen:

  • bcp_initA (ANSI)
  • bcp_initW (Unicode)

Argumenten

hdbc-
Is de ODBC-verbindingshandgreep waarvoor bulksgewijs kopiëren is ingeschakeld.

szTable-
Is de naam van de databasetabel die moet worden gekopieerd naar of uit. Deze naam kan ook de databasenaam of de naam van de eigenaar bevatten. Bijvoorbeeld pubs.gracie.titels, pubs.. titels, gracie.titlesen titels zijn alle juridische tabelnamen.

Als eDirection- is DB_OUT, kan szTable- ook de naam van een databaseweergave zijn.

Als eDirection- is DB_OUT en een SELECT-instructie wordt opgegeven met bcp_control voordat bcp_exec wordt aangeroepen, moet bcp_initszTable- worden ingesteld op NULL.

szDataFile-
Is de naam van het gebruikersbestand dat moet worden gekopieerd naar of uit. Als gegevens rechtstreeks vanuit variabelen worden gekopieerd met behulp van bcp_sendrow, stelt u szDataFile- in op NULL.

szErrorFile-
Is de naam van het foutenbestand dat moet worden gevuld met voortgangsberichten, foutberichten en kopieën van rijen die om welke reden dan ook niet uit een gebruikersbestand naar een tabel kunnen worden gekopieerd. Als NULL wordt doorgegeven als szErrorFile, wordt er geen foutbestand gebruikt.

eDirection-
Is de richting van de kopie, ofwel DB_IN of DB_OUT. DB_IN geeft een kopie aan van programmavariabelen of een gebruikersbestand naar een tabel. DB_OUT geeft een kopie van een databasetabel naar een gebruikersbestand aan. U moet een gebruikersnaam opgeven met DB_OUT.

Retourneert

SLAGEN OF MISLUKKEN.

Opmerkingen

Roep bcp_init aan voordat u een andere functie voor bulksgewijs kopiëren aanroept. bcp_init voert de benodigde initialisaties uit voor een bulkkopie van gegevens tussen het werkstation en SQL Server.

De bcp_init-functie moet worden geleverd met een ODBC-verbindingsgreep die is ingeschakeld voor gebruik met functies voor bulksgewijs kopiëren. Als u de ingang wilt inschakelen, gebruikt u SQLSetConnectAttr- met SQL_COPT_SS_BCP ingesteld op SQL_BCP_ON op een toegewezen, maar niet verbonden verbindingsgreep. Als u probeert het kenmerk toe te wijzen aan een verbonden ingang, treedt er een fout op.

Wanneer een gegevensbestand is opgegeven, bcp_init de structuur van de databasebron- of doeltabel onderzoekt, niet het gegevensbestand. bcp_init geeft waarden voor de gegevensindeling op voor het gegevensbestand op basis van elke kolom in de databasetabel, weergave of SELECT-resultatenset. Deze specificatie omvat het gegevenstype van elke kolom, de aanwezigheid of afwezigheid van een lengte of null-indicator en afsluit-bytetekenreeksen in de gegevens en de breedte van gegevenstypen met vaste lengte. bcp_init deze waarden als volgt instelt:

  • Het opgegeven gegevenstype is het gegevenstype van de kolom in de databasetabel, weergave of SELECT-resultatenset. Het gegevenstype wordt geïnventariseerd door systeemeigen SQL Server-gegevenstypen die zijn opgegeven in sqlncli.h. Gegevens worden weergegeven in de computervorm. Dat wil gezegd: gegevens uit een kolom van geheel getal gegevenstype worden vertegenwoordigd door een reeks van vier bytes die big of little-endian is gebaseerd op de computer die het gegevensbestand heeft gemaakt.

  • Als een databasegegevenstype lang is, worden de gegevens van het gegevensbestand ook in lengte vastgezet. Functies voor bulksgewijs kopiëren die gegevens verwerken (bijvoorbeeld bcp_exec) parseren gegevensrijen waarvan wordt verwacht dat de lengte van de gegevens in het gegevensbestand identiek is aan de lengte van de gegevens die zijn opgegeven in de databasetabel, weergave of SELECT-kolomlijst. Gegevens voor een databasekolom die zijn gedefinieerd als char(13) moeten bijvoorbeeld worden vertegenwoordigd door 13 tekens voor elke rij met gegevens in het bestand. Gegevens met een vaste lengte kunnen worden voorafgegaan door een null-indicator als de databasekolom null-waarden toestaat.

  • Wanneer de afsluit-bytereeks wordt gedefinieerd, wordt de lengte van de afsluit-bytereeks ingesteld op 0.

  • Bij het kopiëren naar SQL Server moet het gegevensbestand gegevens bevatten voor elke kolom in de databasetabel. Bij het kopiëren van SQL Server worden gegevens uit alle kolommen in de databasetabel, weergave of SELECT-resultatenset gekopieerd naar het gegevensbestand.

  • Bij het kopiëren naar SQL Server moet de rangschikking van een kolom in het gegevensbestand identiek zijn aan de rangschikking van de kolom in de databasetabel. Wanneer u kopieert vanuit SQL Server, plaatst bcp_exec gegevens op basis van de rangschikking van de kolom in de databasetabel.

  • Als een databasegegevenstype variabel is in lengte (bijvoorbeeld varbinary(22)) of als een databasekolom null-waarden kan bevatten, worden gegevens in het gegevensbestand voorafgegaan door een lengte/null-indicator. De breedte van de indicator varieert op basis van het gegevenstype en de versie van bulksgewijs kopiëren.

Als u waarden voor de gegevensindeling wilt wijzigen die zijn opgegeven voor een gegevensbestand, roept u bcp_columns en bcp_colfmtaan.

Bulkkopieën naar SQL Server kunnen worden geoptimaliseerd voor tabellen die geen indexen bevatten door het databaseherstelmodel in te stellen op SIMPLE of BULK_LOGGED. Zie vereisten voor minimale logboekregistratie in bulkimport en ALTER DATABASEvoor meer informatie.

Als er geen gegevensbestand wordt gebruikt, moet u bcp_bind aanroepen om de indeling en locatie in het geheugen van de gegevens voor elke kolom op te geven en vervolgens gegevensrijen naar de SQL Server te kopiëren met behulp van bcp_sendrow.

Voorbeeld

In dit voorbeeld ziet u hoe u de functie ODBC bcp_init gebruikt met een indelingsbestand.

Voordat u de C++-code compileert en uitvoert, moet u de volgende stappen uitvoeren:

  • Maak een ODBC-gegevensbron met de naam Test. U kunt deze gegevensbron koppelen aan elke database.

  • Voer de volgende Transact-SQL uit op de database:

    CREATE TABLE BCPDate (cola int, colb datetime);  
    
  • Voeg in de map waar u de toepassing uitvoert een bestand met de naam Bcpfmt.fmt toe en voeg deze inhoud toe aan het bestand:

    8.0  
    2  
    1SQLCHAR04"\t"1colaSQL_Latin1_General_Cp437_Bin  
    2SQLCHAR08"\r\n"2colbSQL_Latin1_General_Cp437_Bin  
    
  • Voeg in de map waar u de toepassing uitvoert een bestand toe met de naam Bcpodbc.bcp en voeg inhoud toe aan het bestand:

    1  
    2  
    

U bent nu klaar om de C++-code te compileren en uit te voeren.

// 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);  
}  
  

Zie ook

Functies bulksgewijs kopiëren