PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu SQLite


Gast
2011-08-24, 15:43:59
Hallo!

Ich hantiere gerade etwas mit SQLite rum und habe ein kleines Problem:


int _tmain(int argc, _TCHAR* argv[])
{
sqlite3 *database;
sqlite3_open("Database.sqlite", &database);

int ret = 0;
ret = sqlite3_exec(database, "CREATE TABLE datasets (id integer primary key, name text, vorname text);", NULL, NULL, NULL);
ret = sqlite3_exec(database, "INSERT INTO datasets (name, vorname) VALUES ('Musterfrau', 'Maria');", NULL, NULL, NULL);
ret = sqlite3_exec(database, "INSERT INTO datasets (name, vorname) VALUES ('Mustermann', 'Max');", NULL, NULL, NULL);

...
}


Wenn die Tabelle schon vorhanden ist, wird der entsprechende Code zurückgegeben und es geht weiter.
Mein Problem ist nun, dass dies nicht auf die "INSERT INTO"s zutrifft, sprich da werden weitere Einträge mit denselben Namen angelegt. Kann ich vor dem INSERT INTO irgendwie prüfen, ob der Eintrag mit Vorname und Nachname schon vorhanden ist? In diesem Fall soll der INSERT INTO nämlich nicht ausgeführt werden.

Coda
2011-08-24, 15:50:29
Klar, mach einfach ein
"SELECT COUNT(*) FROM datasets WHERE ..."
Wenn 0 Zeilen gefunden werden, dann ist es noch nicht vorhanden.

Ein "Update falls vorhanden, Insert falls nicht" ist in standard SQL leider nicht spezifiziert.

Edit: SQLite hat auch "INSERT OR REPLACE" oder als Alias dafür nur "REPLACE".

AlecWhite
2011-08-25, 01:35:36
öh...unique constraint?

Gast
2011-08-25, 09:06:17
Besten Dank, das mit UNIQUE hat's natürlich am einfachsten gebracht ;)

Gast
2011-08-26, 11:52:32
So, nun hab ich ein erneutes Problem:

Ich habe eine kleine GUI in C++ gebaut, und lese dort Textinformationen ein. Diese möchte ich nun gerne per INSERT INTO in die angelegte Tabelle schreiben.
Wie bekomme ich z.B. einen eingelesenen Namen in das INSERT INTO rein?
So in der Art:


String surname= Textfeld->GetText();

sqlite3_exec(database, "INSERT INTO table1 (nachname) VALUES (surname);");


So geht es natürlich nicht, wie muss ich es richtig anstellen?

Marscel
2011-08-26, 12:46:24
Schau dir die Doku bei prepared Statements (http://www.sqlite.org/c3ref/stmt.html) an:

Du hast Platzhalter und ein paar Hilfsfunktionen, die die Werte nach Typ einsetzen.

Misda
2011-08-26, 12:47:15
Vorausgesetzt '+' konkateniert Strings, sollte es so imho gehen:


String surname= Textfeld->GetText();

sqlite3_exec(database, "INSERT INTO table1 (nachname) VALUES ('" + surname + "');");


Allerdings solltest du die Eingabe noch prüfen, nicht das dir eine Eingabe die Datenbank zerhaut ^^

EDIT: Oder gleich prepared Statements benutzen, ist wohl besser.

Gast
2011-08-26, 13:16:06
Die "+" Variante klappt leider nicht:

-> error C2110: '+': Zwei Zeiger können nicht addiert werden

In die Prepared Statements werde ich mich mal einarbeiten. Danke!

Misda
2011-08-26, 13:56:16
Ich kenne mich in C ganz schlecht aus - wie konkateniert man da Strings?

Gast
2011-08-26, 14:00:48
Ich kenne mich in C ganz schlecht aus - wie konkateniert man da Strings?

Meistens per append-Methode o.ä., du bist das vemutlich von Java weniger umständlich gewohnt? :)

Misda
2011-08-26, 14:02:32
Meistens per append-Methode o.ä., du bist das vemutlich von Java weniger umständlich gewohnt? :)

Ja, und von anderen Sprachen auch ^^

Marscel
2011-08-26, 16:35:05
Wenn er C nutzt, würd ich nicht mit eigenen Stringoperationen anfangen. Das ist Index-Rechne- und Kopiererei, für die du dann auch Escaping und Unicode berücksichtigen musst. Lass das lieber SQLite-Funktionen tun.

Gast
2011-09-12, 11:46:50
Hallo mal wieder!

Ich habe nochmal ne Frage, diesmal zu einer DELETE-Operation:

DELETE FROM name WHERE id=1;

Dies soll mir aus einer Tabelle <name> den Eintrag mit der ID = 1 löschen.
Soweit ich das beurteilen kann, wird das auch korrekt gemacht, zumindest wird der Eintrag bei einem anschließenden Query nicht mehr gelistet. Schaue ich aber mit einem Hex-Editor in die Datenbank-Datei, ist der Eintrag immer noch vorhanden. Ist das normal oder kann man den irgendwie auch da rauslöschen?