Partager via


Copie en bloc à partir de variables de programme

Vous pouvez effectuer une copie en bloc directement à partir de variables de programme. Après avoir alloué des variables destinées à contenir les données d'une ligne et avoir appelé bcp_init pour démarrer la copie en bloc, appelez bcp_bind pour chaque colonne de manière à spécifier l'emplacement et le format de la variable de programme à associer à la colonne. Remplissez chaque variable avec des données, puis appelez bcp_sendrow pour envoyer une ligne de données au serveur. Répétez le processus de remplissage des variables et d'appel à bcp_sendrow jusqu'à ce que toutes les lignes aient été envoyées au serveur, puis appelez bcp_done pour spécifier que l'opération est terminée.

Le paramètre bcp_bindpData contient l'adresse de la variable en corus de liaison à la colonne. Les données de chaque colonne peuvent être stockées de l'une des deux manières suivantes :

  • Allocation d'une variable destinée à contenir les données.

  • Allocation d'une variable indicateur suivie immédiatement de la variable de données.

La variable indicateur indique la longueur des données des colonnes de longueur variable et indique des valeurs NULL si la colonne autorise ces valeurs. Si seule une variable de données est utilisée, l'adresse de cette variable est stockée dans le paramètre bcp_bindpData. Si une variable indicateur est utilisée, l'adresse de cette variable est stockée dans le paramètre bcp_bindpData. Les fonctions de copie en bloc calculent l'emplacement de la variable de données en ajoutant les paramètres bcp_bindcbIndicator et pData.

bcp_bind prend en charge trois méthodes de traitement des données de longueur variable :

  • Utilisation de cbData avec uniquement une variable de données. Indiquez la longueur des données dans cbData. Chaque fois que la longueur des données destinées à être copiées en bloc est modifiée, appelez bcp_collen pour redéfinir cbData. Si l'une des deux autres méthodes est utilisée, spécifiez SQL_VARLEN_DATA pour cbData. Si toutes les valeurs de données fournies pour une colonne sont NULL, spécifiez SQL_NULL_DATA pour cbData.

  • Utilisation de variables indicateur. Dès qu'une nouvelle valeur de données est déplacée dans la variable de données, stockez la longueur de la valeur dans la variable indicateur. Si l'une des autres deux méthodes est utilisée, spécifiez 0 pour cbIndicator.

  • Utilisation de pointeurs de terminateur. Chargez le paramètre bcp_bindpTerm avec l'adresse du modèle binaire qui termine les données. Si l'une des deux autres méthodes est utilisée, spécifiez NULL pour pTerm.

Ces trois méthodes peuvent être utilisés sur le même appel à bcp_bind, auquel cas la spécification qui donne la plus petite quantité de données à copier est utilisée.

Le paramètre bcp_bindtype utilise les identificateurs de type de données DB-Library, pas les identificateurs de type de données ODBC. Les identificateurs de type de données DB-Library sont définis dans sqlncli.h et sont utilisés avec la fonction ODBC bcp_bind.

Les fonctions de copie en bloc ne prennent pas en charge tous les types de données ODBC C. Par exemple, les fonction de copie en bloc ne prennent pas en charge la structure ODBC SQL_C_TYPE_TIMESTAMP. Vous devez donc utiliser SQLBindCol ou SQLGetData pour convertir des données ODBC SQL_TYPE_TIMESTAMP en variable SQL_C_CHAR. Si vous utilisez ensuite bcp_bind avec un paramètre type ayant la valeur SQLCHARACTER pour lier la variable à une colonne SQL Serverdatetime, les fonctions de copie en bloc convertissent la clause d'échappement d'horodateur de la variable de type character au format datetime approprié.

Le tableau suivant répertorie les types de données recommandés à utiliser lors du mappage d'un type de données SQL ODBC à un type de données SQL Server.

Type de données ODBC SQL

Type de données ODBC C

Paramètre bcp_bind type

Type de données 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

texte

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 (signé)

SQL_C_SSHORT

SQLINT2

smallint

SQL_TINYINT (non signé)

SQL_C_UTINYINT

SQLINT1

tinyint

SQL_SMALL_INT (signé)

SQL_C_SSHORT

SQLINT2

smallint

SQL_SMALL_INT (non signé)

SQL_C_SLONG

SQLINT4

int

integer

SQL_INTEGER (signé)

SQL_C_SLONG

SQLINT4

int

integer

SQL_INTEGER (non signé)

SQL_C_CHAR

SQLCHARACTER

decimal

dec

SQL_BIGINT (signé et non signé)

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 ne comprend pas les types de données tinyint, smallint non signé ni int non signé. Pour empêcher la perte de valeurs de données lors de la migration de ces types de données, créez la table SQL Server avec le plus grand type de données integer suivant. Pour empêcher les utilisateurs d'ajouter ultérieurement des valeurs en dehors de la plage autorisée par le type de données d'origine, appliquez une règle à la colonne SQL Server de manière à limiter les valeurs autorisées à la plage prise en charge par le type de données dans la source d'origine :

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 ne prend pas en charge directement les types de données interval. Toutefois, une application peut stocker des séquences d'échappement d'intervalle sous la forme de chaînes de caractères dans une colonne SQL Server de type character. L'application peut les lire pour une utilisation ultérieure, mais elles ne peuvent pas être utilisées dans des instructions Transact-SQL.

Les fonctions de copie en bloc peuvent être utilisées pour charger rapidement dans SQL Server des données qui ont été lues à partir d'une source de données ODBC. Utilisez SQLBindCol pour lier les colonnes d'un jeu de résultats aux variables de programme, puis utilisez bcp_bind pour lier ces mêmes variables de programme à une opération de copie en bloc. L'appel à SQLFetchScroll ou SQLFetch extrait ensuite une ligne de données de la source de données ODBC dans les variables de programme, et l'appel à bcp_sendrow copie en bloc les données des variables de programme vers SQL Server.

Une application peut utiliser la fonction bcp_colptr dès qu'elle a besoin de modifier l'adresse de la variable de données spécifiée à l'origine dans le paramètre bcp_bind pData. Une application peut utiliser la fonction bcp_collen dès qu'elle a besoin de modifier la longueur des données spécifiée à l'origine dans le paramètre bcp_bind cbData.

Vous ne pouvez pas lire des données de SQL Server dans des variables de programme à l'aide de la copie en bloc. Il n'existe en effet pas de fonction similaire à « bcp_readrow ». Vous pouvez seulement envoyer des données de l'application au serveur.