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.