2009-12-11 7 views
0

J'ai un problème étrange ou peut-être pas si étrange avec mon sqlite db. J'ai un champ de type "Texte" et cela a fonctionné comme un charme avec tous les textes anglais depuis des lustres.La mise à jour SQLITE échoue avec le code d'erreur 1 (SQLITE_ERROR)

Le texte dans le champ utilisé pour provenir d'un Mdit CEdit. Maintenant, je suis passé à CRichEditCtrl pour prendre en charge le formatage et les textes UNICODE. Le CRichEditCtrl dumps le texte formaté sous forme hexadécimal comme: {\ rtf1 \ ansi \ ansicpg1252 \ deff0 \ deflang1033 {\ fonttbl {\ f0 \ fnil \ fcharset0 MS Shell Dlg 2;}} ect.

Une fois againt le sqlite l'enregistre la plupart du temps très bien. Mais quelque temps il ne donne pas un code d'erreur SQLITE_ERROR/* Erreur SQL ou base de données manquante * /. le message n'est pas trop utile. le db existe et économise la plupart du temps ???? Allez comprendre. Voici le code:

error = sqlite3_exec(db,cmd,0,0,0); 
if (error != SQLITE_OK){ 
    errMsg.Format("Unable to save notes to: %s\nSQLite Error: %d",filename,error); 
    AfxMessageBox(_T(errMsg)); 
    sqlite3_close(db); 
    return false; 
    } 

Rien d'ordinaire je pense.

S'il vous plaît laissez-moi savoir si vous avez des idées. Peut-il être dû à beaucoup de backslashes dans le format RTF qui confond en quelque sorte sqlite ?? Oh, ce n'est pas lié à la taille du texte enregistré. merci beaucoup. Val

Répondre

1

Si une barre oblique inversée fonctionne, plusieurs devraient l'être. Mais il se peut que vous n'échappiez pas au texte correctement, si le texte contient une apostrophe ou une double citation, ce qui casserait la requête.

Si vous n'avez pas échappé aux guillemets, cela pourrait être le problème. Dites que vous n'échapper à des citations d'abord, comme

{blabla\'somethingelse} 

puis cette chaîne se réfugiera à nouveau pour préserver les antislashs (sinon ils seraient perdus dans la communication avec la base de données), qui produirait

{blabla\\'somethingelse} 

et puis voila, vous avez une apostrophe en vrac ...

La solution serait d'échapper d'abord les backslashes, puis les apostrophes et les citations.

+0

Hey Tor, je soupçonnais aussi les backslashes. Donc, vous êtes sûr que si mon texte contient quelque chose, le sqlite peut essayer de l'interpréter au lieu de le traiter comme un TEXTE dans mon champ UPDATE 'value ...'? – val

+0

Vous pouvez imprimer le cmd var dans un journal afin que vous puissiez voir exactement à quoi il ressemble quand il est envoyé. –

2

Le problème semble être dû à l'absence de caractères spéciaux dans votre code. Je vous recommande d'utiliser l'API sqlite pour les instructions préparées afin de vous épargner de nombreux problèmes de traitement de chaîne. Ils vont insérer des valeurs dans les requêtes pour vous et gérer l'échappement automatique.

Au lieu de cela:

error = sqlite3_exec(db,cmd,0,0,0); 

Vous devez faire ceci:

sqlite3_stmt *stmt; 
error = sqlite3_prepare_v2(database, "INSERT INTO table (field) VALUES (?)", -1, &stmt, NULL); 
if (error != SQLITE_OK) { ... 
error = sqlite3_bind_text(stmt, 1, rtfString, -1, SQLITE_STATIC); 
if (error != SQLITE_OK) { ... 
error = sqlite3_step(stmt); 
if (error != SQLITE_DONE) { ... 
sqlite3_finalize(stmt); 

sqlite prendra automatiquement la valeur de rtfString, je cite correctement, puis l'insérer dans la requête en place de le point d'interrogation.

Un autre avantage de cette façon est que vous pouvez réutiliser l'objet stmt. Il suffit d'appeler sqlite3_reset() après chaque utilisation, et n'oubliez pas d'appeler sqlite3_finalize() lorsque vous avez terminé pour de bon.

+0

Merci benzado, donc je n'ai pas du tout besoin de sqlite3_exec, non? A la place, une séquence de sqlite_prepare_v2, sqlite3_bind_text, sqlite3_step et finalize. Wow, je vais essayer la première chose lundi. Cheers, – val

+0

Ce n'est pas tellement que vous n'en ayez pas besoin; 'sqlite3_exec' appelle lui-même' prepare', 'step' et' finalize'. En appelant vous-même ces fonctions, vous obtenez plus de contrôle sur la situation et pouvez utiliser 'bind', ce qui résout votre problème de citation. – benzado

+0

Je ne pouvais pas attendre jusqu'à lundi. Juste essayé et ça fonctionne comme un charme. Merci les gens. Bon week-end. Val – val

Questions connexes