bcp_setbulkmode
bcp_setbulkmode permite especificar el formato de columna en una operación de copia masiva, estableciendo todos los atributos de columna en una sola llamada de función.
Sintaxis
RETCODE bcp_setbulkmode (
HDBC
hdbc
,
INT
property
,
void *
pField
,
INT
cbField
,
void *
pRow
,
INT
cbRow
);
Argumentos
hdbc
Identificador de la conexión ODBC habilitado para la copia masiva.
property
Constante de tipo BYTE. Vea la tabla en la sección Comentarios para obtener una lista de las constantes.
pField
Puntero al valor de terminador de campo.
cbField
Longitud (en bytes) del valor de terminador de campo.
pRow
Puntero al valor de terminador de fila.
cbRow
Longitud en bytes del valor de terminador de fila.
Devuelve
SUCCEED o FAIL
Observaciones
bcp_setbulkmode se puede usar para copiar de forma masiva una consulta o una tabla. Cuando se usa bcp_setbulkmode para copiar de forma masiva una instrucción de consulta, se debe llamar a antes de llamar a bcp_control con BCP_HINT.
bcp_setbulkmode es una alternativa al uso de bcp_setcolfmt y bcp_columns, que solo le permiten especificar el formato de una columna por cada llamada de función.
En la lista siguiente se enumeran las constantes del parámetro property .
Propiedad | Descripción |
---|---|
BCP_OUT_CHARACTER_MODE | Especifica el modo de salida de caracteres. Corresponde a la opción -c en BCP.EXE y a bcp_setcolfmt con BCP_FMT_TYPE la propiedad establecida en SQLCHARACTER . |
BCP_OUT_WIDE_CHARACTER_MODE | Especifica el modo de salida de Unicode. Corresponde a la opción -w en BCP.EXE y bcp_setcolfmt con BCP_FMT_TYPE la propiedad establecida en SQLNCHAR . |
BCP_OUT_NATIVE_TEXT_MODE | Especifica los tipos nativos para los tipos no de caracteres y Unicode para los tipos de caracteres. Corresponde a la opción -N en BCP.EXE y bcp_setcolfmt con BCP_FMT_TYPE la propiedad establecida SQLNCHAR en si el tipo de columna es una cadena (valor predeterminado si no es una cadena). |
BCP_OUT_NATIVE_MODE | Especifica los tipos de base de datos nativos. Corresponde a la opción -n en BCP.EXE y bcp_setcolfmt con BCP_FMT_TYPE la propiedad establecida en el valor predeterminado. |
No debe usar bcp_setbulkmode con una secuencia de llamadas de función que incluya bcp_setcolfmt, bcp_control y bcp_readfmt. Por ejemplo, no debe llamar a bcp_control(BCPTEXTFILE) y bcp_setbulkmode.
Puede llamar a bcp_control y bcp_setbulkmode para bcp_control opciones que no entran en conflicto con bcp_setbulkmode. Por ejemplo, puede llamar a bcp_control(BCPFIRST) y bcp_setbulkmode.
Si intenta llamar a bcp_setbulkmode con una secuencia de llamadas de función que incluye bcp_setcolfmt, bcp_control y bcp_readfmt, una de las llamadas de función devolverá un error de secuencia. Si decide corregir el error, llame a bcp_init para restablecer toda la configuración y empezar de nuevo.
En la siguiente tabla se presentan algunos ejemplos de llamadas a función que producen un error de secuencia de función:
Secuencia de llamadas
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();
Ejemplo
En el siguiente ejemplo se crean cuatro archivos con valores distintos de 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 TSQL 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"));
}