Compartilhar via


Cópia em massa de variáveis do programa

Você pode fazer cópias em massa diretamente de variáveis de programa. Depois de alocar variáveis para manter os dados de uma linha e chamar bcp_init para começar a cópia em massa, chame bcp_bind para cada coluna, a fim de especificar o local e o formato da variável de programa a ser associada à coluna. Encha cada variável de dados e chame bcp_sendrow para enviar uma linha de dados ao servidor. Repita o processo de encher as variáveis e chamar bcp_sendrow até que todas as linhas tenham sido enviadas para o servidor. Em seguida, chame bcp_done para especificar que a operação foi concluída.

O parâmetro bcp_bindpData contém o endereço da variável associada à coluna. Os dados de cada coluna podem ser armazenados de uma destas duas formas:

  • Aloque uma variável para manter os dados.

  • Aloque uma variável de indicador seguida imediatamente pela variável de dados.

A variável de indicador indica o comprimento dos dados para colunas de comprimento variável e também indica valores NULL se a coluna permitir NULLs. Se somente uma variável de dados for usada, então o endereço desta variável será armazenado no parâmetro bcp_bindpData. Se uma variável de indicador for usada, então o endereço da variável do indicador será armazenado no parâmetro bcp_bindpData. As funções de cópia em massa calculam o local da variável de dados adicionando os parâmetros bcp_bindcbIndicator e pData.

bcp_bind dá suporte a três métodos para lidar com dados de comprimento de variável:

  • Use cbData somente com uma variável de dados. Coloque o comprimento dos dados em cbData. Sempre que o comprimento dos dados que serão copiados em massa for alterado, chame de bcp_collen para redefinir cbData. Se um dos outros dois métodos estiver sendo usado, especifique SQL_VARLEN_DATA para cbData. Se todos os valores de dados que são fornecidos para uma coluna forem o NULL, especifique SQL_NULL_DATA para cbData.

  • Use variáveis de indicador. Como cada valor de dados novo é movido na variável de dados, armazene o comprimento do valor na variável de indicador. Se um dos outros dois métodos estiver sendo usado, especifique 0 para cbIndicator.

  • Use ponteiros de terminador. Carregue o parâmetro bcp_bindpTerm com o endereço do padrão de bits que finaliza os dados. Se um dos outros dois métodos estiver sendo usado, especifique NULL para pTerm.

Os três métodos podem ser usados na mesma chamada do bcp_bind, caso em que a especificação que resulte na menor quantidade de cópia de dados é usada.

O parâmetro de tipobcp_bind usa identificadores de tipo de dados DB-Library, e não identificadores de tipo de dados ODBC. Os identificadores de tipo de dados DB-Library são definidos em sqlncli.h para uso com a função ODBC bcp_bind.

As funções de cópia em massa não têm suporte para todos os tipos de dados do ODBC C. Por exemplo, as funções de cópia em massa não dão suporte à estrutura ODBC SQL_C_TYPE_TIMESTAMP, portanto use SQLBindCol ou SQLGetData para converter dados do ODBC SQL_TYPE_TIMESTAMP a uma variável SQL_C_CHAR. Se então você usar bcp_bind com um tipo de parâmetro SQLCHARACTER para associar a variável a uma coluna SQL Serverdatetime, as funções de cópia em massa converterão a cláusula de escape do carimbo de data e hora na variável do caractere para o formato de data e hora adequado.

A tabela seguinte lista os tipos de dados indicados para usar mapeando de um tipo de dados do ODBC SQL para um tipo de dados do SQL Server.

Tipo de dados do ODBC SQLz

Tipos de dados do ODBC C

tipo de parâmetro bcp_bind

Tipo de dados do SQL Server

SQL_CHAR

SQL_C_CHAR

SQLCHARACTER

character

char

SQL_VARCHAR

SQL_C_CHAR

SQLCHARACTER

varchar

character varying

char varying

sysname

SQL_LONGVARCHAR

SQL_C_CHAR

SQLCHARACTER

text

SQL_WCHAR

SQL_C_WCHAR

SQLNCHAR

nchar

SQL_WVARCHAR

SQL_C_WCHAR

SQLNVARCHAR

nvarchar

SQL_WLONGVARCHAR

SQL_C_WCHAR

SQLNTEXT

ntext

SQL_DECIMAL

SQL_C_CHAR

SQLCHARACTER

decimal

