Partager via


Données caractères et chaînes C

Les paramètres d’entrée qui font référence aux données de caractères de longueur variable (telles que les noms de colonnes, les paramètres dynamiques et les valeurs d’attribut de chaîne) ont un paramètre de longueur associé. Si l’application met fin à des chaînes avec le caractère Null, comme c’est le cas en C, elle fournit en tant qu’argument la longueur en octets de la chaîne (sans inclure le point de terminaison Null) ou SQL_NTS (chaîne terminée par null). Un argument de longueur non négatif spécifie la longueur réelle de la chaîne associée. L’argument de longueur peut être 0 pour spécifier une chaîne de longueur nulle, qui est distincte d’une valeur NULL. La valeur négative SQL_NTS dirige le pilote pour déterminer la longueur de la chaîne en localisant le caractère d’arrêt null.

Lorsque les données de caractères sont retournées du pilote à l’application, le pilote doit toujours le terminer par null. Cela donne à l’application le choix de gérer les données sous la forme d’une chaîne ou d’un tableau de caractères. Si la mémoire tampon de l’application n’est pas suffisamment grande pour renvoyer toutes les données de caractères, le pilote le tronque à la longueur d’octets de la mémoire tampon, moins le nombre d’octets requis par le caractère d’arrêt null, arrête les données tronquées et les stocke dans la mémoire tampon. Par conséquent, les applications doivent toujours allouer de l’espace supplémentaire pour le caractère de terminaison Null dans les mémoires tampons utilisées pour récupérer des données de caractères. Par exemple, une mémoire tampon de 51 octets est nécessaire pour récupérer 50 caractères de données.

Une attention particulière doit être effectuée par l’application et le pilote lors de l’envoi ou de la récupération de données de caractères longs dans des parties avec SQLPutData ou SQLGetData. Si les données sont passées sous la forme d’une série de chaînes terminées par null, les caractères d’arrêt null sur ces chaînes doivent être supprimés avant que les données puissent être réassemblées.

Un certain nombre de programmeurs ODBC ont confondu les données de caractères et les chaînes C. Cela s’est produit comme un artefact d’utilisation du langage C lors de la définition des fonctions ODBC. Si un pilote ou une application ODBC utilise un autre langage - n’oubliez pas que ODBC est indépendant du langage - cette confusion est moins susceptible de survenir.

Lorsque les chaînes C sont utilisées pour contenir des données de caractères, le caractère de terminaison Null n’est pas considéré comme faisant partie des données et n’est pas compté dans le cadre de sa longueur d’octet. Par exemple, les données de caractère « ABC » peuvent être conservées sous la forme de la chaîne C « ABC\0 » ou du tableau de caractères {'A', 'B', 'C'}. La longueur d’octets des données est 3, qu’elles soient traitées comme une chaîne ou un tableau de caractères.

Bien que les applications et les pilotes utilisent généralement des chaînes C (tableaux de caractères se terminant par null) pour contenir des données de caractères, il n’est pas nécessaire de le faire. En C, les données de caractères peuvent également être traitées comme un tableau de caractères (sans terminaison null) et sa longueur d’octet passée séparément dans la mémoire tampon longueur/indicateur.

Étant donné que les données de caractères peuvent être conservées dans un tableau non null et sa longueur d’octet passée séparément, il est possible d’incorporer des caractères Null dans des données de caractères. Toutefois, le comportement des fonctions ODBC dans ce cas n’est pas défini et il est spécifique au pilote si un pilote gère cela correctement. Par conséquent, les applications interopérables doivent toujours gérer les données de caractères qui peuvent contenir des caractères null incorporés en tant que données binaires.