bcp_setbulkmode
bcp_setbulkmode le permite especificar el formato de columna en una operación de copia masiva, que establece todos los atributos de columna en una sola llamada a 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
Comentarios
Se puede usar bcp_setbulkmode para realizar una copia masiva a partir de una consulta o de una tabla. Cuando se usa bcp_control para hacer una copia masiva a partir de una instrucción de consulta, se le debe llamar antes de llamar a bcp_setbulkmode con BCP_HINT.
bcp_setbulkmode es una alternativa a usar bcp_setcolfmt y bcp_columns, que solo le permite especificar el formato de una columna por llamada a 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 de BCP.EXE y a bcp_setcolfmt con la propiedad BCP_FMT_TYPE establecida en SQLCHARACTER. |
BCP_OUT_WIDE_CHARACTER_MODE |
Especifica el modo de salida de Unicode. Corresponde a la opción –w de BCP.EXE y a bcp_setcolfmt con la propiedad BCP_FMT_TYPE 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 de BCP.EXE y a bcp_setcolfmt con la propiedad BCP_FMT_TYPE establecida en SQLNCHAR si el tipo de columna es una cadena (el 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 de .BCP.EXE y a bcp_setcolfmt con la propiedad BCP_FMT_TYPE establecida en el valor predeterminado. |
No debe utilizar bcp_setbulkmode con una secuencia de llamadas a función que incluye bcp_setcolfmt, bcp_control y bcp_readfmt. Por ejemplo, no debe llamar a bcp_control(BCPTEXTFILE) y a bcp_setbulkmode.
Puede llamar a bcp_control y a bcp_setbulkmode para las opciones bcp_control que no están en conflicto con bcp_setbulkmode. Por ejemplo, puede llamar a bcp_control(BCPFIRST) y a bcp_setbulkmode.
Si intenta llamar a bcp_setbulkmode con una secuencia de llamadas a función que incluye bcp_setcolfmt, bcp_control y bcp_readfmt, una de las llamadas a función devolverá un error de secuencia. Si determina corregir el error, llame a bcp_init para restablecer todos los valores y volver a empezar.
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 |
---|
|
|
|
|
|
|
|
|
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"));
}