SQLite3: Einfügen von BLOB mit NULL-Zeichen in C ++

8

Ich arbeite an der Entwicklung einer C ++ API, die benutzerdefinierte Plugins verwendet um mit verschiedenen Datenbank-Engines über ihre APIs und spezifische SQL zu interagieren Syntax.

Momentan versuche ich eine Möglichkeit zum Einfügen von BLOBs zu finden, aber da NULL ist das abschließende Zeichen in C / C ++, wird das BLOB beim Konstruieren abgeschnitten die INSERT INTO Abfragezeichenfolge. Bisher habe ich mit

gearbeitet %Vor%

Ich erwarte, dass es, wenn es überhaupt möglich ist, es in der interaktiven SQLite3-Konsole zu tun, möglich sein sollte, die Abfragezeichenfolge mit ordnungsgemäß entkerntem NULL -Zeichen zu konstruieren. Vielleicht gibt es eine Möglichkeit, dies mit Standard-SQL zu tun, die auch von SQLite SQL-Syntax unterstützt wird?

Sicherlich muss jemand die gleiche Situation vorher gehabt haben. Ich habe gegoogelt und einige Antworten gefunden, waren aber in anderen Programmiersprachen (Python).

Vielen Dank im Voraus für Ihr Feedback.

    
jbatista 01.01.2009, 11:35
quelle

3 Antworten

8

Sie möchten diese Funktion mit einer vorbereiteten Anweisung verwenden.

%Vor%

In C / C ++ besteht die Standardmethode für den Umgang mit NULL in Strings darin, entweder den Anfang der Zeichenfolge und eine Länge zu speichern oder einen Zeiger auf den Anfang einer Zeichenfolge und einen Zeiger auf das Ende der Zeichenfolge zu speichern / p>     

Eclipse 02.01.2009, 02:38
quelle
9

Vielen Dank noch einmal für Ihr Feedback. Diesmal berichte ich, wie ich das Problem mit Hilfe der hier angegebenen Hinweise gelöst habe. Hoffentlich hilft das anderen in der Zukunft.

Wie von den ersten drei Postern vorgeschlagen, habe ich vorbereitete Anweisungen verwendet - zusätzlich, weil ich auch daran interessiert war, die Datentypen der Spalten zu erhalten, und ein einfaches sqlite3_get_table() würde nicht funktionieren.

Nach der Vorbereitung der SQL-Anweisung in Form der folgenden konstanten Zeichenfolge:

%Vor%

Es bleibt die Bindung der entsprechenden Werte. Dies geschieht, indem so viele sqlite3_bind_blob() -Aufrufe als Spalten ausgegeben werden. (Ich habe auch auf sqlite3_bind_text() für andere "einfache" Datentypen zurückgegriffen, weil die API, an der ich arbeite, ganze Zahlen / doubles / etc in eine Zeichenkette übersetzen kann). Also:

%Vor%

Beachten Sie auch, dass einige Funktionen ( sqlite3_open_v2() , sqlite3_prepare_v2() ) auf den späteren SQLite-Versionen erscheinen (ich nehme 3.5.x und höher an).

    
jbatista 02.01.2009 22:08
quelle
1

Sie möchten die Anweisung sqlite_prepare_v2() vorkompilieren und dann das Blob mit sqlite3_bind_blob() binden. Beachten Sie, dass die Anweisung, an die Sie binden, INSERT INTO table VALUES (?) ist.

    
Louis Gerbarg 01.01.2009 12:57
quelle

Tags und Links