Zur Laufzeit Daten in eube MySQL-Datenbank einfügen
Zur Laufzeit Daten in eube MySQL-Datenbank einfügen
am 02.09.2006 10:39:29 von Stefan Degens
Hallo,
ich habe seit einer geraumen Zeit in Internet nach einem bestimmten
Thema gesucht. Es geht um das Einfügen von Daten in eine MySQL
Datenbank. Konkret: In allen Beispielen, die ich gesehen habe, sind die
Daten, die eine Tabelle in der Datenbank abgespeichert werden in dem
Quellcode hrd codiert. D.h. es steht immer mysql_query(mConnection,
"INSERT INTO customer(nr, name) VALUES (12, 'Hans Wurst')")) oder
sowas. Die Values sind immer fest im Quelltext eingebaut. Wie ist es
denn, wenn ich die ganzen Sachen interaktiv(z.B. mit cin) bzw. über
Dateien in die Datenbank schrieben will? Ich habe nämlich Daten aus
Dateien in ein Speicherobjekt gepackt(Datentyp sind string und int, die
man mittels einem get-Befehl rausholen könnte) und möchte nun, daß
diese Daten in eine Datenbank geschrieben werden.
Die Harcodierung ist ja meiner Meinung nach sinnlos, da man ja dann
auch manuell die Daten in die DAtenbak eintragen kann, deshalb wundert
es mich, daß ich zu dem Problem kein Beispielcode gefunden
habe(außer: http://www.freebsddiary.org/mysql-capi.php, es wird aber
da eine andere Bibo verwendet).
So sieht ungefähr der Code aus
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
MYSQL_RES *mTabelle;
// MYSQL_ROW mRecord;
MYSQL *mConnection, mDB;
int mError;
mysql_init(&mDB);
mConnection =3D
mysql_real_connect(&mDB,"localhost","root","","test-datenban k",0,0,0);
if (mConnection == NULL) {
printf("Es konnte keine Verbindung zur Datenbank hergestellt
werden: %s",mysql_error(&mDB));
return 1;
} else {
printf("Es wurde erfolgreich eine Verbindung hergestellt!");
}
mysql_query(mConnection, "DROP TABLE test-tabelle");
mysql_close(mConnection);
return 0;
Re: Zur Laufzeit Daten in eube MySQL-Datenbank einfügen
am 02.09.2006 10:56:21 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: =?iso-8859-1?q?Zur_Laufzeit_Daten_in_eube_MySQL-Datenbank_einfügen?
am 02.09.2006 12:38:02 von Axel Schwenke
"Stefan Degens" wrote:
> ich habe seit einer geraumen Zeit in Internet nach einem bestimmten
> Thema gesucht.
Dann scheinst du wirklich *sehr* unbedarft in Sachen Internetrecherche
zu sein. Dein Startpunkt wäre hier gewesen:
http://dev.mysql.com/doc/refman/5.0/en/apis.html
und da du ja anscheinend C Code schreibst, gleich weiter hierher:
http://dev.mysql.com/doc/refman/5.0/en/c.html
(wenn du C++ machst, kannst du entweder das native C-API verwenden
oder einen der vielen C++ Wrapper. Auf jeden Fall solltest du das
C-API aber verstanden haben.)
> Konkret: In allen Beispielen, die ich gesehen habe, sind die
> Daten, die eine Tabelle in der Datenbank abgespeichert werden in dem
> Quellcode hrd codiert. D.h. es steht immer mysql_query(mConnection,
> "INSERT INTO customer(nr, name) VALUES (12, 'Hans Wurst')")) oder
> sowas. Die Values sind immer fest im Quelltext eingebaut.
Was soll man bei einem *Beispiel* auch anderes machen? Der zweite
Parameter von mysql_query() ist ein char*, der ein nullterminiertes
SQL-Statement enthalten muß. Wenn du also Variablen in ein SQL-
Statement einfügen willst, dann baust du den String zur Laufzeit
auf und verfütterst ihn an mysql_query(). Denkbar wäre z.B. die
Verwendung von s(n)printf() zu diesem Zweck.
Wenn du unter o.g. URL weiter liest, wirst du auf mysql_real_query()
stoßen, das den Vorteil hat daß dein Statement auch '\0' enthalten
darf (etwa in einem BLOB). Außerdem solltes du dich über das Thema
Quoting schlau machen (mysql_escape_string() & Co).
Und schließlich gibt es seit geraumer Zeit auch ein API für prepared
Statements. Da übergibst du das SQL-Statement mit Platzhaltern für
die variablen Daten und füllst beim Ausführen mit realen Daten auf.
Dieses API hat eine Menge Vorteile (Performance, Sicherheit vor SQL-
Injection) ist aber etwas aufwendiger zu benutzen.
Beispielcode gibt es unter o.g. URL auch.
> Ich habe nämlich Daten aus
> Dateien in ein Speicherobjekt gepackt(Datentyp sind string und int, die
> man mittels einem get-Befehl rausholen könnte) und möchte nun, daß
> diese Daten in eine Datenbank geschrieben werden.
struct customer {int nr, char* name};
...
int insert_customer(MYSQL *mysql, struct customer *foo)
{
char query_buffer[GROSSE_ZAHL];
char quoted_name[ANDERE_GROSSE_ZAHL];
mysql_escape_string(mysql, quoted_name, foo->name);
sprintf(query_buffer,
"INSERT INTO customer (nr, name) VALUES (%d, '%s')",
foo->nr, quoted_name);
return mysql_query(mysql, query_buffer);
}
XL
Re: Zur Laufzeit Daten in eube MySQL-Datenbank einfügen
am 02.09.2006 13:12:35 von Thomas Rachel
Stefan Degens wrote:
> [...] Konkret: In allen Beispielen, die ich gesehen habe, sind die
> Daten, die eine Tabelle in der Datenbank abgespeichert werden in dem
> Quellcode hrd codiert.
Weil es Beispiele sind, die Dir die Verwendung der MySQL-API näherbringen
sollen. Natürlich macht das in einer realen Anwendung nur wenig Sinn; Du
solltest durchaus den Query von Hand zusammenbasteln und dabei dort, wo
es Sinn macht, Gebrauch von mysql_real_escape_string() machen.
> [...] Ich habe nämlich Daten aus
> Dateien in ein Speicherobjekt gepackt(Datentyp sind string und int, die
> man mittels einem get-Befehl rausholen könnte) und möchte nun, daÃ
> diese Daten in eine Datenbank geschrieben werden.
Wie Du das im einzelnen machst, hängt von der Programmiersprache ab. Das
solltest Du dann in der jeweils passenden Newsgroup erörtern.
Wichtig ist, daà bei der C-API der Funktion mysql_real_query() ein
Speicherbereich (mit Startadresse und Länge) übergeben wird, der einen
gültigen (und sinnvollerweise den gewünschten) SQL-Query enthält (oder
wahlweise der Funktion mysql_query() einen C-String, also
nullterminiert, übergibst, mit denselben Kriterien.
Daà ich extra betone, daà es der gewünschte Query sein soll, hat den
Sinn, nochmal auf das Escapen hinzuweisen: wenn Du den String "Songs Of
The 70's" in die Datenbank einfügen willst, muÃt Du ihn durch
mysql_[real_]escape_string() schieben, wodurch Du "Songs Of The 70\'s"
erhältst. Das in einen Query eingebettet, ergibt das, was Du willst -
sowas in der Art wie
snprintf(buffer,sizeof buffer,"INSERT INTO t SET v='%s'", escwert)
hilft Dir dann, den Query so zu bauen, wie Du das willst.
Näheres zu diesen Buffern in einer C-Newsgroup (oder, im Falle von C++,
bspw. zum Auslesen der Zeichen eines String-Objektes in einer
C++-Gruppe).
> Die Harcodierung ist ja meiner Meinung nach sinnlos, da man ja dann
> auch manuell die Daten in die DAtenbak eintragen kann,
Natürlich.
> deshalb wundert es mich, daà ich zu dem Problem kein Beispielcode
> gefunden habe
Ich nehme an, weil die Beispiele in erster Linie vom MySQL-API handeln;
das Zusammenbasteln von Strings sind meistens Grundlagen der jeweils
verwendeten Sprache und hier zumindest nicht on-topic. (Ich habe Dir
oben trotzdem mal nen Hinweis gegeben, wie Du weiterarbeiten könntest.)
Aus Deinem Beispiel:
> // MYSQL_ROW mRecord;
Das brauchst Du später, um Zeilen aus der DB abrufen zu können.
> mysql_query(mConnection, "DROP TABLE test-tabelle");
Und diesen Query würdest Du dann durch den jeweils gewünschten Query
ersetzen.
Thomas
--
Dem Vogel ist ein einfacher Zweig lieber als ein goldener Käfig. (Aus
RuÃland)