dec

money

smallmoney

SQL_NUMERIC

SQL_C_NUMERIC

SQLNUMERICN

numeric

SQL_BIT

SQL_C_BIT

SQLBIT

bit

SQL_TINYINT (assinado)

SQL_C_SSHORT

SQLINT2

smallint

SQL_TINYINT (sem assinatura)

SQL_C_UTINYINT

SQLINT1

tinyint

SQL_SMALL_INT (assinado)

SQL_C_SSHORT

SQLINT2

smallint

SQL_SMALL_INT (sem assinatura)

SQL_C_SLONG

SQLINT4

int

inteiro

SQL_INTEGER (assinado)

SQL_C_SLONG

SQLINT4

int

inteiro

SQL_INTEGER (não assinado)

SQL_C_CHAR

SQLCHARACTER

decimal

dec

SQL_BIGINT (assinado e sem assinatura)

SQL_C_CHAR

SQLCHARACTER

bigint

SQL_REAL

SQL_C_FLOAT

SQLFLT4

real

SQL_FLOAT

SQL_C_DOUBLE

SQLFLT8

float

SQL_DOUBLE

SQL_C_DOUBLE

SQLFLT8

float

SQL_BINARY

SQL_C_BINARY

SQLBINARY

binary

timestamp

SQL_VARBINARY

SQL_C_BINARY

SQLBINARY

varbinary

binary varying

SQL_LONGVARBINARY

SQL_C_BINARY

SQLBINARY

image

SQL_TYPE_DATE

SQL_C_CHAR

SQLCHARACTER

datetime

smalldatetime

SQL_TYPE_TIME

SQL_C_CHAR

SQLCHARACTER

datetime

smalldatetime

SQL_TYPE_TIMESTAMP

SQL_C_CHAR

SQLCHARACTER

datetime

smalldatetime

SQL_GUID

SQL_C_GUID

SQLUNIQUEID

uniqueidentifier

SQL_INTERVAL_

SQL_C_CHAR

SQLCHARACTER

char

SQL Server não tem assinado tinyint, smallint sem assinatura ou tipos de dados de int sem assinatura. Para impedir a perda de valores de dados ao migrar estes tipos de dados, crie a tabela SQL Server com o próximo tipo de dados de inteiro maior. Para impedir que os usuários adicionem posteriormente valores fora da faixa permitida pelo tipo de dados original, aplique uma regra à coluna SQL Server a fim de restringir os valores permitidos para a faixa com suporte do tipo de dados na fonte original:

CREATE TABLE Sample_Ints(STinyIntCol   SMALLINT,
USmallIntCol INT)
GO
CREATE RULE STinyInt_Rule
AS 
@range >= -128 AND @range <= 127
GO
CREATE RULE USmallInt_Rule
AS 
@range >= 0 AND @range <= 65535
GO
sp_bindrule STinyInt_Rule, 'Sample_Ints.STinyIntCol'
GO
sp_bindrule USmallInt_Rule, 'Sample_Ints.USmallIntCol'
GO

O SQL Server não dá suporte a tipos de dados de intervalo diretamente. Porém, um aplicativo pode armazenar seqüências de escape de intervalo como cadeias de caracteres em uma coluna de caractere do SQL Server. O aplicativo pode lê-los para uso posterior, mas eles não podem ser usados em instruções do Transact-SQL.

As funções de cópia em massa podem ser usadas para carregar dados que tenham sido lidos de uma fonte de dados ODBC rapidamente no SQL Server. Use SQLBindCol para associar as colunas de um conjunto de resultados a variáveis do programa e, em seguida, use bcp_bind para associar as mesmas variáveis do programa a uma operação de cópia em massa. A chamada para SQLFetchScroll ou SQLFetch busca uma linha de dados da fonte de dados ODBC nas variáveis do programa e a chamada para bcp_sendrow executa cópias em massa das variáveis do programa para SQL Server.

Um aplicativo pode usar a função bcp_colptr sempre que precisar alterar o endereço da variável de dados especificado no parâmetro bcp_bindpData. Um aplicativo pode usar a função bcp_collen sempre que precisa alterar o comprimento de dados especificado originalmente no parâmetro bcp_bindcbData.

Você não pode ler dados de SQL Server em variáveis de programa que usam cópia em massa; não há nada como uma função "bcp_readrow". Você só pode enviar dados do aplicativo para o servidor.