bcp_init

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)

Menginisialisasi operasi penyalinan massal.

Sintaks

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

Nama Unicode dan ANSI:

  • bcp_initA (ANSI)
  • bcp_initW (Unicode)

Argumen

hdbc
Adalah handel koneksi ODBC yang mendukung penyalinan massal.

szTable
Adalah nama tabel database yang akan disalin ke dalam atau di luar. Nama ini juga dapat menyertakan nama database atau nama pemilik. Misalnya, pubs.gracie.titles, pubs.. judul, gracie.titles, dan judul semuanya adalah nama tabel legal.

Jika eDirection DB_OUT, szTable juga bisa menjadi nama tampilan database.

Jika eDirection DB_OUT dan pernyataan SELECT ditentukan menggunakan bcp_control sebelum bcp_exec dipanggil, bcp_initszTable harus diatur ke NULL.

szDataFile
Adalah nama file pengguna yang akan disalin ke dalam atau kehabisan. Jika data sedang disalin langsung dari variabel dengan menggunakan bcp_sendrow, atur szDataFile ke NULL.

szErrorFile
Apakah nama file kesalahan yang akan diisi dengan pesan kemajuan, pesan kesalahan, dan salinan baris apa pun yang, karena alasan apa pun, tidak dapat disalin dari file pengguna ke tabel. Jika NULL diteruskan sebagai szErrorFile, tidak ada file kesalahan yang digunakan.

eDirection
Adalah arah salinan, baik DB_IN atau DB_OUT. DB_IN menunjukkan salinan dari variabel program atau file pengguna ke tabel. DB_OUT menunjukkan salinan dari tabel database ke file pengguna. Anda harus menentukan nama file pengguna dengan DB_OUT.

Kembali

BERHASIL atau GAGAL.

Keterangan

Panggil bcp_init sebelum memanggil fungsi salinan massal lainnya. bcp_init melakukan inisialisasi yang diperlukan untuk salinan data massal antara stasiun kerja dan SQL Server.

Fungsi bcp_init harus disediakan dengan handel koneksi ODBC yang diaktifkan untuk digunakan dengan fungsi salinan massal. Untuk mengaktifkan handel, gunakan SQLSetConnectAttr dengan SQL_COPT_SS_BCP diatur ke SQL_BCP_ON pada handel koneksi yang dialokasikan, tetapi tidak tersambung. Mencoba menetapkan atribut pada handel yang tersambung menghasilkan kesalahan.

Saat file data ditentukan, bcp_init memeriksa struktur sumber database atau tabel target, bukan file data. bcp_init menentukan nilai format data untuk file data berdasarkan setiap kolom dalam tabel database, tampilan, atau kumpulan hasil SELECT. Spesifikasi ini mencakup jenis data setiap kolom, keberadaan atau tidak adanya string byte panjang atau null dan indikator null dalam data, dan lebar jenis data dengan panjang tetap. bcp_init menetapkan nilai-nilai ini sebagai berikut:

  • Tipe data yang ditentukan adalah tipe data kolom dalam tabel database, tampilan, atau kumpulan hasil SELECT. Jenis data dijumlahkan oleh jenis data asli SQL Server yang ditentukan dalam sqlncli.h. Data itu sendiri diwakili dalam bentuk komputernya. Artinya, data dari kolom jenis data bilangan bulat diwakili oleh urutan empat byte yang besar atau little-endian berdasarkan komputer yang membuat file data.

  • Jika panjang jenis data database diperbaiki, data file data juga diperbaiki panjangnya. Fungsi salin massal yang memproses data (misalnya, bcp_exec) mengurai baris data yang mengharapkan panjang data dalam file data identik dengan panjang data yang ditentukan dalam tabel database, tampilan, atau daftar kolom SELECT. Misalnya, data untuk kolom database yang didefinisikan sebagai karakter (13) harus diwakili oleh 13 karakter untuk setiap baris data dalam file. Data panjang tetap dapat diawali dengan indikator null jika kolom database mengizinkan nilai null.

  • Ketika urutan terminator-byte ditentukan, panjang urutan terminator-byte diatur ke 0.

  • Saat menyalin ke SQL Server, file data harus memiliki data untuk setiap kolom dalam tabel database. Saat menyalin dari SQL Server, data dari semua kolom dalam tabel database, tampilan, atau kumpulan hasil SELECT disalin ke file data.

  • Saat menyalin ke SQL Server, posisi ordinal kolom dalam file data harus identik dengan posisi ordinal kolom dalam tabel database. Saat menyalin dari SQL Server, bcp_exec menempatkan data berdasarkan posisi ordinal kolom dalam tabel database.

  • Jika tipe data database memiliki panjang variabel (misalnya, varbinary(22)) atau jika kolom database dapat berisi nilai null, data dalam file data diawali dengan indikator panjang/null. Lebar indikator bervariasi berdasarkan jenis data dan versi salinan massal.

Untuk mengubah nilai format data yang ditentukan untuk file data, panggil bcp_columns dan bcp_colfmt.

Salinan massal ke SQL Server dapat dioptimalkan untuk tabel yang tidak berisi indeks dengan mengatur model pemulihan database ke SIMPLE atau BULK_LOGGED. Untuk informasi selengkapnya, lihat Prasyarat untuk Pengelogan Minimal dalam Impor Massal dan UBAH DATABASE.

Jika tidak ada file data yang digunakan, Anda harus memanggil bcp_bind untuk menentukan format dan lokasi dalam memori data untuk setiap kolom, lalu menyalin baris data ke SQL Server menggunakan bcp_sendrow.

Contoh

Sampel ini menunjukkan cara menggunakan fungsi odbc bcp_init dengan file format.

Sebelum mengkompilasi dan menjalankan kode C++, Anda perlu melakukan hal berikut:

  • Buat sumber data ODBC yang disebut Uji. Anda dapat mengaitkan sumber data ini dengan database apa pun.

  • Jalankan Transact-SQL berikut pada database:

    CREATE TABLE BCPDate (cola int, colb datetime);  
    
  • Di direktori tempat Anda akan menjalankan aplikasi, tambahkan file yang disebut Bcpfmt.fmt, dan tambahkan ini ke file:

    8.0  
    2  
    1SQLCHAR04"\t"1colaSQL_Latin1_General_Cp437_Bin  
    2SQLCHAR08"\r\n"2colbSQL_Latin1_General_Cp437_Bin  
    
  • Di direktori tempat Anda akan menjalankan aplikasi, tambahkan file bernama Bcpodbc.bcp, dan tambahkan ini ke file:

    1  
    2  
    

Sekarang Anda siap untuk mengkompilasi dan menjalankan kode 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);  
}  
  

Lihat Juga

Fungsi Salin Massal