Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
bcp_setbulkmode låter dig specificera kolumnformatet i en bulkkopiering, där alla kolumnattribut sätts i ett enda funktionsanrop.
Syntax
RETCODE bcp_setbulkmode (
HDBC hdbc,
INT property,
void * pField,
INT cbField,
void * pRow,
INT cbRow
);
Arguments
hdbc
ODBC-anslutningshandtaget med bulkkopiering.
egenskap
En konstant av typen BYTE. Se tabellen i avsnittet Anmärkningar för en lista över konstanterna.
pField
Pekaren till fältterminatorns värde.
cbField
Längden (i bytes) på fältterminatorns värde.
pRow
Pekaren till radterminatorvärdet.
cbRow
Längden i byte av radterminatorvärdet.
Returns
LYCKAS eller MISSLYCKAS
Remarks
bcp_setbulkmode kan användas för att bulkkopiera ut antingen en fråga eller en tabell. När bcp_setbulkmode används för att bulkkopiera ut en frågesats måste den anropas innan bcp_control anropas med BCP_HINT.
bcp_setbulkmode är ett alternativ till att använda bcp_setcolfmt och bcp_columns, som bara låter dig ange formatet för en kolumn per funktionsanrop.
Följande tabell listar konstanterna för egenskapsparametern .
| Property | Description |
|---|---|
| BCP_OUT_CHARACTER_MODE | Specificerar teckenutgångsläge. Motsvarar -c-alternativet i BCP.EXE och bcp_setcolfmt med BCP_FMT_TYPE egenskap satt till SQLCHARACTER. |
| BCP_OUT_WIDE_CHARACTER_MODE | Specificerar Unicode-utgångsläge. Motsvarar -w-alternativet i BCP.EXE och bcp_setcolfmt med BCP_FMT_TYPE egenskap satt till SQLNCHAR. |
| BCP_OUT_NATIVE_TEXT_MODE | Specificerar inbyggda typer för icke-teckentyper och Unicode för teckentyper. Motsvarar -N-alternativet i BCP.EXE och bcp_setcolfmt med BCP_FMT_TYPE egenskap satt till SQLNCHAR om kolumntypen är en sträng (standard om inte en sträng). |
| BCP_OUT_NATIVE_MODE | Specificerar inhemska databastyper. Motsvarar -n-alternativet i BCP.EXE och bcp_setcolfmt med BCP_FMT_TYPE egenskap satt till standard. |
Du bör inte använda bcp_setbulkmode med en sekvens av funktionsanrop som inkluderar bcp_setcolfmt, bcp_control och bcp_readfmt. Till exempel bör du inte ringa bcp_control(BCPTEXTFILE) och bcp_setbulkmode.
Du kan ringa bcp_control och bcp_setbulkmode för bcp_control alternativ som inte krockar med bcp_setbulkmode. Till exempel kan du ringa bcp_control(BCPFIRST) och bcp_setbulkmode.
Om du försöker anropa bcp_setbulkmode med en sekvens av funktionsanrop som inkluderar bcp_setcolfmt, bcp_control och bcp_readfmt, kommer ett av funktionsanropen att returnera ett sekvensfelfel. Om du väljer att rätta till felet, ring bcp_init för att återställa alla inställningar och börja om.
Nedan följer några exempel på funktionsanrop som resulterar i ett funktionssekvensfel:
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();
Example
Följande exempel skapar fyra filer med olika inställningar av bcp_setbulkmode.
// 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"));
}