2011-02-23 4 views
1

J'essaie d'insérer un grand nombre d'enregistrements dans une base de données SQLite. Je reçois l'erreur ci-dessus si j'essaie d'utiliser l'API C-sqlite3_exec.Erreur de syntaxe dans la requête SQLite

Le code ressemble à ceci:

ret = sqlite_exec(db_p,".import file.txt table", NULL, NULL, NULL); 

Je sais que la .import est la ligne de commande, mais peut-il y avoir une façon que vous pouvez faire un insert très grand nombre d'enregistrements qui prend un minimum de temps. J'ai lu le précédent code d'insertion en bloc et j'ai essayé de faire des changements mais ceux-ci ne fournissent pas les résultats désirés.

N'existe-t-il pas un moyen d'insérer directement la chaîne dans les tables sans avoir des API intermédiaires appelés?

+1

Pourriez-vous ajouter un extrait de code générant SQL et appelant 'sqlite3_exec'? Cette erreur est généralement causée par une erreur de syntaxe ou une erreur de formatage. –

+0

ret = sqlite_exec (db_p, ".message fichier.txt table", NULL, NULL, NULL); – SportyMe

Répondre

0

La réponse à l'erreur de syntaxe pourrait bien être, que vos chaînes ne sont pas placées entre guillemets dans votre instruction SQL.

+0

Il doit y avoir un moyen d'utiliser les équivalents de ligne de commande dans les fonctions API C? J'ai posté l'extrait de code que l'erreur est signalée comme ci-dessus. – SportyMe

3

.import n'est probablement pas disponible via l'API. Cependant, il y a une chose cruciale pour accélérer les insertions: les envelopper dans une transaction. Sans cela, sqlite devra écrire dans le fichier après chaque insertion pour conserver le principe ACID. La transaction permet d'écrire dans le fichier plus tard en vrac.

+0

C'est la bonne réponse. SQLite est une bibliothèque. '.import' et d'autres dot-commands font partie du shell SQLite, qui est juste un exemple de programme (bien que officiel) construit sur SQLite. Cependant, vous devez ajouter des points-virgules après 'BEGIN' et' COMMIT'. – Benoit

+0

dois-je avoir le sqlite3_exec entre chaque transaction pour les insertions individuelles que je fais ici? Merci :-) – SportyMe

+0

@SportyMe: jetez un oeil au code source de l'utilitaire shell (http://www.sqlite.org/src/annotate?checkin=f85afa0ecc7b31d3&filename=src/shell.c). Recherchez '" import "' incluant les guillemets. Ils créent une transaction en utilisant 'BEGIN/END', utilisent une instruction préparée pour l'appel' INSERT' 'sql3_bind_text' pour chaque colonne et' sql3_step' pour chaque ligne. Le code est assez lisible. –