Condividi tramite


Copia bulk da variabili di programma

È possibile eseguire una copia bulk direttamente dalle variabili di programma. Dopo avere allocato le variabili in modo da contenere i dati di una riga e avere chiamato bcp_init per avviare la copia bulk, chiamare bcp_bind per ogni colonna per specificare il percorso e il formato della variabile di programma da associare alla colonna. Completare ogni variabile con i dati, quindi chiamare bcp_sendrow per inviare una riga di dati al server. Ripetere il processo di inserimento dei dati nelle variabili chiamando bcp_sendrow finché non vengono inviate al server tutte le righe, quindi chiamare bcp_done per specificare il completamento dell'operazione.

Il parametro pData di bcp_bind contiene l'indirizzo della variabile da associare alla colonna. I dati di ogni colonna possono essere archiviati in due modi:

  • Allocando una variabile in modo da contenere i dati.

  • Allocando una variabile indicatore seguita immediatamente dalla variabile dati.

La variabile indicatore indica la lunghezza dei dati per le colonne a lunghezza variabile e indica inoltre i valori NULL se la colonna ammette valori NULL. Se viene utilizzata solo una variabile dati, l'indirizzo di questa variabile verrà archiviato nel parametro pData di bcp_bind. Se viene utilizzata una variabile indicatore, l'indirizzo della variabile indicatore verrà archiviato nel parametro pData di bcp_bind. Le funzioni di copia bulk calcolano il percorso della variabile dati aggiungendo i parametri cbIndicator e pData di bcp_bind.

bcp_bind supporta tre metodi per la gestione dei dati a lunghezza variabile:

  • Utilizzare cbData solo con una variabile dati. Inserire la lunghezza dei dati in cbData. Ogni volta che viene modificata la lunghezza dei dati di cui eseguire la copia bulk, chiamare bcp_collenper reimpostare cbData. Se viene utilizzato uno degli altri due metodi, specificare SQL_VARLEN_DATA per cbData. Se tutti i valori dei dati forniti per una colonna sono NULL, specificare SQL_NULL_DATA per cbData.

  • Utilizzare variabili indicatore. Non appena un nuovo valore dei dati viene spostato nella variabile dati, archiviare la lunghezza del valore nella variabile indicatore. Se viene utilizzato uno degli altri due metodi, specificare 0 per cbIndicator.

  • Utilizzare i puntatori ai caratteri di terminazione. Caricare il parametro pTerm di bcp_bind con l'indirizzo dello schema di bit che termina i dati. Se viene utilizzato uno degli altri due metodi, specificare NULL per pTerm.

È possibile utilizzare tutti e tre i metodi nella stessa chiamata bcp_bind. In tal caso viene utilizzata la specifica che comporta la copia del minor numero di dati.

Il parametro type di bcp_bind utilizza gli identificatori dei tipi di dati DB-Library, non gli identificatori dei tipi di dati ODBC. Gli identificatori dei tipi di dati DB-Library vengono definiti in sqlncli.h per l'utilizzo con la funzione ODBC bcp_bind.

Le funzioni di copia bulk non supportano tutti i tipi di dati C ODBC. Ad esempio, le funzioni di copia bulk non supportano la struttura ODBC SQL_C_TYPE_TIMESTAMP. Utilizzare quindi SQLBindCol o SQLGetData per convertire i dati ODBC SQL_TYPE_TIMESTAMP in una variabile SQL_C_CHAR. Se si utilizza quindi bcp_bind con un parametro type di SQLCHARACTER per associare la variabile a una colonna di tipo datetime di SQL Server, le funzioni di copia bulk convertono la clausola di escape del timestamp nella variabile carattere nel formato datetime appropriato.

Nella tabella seguente vengono elencati i tipi di dati consigliati da utilizzare nel mapping da un tipo di dati SQL ODBC a un tipo di dati SQL Server.

Tipo di dati SQL ODBC

Tipo di dati C ODBC

Parametro type di bcp_bind

Tipo di dati 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 (con segno)

SQL_C_SSHORT

SQLINT2

smallint

SQL_TINYINT (senza segno)

SQL_C_UTINYINT

SQLINT1

tinyint

SQL_SMALL_INT (con segno)

SQL_C_SSHORT

SQLINT2

smallint

SQL_SMALL_INT (senza segno)

SQL_C_SLONG

SQLINT4

int

integer

SQL_INTEGER (con segno)

SQL_C_SLONG

SQLINT4

int

integer

SQL_INTEGER (senza segno)

SQL_C_CHAR

SQLCHARACTER

decimal

dec

SQL_BIGINT (con segno e senza segno)

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 non dispone dei tipi di dati tinyint con segno, smallint senza segno o int senza segno. Per evitare la perdita di valori dei dati quando si esegue la migrazione di questi tipi di dati, creare la tabella SQL Server con il tipo di dati integer successivo più grande. Per impedire agli utenti di aggiungere in un secondo momento valori non compresi nell'intervallo consentito dal tipo di dati originale, applicare una regola alla colonna SQL Server per limitare i valori consentiti all'intervallo supportato dal tipo di dati originale:

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

SQL Server non supporta direttamente i tipi di dati intervallo. Tuttavia, un'applicazione può archiviare le sequenze di escape dell'intervallo come stringhe di caratteri in una colonna SQL Server di tipo carattere. Tali valori potranno essere letti dall'applicazione per un utilizzo futuro ma non potranno essere utilizzati nelle istruzioni Transact-SQL.

Le funzioni di copia bulk possono essere utilizzate per caricare rapidamente i dati in SQL Server letti da un'origine dati ODBC. Utilizzare SQLBindCol per associare le colonne di un set di risultati alle variabili di programma, quindi utilizzare bcp_bind per associare le stesse variabili di programma a un'operazione di copia bulk. Chiamare SQLFetchScroll o SQLFetch per recuperare una riga di dati dall'origine dati ODBC nelle variabili di programma e chiamare bcp_sendrow per eseguire la copia bulk dei dati dalle variabili di programma in SQL Server.

Un'applicazione può utilizzare la funzione bcp_colptr ogni volta che è necessario modificare l'indirizzo della variabile dati specificato originariamente nel parametropData di bcp_bind. Un'applicazione può utilizzare la funzione bcp_collen ogni volta che è necessario modificare la lunghezza dei dati specificata originariamente nel parametrocbData di bcp_bind.

Non è possibile leggere i dati da SQL Server nelle variabili di programma utilizzando la copia bulk. Non esiste una funzione simile a "bcp_readrow". È possibile solo inviare i dati dall'applicazione al server.