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.