SQLite3: Insertion d'objets BLOB avec des caractères NULL en C++
Je suis en train de travailler sur le développement d'une API C++ qui utilise la conception personnalisée de plugins
à l'interface avec les différents moteurs de base de données à l'aide de leurs Api et SQL spécifique
la syntaxe.
Actuellement, j'essaie de trouver un moyen de l'insertion d'objets Blob, mais depuis NULL
est
le caractère de terminaison en C/C++, la GOUTTE devient tronquée lors de la construction de
le INSÉRER DANS chaîne de requête. Jusqu'à présent, j'ai travaillé avec
//...
char* sql;
void* blob;
int len;
//...
blob = some_blob_already_in_memory;
len = length_of_blob_already_known;
sql = sqlite3_malloc(2*len+1);
sql = sqlite3_mprintf("INSERT INTO table VALUES (%Q)", (char*)blob);
//...
Je pense que, si c'est possible de le faire dans le SQLite3 console interactive, il devrait être possible de construire la chaîne de requête avec des échappées NULL
caractères. Peut-être il y a un moyen de le faire avec le standard SQL qui est également pris en charge par SQLite syntaxe SQL?
Sûrement quelqu'un doit avoir été confrontés à la même situation qu'avant. J'ai googlé et trouvé quelques réponses, mais dans d'autres langages de programmation (Python).
Merci d'avance pour vos commentaires.
OriginalL'auteur jbatista | 2009-01-01
Vous devez vous connecter pour publier un commentaire.
Vous aurez envie d'utiliser cette fonction avec une déclaration préparée.
En C/C++, le niveau moyen de traiter avec les valeurs Null dans les chaînes est de stocker le début de la chaîne et d'une longueur, ou de stocker un pointeur vers le début d'une chaîne de caractères et un à la fin de la chaîne.
OriginalL'auteur Eclipse
Merci encore à tous pour vos commentaires. Cette fois, je suis comment j'ai résolu le problème avec l'aide des indications fournies ici. J'espère que cela aidera d'autres à l'avenir.
Comme suggéré par les trois premières affiches, j'ai utilisé des déclarations préparées à l'avance — en outre, parce que j'étais aussi intéressé à obtenir des colonnes de types de données, et un simple
sqlite3_get_table()
ne le ferais pas.Après la préparation de l'instruction SQL dans la forme de chaîne constante:
il reste le liaison de la valeur correspondante. Ceci est fait par l'émission d'autant d'
sqlite3_bind_blob()
appels que les colonnes. (J'ai également eu recours à lasqlite3_bind_text()
pour les autres "simple" types de données " parce que l'API je suis en train de travailler sur peut traduire des entiers/double/etc ... dans une chaîne de caractères). Donc:Note également que certaines fonctions (
sqlite3_open_v2()
,sqlite3_prepare_v2()
) apparaissent sur le tard SQLite versions (je suppose 3.5.x et versions ultérieures).Merci, fixe. (BTW, vous auriez été les bienvenus à l'amélioration de vous-même).
Je ne savais pas que je peux le modifier d'autres posts 🙂 Merci, bon à savoir.
OriginalL'auteur jbatista
Vous voulez précompiler la déclaration
sqlite_prepare_v2()
, puis lier le blob à l'aide desqlite3_bind_blob()
. Notez que la déclaration que vous lier en sera INSERT INTO table VALUES (?).Oui, vous aurez besoin de faire correspondre le champ count si vous faites de cette façon.
OriginalL'auteur Louis Gerbarg