bcp_setbulkmode
Berlaku untuk: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
bcp_setbulkmode memungkinkan Anda menentukan format kolom dalam operasi penyalinan massal, mengatur semua atribut kolom dalam satu panggilan fungsi.
Sintaks
RETCODE bcp_setbulkmode (
HDBC hdbc,
INT property,
void * pField,
INT cbField,
void * pRow,
INT cbRow
);
Argumen
hdbc
Handel koneksi ODBC yang mendukung penyalinan massal.
property
Konstanta jenis BYTE. Lihat tabel di bagian Keterangan untuk daftar konstanta.
pField
Penunjuk ke nilai terminator bidang.
cbField
Panjang (dalam byte) dari nilai terminator bidang.
haluan
Penunjuk ke nilai terminator baris.
cbRow
Panjang dalam byte dari nilai terminator baris.
Mengembalikan
BERHASIL atau GAGAL
Keterangan
bcp_setbulkmode dapat digunakan untuk menyalin secara massal dari kueri atau tabel. Saat bcp_setbulkmode digunakan untuk menyalin pernyataan kueri secara massal, pernyataan kueri harus dipanggil sebelum memanggil bcp_control dengan BCP_HINT.
bcp_setbulkmode adalah alternatif untuk menggunakan bcp_setcolfmt dan bcp_columns, yang hanya memungkinkan Anda menentukan format satu kolom per panggilan fungsi.
Tabel berikut mencantumkan konstanta untuk parameter properti .
Properti | Deskripsi |
---|---|
BCP_OUT_CHARACTER_MODE | Menentukan mode output karakter. Sesuai dengan opsi -c di BCP.EXE, dan untuk bcp_setcolfmt dengan properti BCP_FMT_TYPE diatur ke SQLCHARACTER. |
BCP_OUT_WIDE_CHARACTER_MODE | Menentukan mode output Unicode. Sesuai dengan opsi -w di BCP.EXE dan bcp_setcolfmt dengan properti BCP_FMT_TYPE diatur ke SQLNCHAR. |
BCP_OUT_NATIVE_TEXT_MODE | Menentukan jenis asli untuk jenis non-karakter dan Unicode untuk jenis karakter. Sesuai dengan opsi -N di BCP.EXE dan bcp_setcolfmt dengan properti BCP_FMT_TYPE diatur ke SQLNCHAR jika jenis kolom adalah string (default jika bukan string). |
BCP_OUT_NATIVE_MODE | Menentukan jenis database asli. Sesuai dengan opsi -n di BCP.EXE dan bcp_setcolfmt dengan properti BCP_FMT_TYPE diatur ke default. |
Anda tidak boleh menggunakan bcp_setbulkmode dengan urutan panggilan fungsi yang mencakup bcp_setcolfmt, bcp_control, dan bcp_readfmt. Misalnya, Anda tidak boleh memanggil bcp_control(BCPTEXTFILE) dan bcp_setbulkmode.
Anda dapat memanggil bcp_control dan bcp_setbulkmode untuk opsi bcp_control yang tidak bertentangan dengan bcp_setbulkmode. Misalnya, Anda dapat memanggil bcp_control(BCPFIRST) dan bcp_setbulkmode.
Jika Anda mencoba memanggil bcp_setbulkmode dengan urutan panggilan fungsi yang mencakup bcp_setcolfmt, bcp_control, dan bcp_readfmt, salah satu panggilan fungsi akan mengembalikan kegagalan kesalahan urutan. Jika Anda memilih untuk memperbaiki kegagalan, panggil bcp_init untuk mengatur ulang semua pengaturan dan memulai kembali.
Di bawah ini adalah beberapa contoh panggilan fungsi yang mengakibatkan kesalahan urutan fungsi:
bcp_init("table", DB_IN);
bcp_setbulkmode();
bcp_init("table", DB_OUT);
bcp_setbulkmode();
bcp_readfmt();
bcp_init(NULL, DB_OUT);
bcp_control(BCPHINTS, "select ...");
bcp_setbulkmode();
bcp_init("table", DB_OUT);
bcp_setbulkmode();
bcp_setcolfmt();
bcp_init("table", DB_OUT);
bcp_control(BCPDELAYREADFMT, true);
bcp_readfmt();
bcp_setcolfmt();
bcp_init(NULL, DB_OUT);
bcp_control(BCPDELAYREADFMT, true);
bcp_setbulkmode();
bcp_control(BCPHINTS, "select ...");
bcp_readfmt();
bcp_init("table", DB_OUT);
bcp_control(BCPDELAYREADFMT, true);
bcp_columns();
bcp_init("table", DB_OUT);
bcp_control(BCPDELAYREADFMT, true);
bcp_setcolfmt();
Contoh
Sampel berikut membuat empat file menggunakan pengaturan bcp_setbulkmode yang berbeda.
// compile with: sqlncli11.lib odbc32.lib
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <sqlext.h>
#include "sqlncli.h"
// Global variables
SQLHENV g_hEnv = NULL;
SQLHDBC g_hDbc = NULL;
void ODBCCleanUp() {
if (g_hDbc) {
SQLDisconnect(g_hDbc);
SQLFreeHandle(SQL_HANDLE_DBC, g_hDbc);
g_hDbc = NULL;
}
if (g_hEnv) {
SQLFreeHandle(SQL_HANDLE_ENV, g_hEnv);
g_hEnv = NULL;
}
}
BOOL MakeODBCConnection(TCHAR * pszServer) {
TCHAR szConnectionString[500];
TCHAR szOutConnectionString[500];
SQLSMALLINT iLen;
SQLRETURN rc;
_sntprintf_s(szConnectionString, 500, TEXT("DRIVER={SQL Server Native Client 11.0};Server=%s;Trusted_connection=yes;"), pszServer);
rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE,&g_hEnv);
if (SQL_SUCCESS != rc && SQL_SUCCESS_WITH_INFO != rc) {
printf("SQLAllocHandle(SQL_HANDLE_ENV...) failed\n");
return false;
}
rc = SQLSetEnvAttr(g_hEnv,SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_UINTEGER);
if (SQL_SUCCESS != rc && SQL_SUCCESS_WITH_INFO != rc) {
printf("SQLSetEnvAttr failed\n");
SQLFreeHandle(SQL_HANDLE_ENV, g_hEnv);
return false;
}
rc = SQLAllocHandle( SQL_HANDLE_DBC, g_hEnv , &g_hDbc);
if (SQL_SUCCESS != rc && SQL_SUCCESS_WITH_INFO != rc) {
printf("SQLAllocHandle(SQL_HANDLE_DBC...) failed\n");
SQLFreeHandle(SQL_HANDLE_ENV, g_hEnv);
return false;
}
// Enable BCP
rc = SQLSetConnectAttr(g_hDbc, SQL_COPT_SS_BCP, (SQLPOINTER)SQL_BCP_ON, SQL_IS_INTEGER);
if (SQL_SUCCESS != rc && SQL_SUCCESS_WITH_INFO != rc) {
printf("SQLSetConnectAttr(.. SQL_COPT_SS_BCP, (SQLPOINTER)SQL_BCP_ON ...) failed\n");
ODBCCleanUp();
return false;
}
// connecting ...
rc = SQLDriverConnect(g_hDbc,NULL, (SQLTCHAR*)szConnectionString, SQL_NTS, (SQLTCHAR*)szOutConnectionString, 500, &iLen, SQL_DRIVER_NOPROMPT);
if (SQL_SUCCESS != rc && SQL_SUCCESS_WITH_INFO != rc) {
printf("SQLDriverConnect(SQL_HANDLE_DBC...) failed\n");
ODBCCleanUp();
return false;
}
return true;
}
BOOL BCPSetBulkMode(TCHAR * pszServer, TCHAR * pszQureryOut, char BCPType, TCHAR * pszDataFile) {
SQLRETURN rc;
if (!MakeODBCConnection(pszServer))
return false;
rc = bcp_init(g_hDbc, NULL, pszDataFile, NULL, DB_OUT); // bcp init for queryout
if (SUCCEED != rc) {
printf("bcp_init failed\n");
ODBCCleanUp();
return false;
}
// setbulkmode
char ColTerm[] = "\t";
char RowTerm[] = "\r\n";
wchar_t wColTerm[] = L"\t";
wchar_t wRowTerm[] = L"\r\n";
BYTE * pColTerm = NULL;
int cbColTerm = NULL;
BYTE * pRowTerm = 0;
int cbRowTerm = 0;
int bulkmode = -1;
if (BCPType == 'c') { // bcp -c
pColTerm = (BYTE*)ColTerm;
pRowTerm = (BYTE*)RowTerm;
cbColTerm = 1;
cbRowTerm = 2;
bulkmode = BCP_OUT_CHARACTER_MODE;
}
else
if (BCPType == 'w') { // bcp -w
pColTerm = (BYTE*)wColTerm;
pRowTerm = (BYTE*)wRowTerm;
cbColTerm = 2;
cbRowTerm = 4;
bulkmode = BCP_OUT_WIDE_CHARACTER_MODE;
}
else
if (BCPType == 'n') // bcp -n
bulkmode = BCP_OUT_NATIVE_MODE;
else
if (BCPType == 'N') // bcp -n
bulkmode = BCP_OUT_NATIVE_TEXT_MODE;
else {
printf("unknown bcp mode\n");
ODBCCleanUp();
return false;
}
rc = bcp_setbulkmode(g_hDbc, bulkmode, pColTerm, cbColTerm, pRowTerm, cbRowTerm);
if (SUCCEED != rc) {
printf("bcp_setbulkmode failed\n");
ODBCCleanUp();
return false;
}
// set queryout T-SQL statement
rc = bcp_control(g_hDbc, BCPHINTS , pszQureryOut);
if (SUCCEED != rc) {
printf("bcp_control(..BCP_OPTION_HINTS..) failed\n");
ODBCCleanUp();
return false;
}
// bcp copy
DBINT nRowsInserted = 0;
rc = bcp_exec(g_hDbc, &nRowsInserted);
if (SUCCEED != rc) {
printf("bcp_exec failed\n");
ODBCCleanUp();
return false;
}
printf("bcp done\n");
ODBCCleanUp();
return true;
}
int main() {
BCPSetBulkMode(TEXT("localhost"), TEXT("SELECT 'this is a bcp -c test', 1,2") , 'c', TEXT("bcpc.dat"));
BCPSetBulkMode(TEXT("localhost"), TEXT("SELECT 'this is a bcp -w test', 1,2") , 'w', TEXT("bcpw.dat"));
BCPSetBulkMode(TEXT("localhost"), TEXT("SELECT 'this is a bcp -c test', 1,2") , 'n', TEXT("bcpn.dat"));
BCPSetBulkMode(TEXT("localhost"), TEXT("SELECT 'this is a bcp -w test', 1,2") , 'N', TEXT("bcp_N.dat"));
}