Massenkopie ohne Formatdatei (ODBC)

In diesem Beispiel wird gezeigt, wie Sie Massenkopiefunktionen verwenden, um eine Datendatei im nativen Modus ohne Formatdatei zu erstellen. Dieses Beispiel wurde für ODBC Version 3.0 oder höher entwickelt.

Von Bedeutung

Verwenden Sie nach Möglichkeit die Windows-Authentifizierung. Wenn die Windows-Authentifizierung nicht verfügbar ist, werden Benutzer aufgefordert, ihre Anmeldeinformationen zur Laufzeit einzugeben. Vermeiden Sie das Speichern von Anmeldeinformationen in einer Datei. Wenn Sie Anmeldeinformationen beibehalten müssen, sollten Sie sie mit der Win32-Krypto-API verschlüsseln.

So kopieren Sie eine Massenkopie ohne Formatdatei

  1. Weisen Sie ein Umgebungshandle und ein Verbindungshandle zu.

  2. Legen Sie SQL_COPT_SS_BCP und SQL_BCP_ON fest, um Massenkopievorgänge zu aktivieren.

  3. Stellen Sie eine Verbindung mit SQL Server her.

  4. Rufen Sie bcp_init auf, um die folgenden Informationen festzulegen:

    • Der Name der Tabelle oder Ansicht, aus der bzw. in die eine Massenkopie kopiert werden soll.

    • Der Name der Datendatei, die die daten enthält, die in die Datenbank kopiert werden sollen oder die Beim Kopieren aus der Datenbank Daten empfängt.

    • Der Name einer Datendatei zum Empfangen von Fehlermeldungen für Massenkopien (geben Sie NULL an, wenn Sie keine Nachrichtendatei wünschen).

    • Die Richtung der Kopie: DB_IN aus der Datei in die Ansicht oder Tabelle oder DB_OUT in die Datei aus der Tabelle oder Ansicht.

  5. Rufen Sie bcp_exec auf, um den Massenkopievorgang auszuführen.

Wenn DB_OUT mit diesen Schritten festgelegt wird, wird die Datei im systemeigenen Format erstellt. Die Datei kann dann mithilfe der gleichen Schritte in einen Server kopiert werden, mit der Ausnahme, dass DB_OUT anstelle von DB_IN festgelegt ist. Dies funktioniert nur, wenn sowohl die Quell- als auch die Zieltabelle genau dieselbe Struktur aufweisen.

Beispiel

Dieses Beispiel wird für IA64 nicht unterstützt.

Sie benötigen eine ODBC-Datenquelle namens AdventureWorks, deren Standarddatenbank die AdventureWorks-Beispieldatenbank ist. (Sie können die AdventureWorks-Beispieldatenbank von der Startseite für Microsoft SQL Server-Beispiele und Communityprojekte herunterladen.) Diese Datenquelle muss auf dem ODBC-Treiber basieren, der vom Betriebssystem bereitgestellt wird (der Treibername lautet "SQL Server"). Wenn Sie dieses Beispiel als 32-Bit-Anwendung auf einem 64-Bit-Betriebssystem erstellen und ausführen, müssen Sie die ODBC-Datenquelle mit dem ODBC-Administrator in %windir%\SysWOW64\odbcad32.exeerstellen.

In diesem Beispiel wird eine Verbindung mit der SQL Server-Standardinstanz Ihres Computers hergestellt. Um eine Verbindung mit einer benannten Instanz herzustellen, ändern Sie die Definition der ODBC-Datenquelle, um die Instanz mithilfe des folgenden Formats anzugeben: Server\nAmedinstance. Sql Server Express wird standardmäßig in einer benannten Instanz installiert.

Kompilieren sie mit odbc32.lib und odbcbcp.lib.

// compile with: odbc32.lib odbcbcp.lib  
#include <stdio.h>  
#include <string.h>  
#include <windows.h>  
#include <sql.h>  
#include <sqlext.h>  
#include <odbcss.h>  
  
#define MAXBUFLEN 256  
  
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;  
  
   // Bulk copy variables.  
   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 bulk copy mode, and then 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 the SQL Server DSN using Windows NT authentication.   
   retcode = SQLConnect(hdbc1, (UCHAR*)"AdventureWorks", 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, "Purchasing.Vendor", "BCPODBC.bcp", "BCPERROR.out", DB_OUT);  
   // Test is for the bulk copy return of SUCCEED, not the ODBC return of SQL_SUCCESS.  
   if ( (retcode != SUCCEED) ) {  
      printf("bcp_init(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 out = %d.\n", cRows);  
  
   // Cleanup  
   SQLDisconnect(hdbc1);  
   SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);  
   SQLFreeHandle(SQL_HANDLE_ENV, henv);  
}  

Siehe auch

Massenkopien mit dem SQL Server ODBC-Treiber how-to Topics (ODBC)