Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este exemplo mostra como usar funções de cópia em massa para copiar em massa o conjunto de resultados de uma instrução SELECT. Este exemplo foi desenvolvido para o ODBC versão 3.0 ou posterior.
Importante
Quando possível, use a Autenticação do Windows. Se a Autenticação do Windows não estiver disponível, solicite que os usuários insiram suas credenciais em tempo de execução. Evite armazenar credenciais em um arquivo. Se você precisar persistir as credenciais, deverá criptografá-las com a API de criptografia Win32.
Para copiar em massa o conjunto de resultados de uma instrução SELECT
Aloque um identificador de ambiente e um identificador de conexão.
Defina SQL_COPT_SS_BCP e SQL_BCP_ON para habilitar operações de cópia em massa.
Conecte-se ao SQL Server.
Chame bcp_init para definir as seguintes informações:
Especifique NULL para o parâmetro szTable .
O nome do arquivo de dados que recebe dados do conjunto de resultados.
O nome de um arquivo de dados para receber mensagens de erro de cópia em massa (especifique NULL se você não quiser um arquivo de mensagem).
A direção da cópia: DB_OUT.
Chame bcp_control, defina eOption como BCPHINTS e coloque em iValue um ponteiro para uma matriz SQLTCHAR que contém a instrução SELECT.
Chame bcp_exec para executar a operação de cópia em massa.
Ao usar essas etapas, o arquivo é criado em formato nativo. Você pode converter os valores de dados em outros tipos de dados usando bcp_colfmt. Para obter mais informações, consulte Criar um arquivo de formato de cópia em massa (ODBC).
Exemplo
Você precisará de uma fonte de dados ODBC chamada AdventureWorks, cujo banco de dados padrão é o banco de dados de exemplo adventureworks. (Você pode baixar o banco de dados de exemplo adventureworks na home page de Exemplos do Microsoft SQL Server e Projetos da Comunidade .) Essa fonte de dados deve ser baseada no driver ODBC fornecido pelo sistema operacional (o nome do driver é "SQL Server"). Se você criar e executar este exemplo como um aplicativo de 32 bits em um sistema operacional de 64 bits, deverá criar a fonte de dados ODBC com o Administrador ODBC no %windir%\SysWOW64\odbcad32.exe.
Este exemplo se conecta à instância padrão do SQL Server do computador. Para se conectar a uma instância nomeada, altere a definição da fonte de dados ODBC para especificar a instância usando o seguinte formato: servidor\namedinstance. Por padrão, o SQL Server Express é instalado em uma instância nomeada.
Compile com odbc32.lib e odbcbcp.lib.
// compile with: odbc32.lib odbcbcp.lib
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <odbcss.h>
#define MAXBUFLEN 256
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;
// Bulk copy variables.
SDWORD cRows;
SQLTCHAR szBCPQuery[] = "SELECT BirthDate FROM HumanResources.Employee";
// 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 bulk copy mode, and then 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 use Integrated Security, create SQL Server DSN using Windows NT authentication.
retcode = SQLConnect(hdbc1, (UCHAR*)"AdventureWorks", 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, NULL, "BCPODBC.bcp", "BCPERROR.out", DB_OUT);
// The test is for the bulk copy return of SUCCEED, not the ODBC return of SQL_SUCCESS.
if ( (retcode != SUCCEED) ) {
printf("bcp_init(hdbc1) Failed\n\n");
Cleanup();
return(9);
}
// Specify the query to use.
retcode = bcp_control(hdbc1, BCPHINTS, (void *)szBCPQuery);
if ( (retcode != SUCCEED) ) {
printf("bcp_control(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 out = %d.\n", cRows);
// Cleanup
SQLDisconnect(hdbc1);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
}
Consulte Também
Cópia em massa com os Tópicos de Instruções do Driver ODBC do SQL Server (ODBC)