bcp_init
Inicializa a operação de cópia em massa.
Sintaxe
RETCODE bcp_init (
HDBC
hdbc
,
LPCTSTR
szTable
,
LPCTSTR
szDataFile
,
LPCTSTR
szErrorFile
,
INT
eDirection
);
Argumentos
hdbc
É o identificador de conexão ODBC habilitado para cópia em massa.
szTable
É o nome da tabela do banco de dados a ser copiada de ou para. Este nome também pode incluir o nome do banco de dados ou o nome do proprietário. Por exemplo, pubs.gracie.titles, pubs.. titles, gracie.titles, and titles are all legal table names.
Se eDirection for DB_OUT, szTable também poderá ser o nome de uma exibição de banco de dados.
Se eDirection for DB_OUT e uma instrução SELECT for especificada usando bcp_control antes que bcp_exec seja chamado, bcp_initszTable deverá ser definido como NULL.
szDataFile
É o nome do arquivo de usuário a ser copiado de ou para. Se os dados estiverem sendo copiados diretamente de variáveis usando bcp_sendrow, defina szDataFile como NULL.
szErrorFile
É o nome do arquivo de erro a ser preenchido com mensagens de progresso, mensagens de erro e cópias das linhas que, por algum motivo, não puderam ser copiadas de um arquivo de usuário para uma tabela. Se NULL for passado como szErrorFile, nenhum arquivo de erro será usado.
eDirection
É a direção da cópia, DB_IN ou DB_OUT. DB_IN indica uma cópia de variáveis do programa ou de um arquivo de usuário para uma tabela. DB_OUT indica uma cópia de uma tabela do banco de dados para um arquivo de usuário. Especifique um nome de arquivo de usuário com DB_OUT.
Retornos
SUCCEED ou FAIL.
Comentários
Chame bcp_init antes de chamar qualquer outra função de cópia em massa. bcp_init executa as inicializações necessárias para uma cópia em massa de dados entre a estação de trabalho e a SQL Server.
A função bcp_init deve ser fornecida com um identificador de conexão ODBC habilitado para uso com funções de cópia em massa. Para habilitar o identificador, use SQLSetConnectAttr com SQL_COPT_SS_BCP definido como SQL_BCP_ON em um identificador de conexão alocado, mas não conectado. A tentativa de atribuir o atributo em um identificador conectado resulta em erro.
Quando um arquivo de dados é especificado, bcp_init examina a estrutura da tabela de origem ou destino do banco de dados, não o arquivo de dados. bcp_init especifica valores de formato de dados para o arquivo de dados com base em cada coluna na tabela de banco de dados, exibição ou conjunto de resultados SELECT. Essa especificação inclui o tipo de dados de cada coluna, a presença ou ausência de um indicador de comprimento ou nulo e cadeias de caracteres de bytes de terminador nos dados, além da largura de tipos de dados de comprimento fixo. bcp_init define esses valores da seguinte maneira:
O tipo de dados especificado é o tipo de dados da coluna na tabela, exibição ou conjunto de resultados de SELECT do banco de dados. O tipo de dados é enumerado por SQL Server tipos de dados nativos especificados em sqlncli.h. Os dados são representados em seu próprio formato de computador. Ou seja, os dados de uma coluna de tipo de dados inteiro são representados por uma sequência de quatro bytes que é big-or little-endian com base no computador que criou o arquivo de dados.
Se um tipo de dados de banco de dados tiver comprimento fixo, os dados do arquivo de dados também terão comprimento fixo. As funções de cópia em massa que processam dados (por exemplo, bcp_exec) analisam linhas de dados esperando que o comprimento dos dados no arquivo de dados seja idêntico ao comprimento dos dados especificados na tabela de banco de dados, exibição ou lista de colunas SELECT. Por exemplo, os dados de uma coluna de banco de dados definida como char(13) devem ser representados por 13 caracteres para cada linha de dados no arquivo. Os dados de comprimento fixo podem ser prefixados com um indicador nulo se a coluna do banco de dados permitir valores nulos.
Quando a sequência de bytes de terminador é definida, o comprimento da sequência de bytes de terminador é definido como 0.
Ao copiar para SQL Server, o arquivo de dados deve ter dados para cada coluna na tabela de banco de dados. Ao copiar de SQL Server, os dados de todas as colunas na tabela de banco de dados, exibição ou conjunto de resultados SELECT são copiados para o arquivo de dados.
Ao copiar para SQL Server, a posição ordinal de uma coluna no arquivo de dados deve ser idêntica à posição ordinal da coluna na tabela de banco de dados. Ao copiar de SQL Server, bcp_exec coloca dados com base na posição ordinal da coluna na tabela de banco de dados.
Se um tipo de dados de banco de dados for variável de comprimento (por exemplo, varbinary(22)) ou se uma coluna de banco de dados puder conter valores nulos, os dados no arquivo de dados serão prefixados por um indicador de comprimento/nulo. A largura do indicador varia dependendo do tipo de dados e da versão da cópia em massa.
Para alterar os valores de formato de dados especificados para um arquivo de dados, chame bcp_columns e bcp_colfmt.
Cópias em massa para SQL Server podem ser otimizadas para tabelas que não contêm índices definindo o modelo de recuperação de banco de dados como SIMPLE ou BULK_LOGGED. Para obter mais informações, consulte Pré-requisitos para registro em log mínimo em importação em massa e ALTER DATABASE.
Se nenhum arquivo de dados for usado, você deverá chamar bcp_bind para especificar o formato e o local na memória dos dados fsor de cada coluna e, em seguida, copiar linhas de dados para o SQL Server usando bcp_sendrow.
Exemplo
Este exemplo mostra como usar a função ODBC bcp_init com um arquivo de formato.
Antes de compilar e executar o código C++, você precisa fazer o seguinte:
Crie uma fonte de dados ODBC chamada Teste. Você pode associar essa fonte de dados a qualquer banco de dados.
Execute o seguinte Transact-SQL no banco de dados:
CREATE TABLE BCPDate (cola int, colb datetime);
No diretório onde você executará o aplicativo, adicione um arquivo chamado Bcpfmt.fmt e adicione isto ao arquivo:
8.0 2 1SQLCHAR04"\t"1colaSQL_Latin1_General_Cp437_Bin 2SQLCHAR08"\r\n"2colbSQL_Latin1_General_Cp437_Bin
No diretório onde você executará o aplicativo, adicione um arquivo chamado Bcpodbc.bcp e adicione isto ao arquivo:
1 2
Agora você está pronto para compilar e executar o código 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);
}