MySQL (SELECT * FROM) ... Hilfe.
-
if(!mysql_query(mysql, "SELECT * FROM test")) { printf(":[i]: \"SELECT * FROM test\" successful.\n"); } else { printf(":[i]: \"SELECT * FROM test\" error.\n"); }
Das hier ist ein Code und zwar stammt er aus meinem Übungsprogramm. Ich verbinde per C++ zu einem MySQL Server (localhost auf meinem PC) und erstelle Tabellen, füge Zeilen ein etc! Und obiges ist ein Code, der eben daten "selektiert"... Bei PHP ging das immer so:
$meinedaten = mysql_query("SELECT * FROM test");
und schon konnte man mit
$meinedaten[SPALTENNAME]
auf die Daten zugreifen, etc! Aber in MySQL bekomm ich das nicht hin! Wie macht man soetwas?
Danke im Voraus der Chris.
-
Ich würde fast darauf tippen, dass PHP und C++ nicht das gleiche Interface benutzen
Google mal nach MySQL lib oder so ähnlich. Bzw. auf der MySQL Homepage gibt's den Wrapper.
M.T.
-
na klar! die habe ich ja! ich conencte ja auch, adde zeilen etc, nur jetzt muss ich wissen wie man z.b. an die daten einer zeile kommt! hat da keiner wissen?
danke
-
Du kannst, wie auch bei PHP, nicht direkt auf das result set zugreifen, sondern musst die Daten erst zeilenweise mit mysql_fetch_row() einlesen
-
stimmt das hatte ich vergessen zu sagen... ehm aber mein problem ist dass ich nicht weiß wie das nu geht
mysql_fetch_row(blah...)
genau da wäre ein beispiel (also jetzt unter c++) sehr hilfreich. könnt ihr sowas?
chris
-
mysql_query liefert ein result set zurück, welches du an mysql_fetch_row übergibst. Ein Beispiel findest du in der Doku (mein obriger Link)
-
Moment noch! *g
Also genau da entsteht ja mein Problem. Und zwar möchte ich normal anfangen mit MYSQL_ROW row; ... und da sagt der Compiler schon:c:\mysqlll\examples\libmysqltest\myTest.c(219): error C2275: 'MYSQL_ROW' : illegal use of this type as an expression
c:\mysqlll\examples\libmysqltest\myTest.c(219): error C2146: syntax error : missing ';' before identifier 'row'
c:\mysqlll\examples\libmysqltest\myTest.c(219): error C2144: syntax error : '<Unknown>' should be preceded by '<Unknown>'
c:\mysqlll\examples\libmysqltest\myTest.c(219): error C2144: syntax error : '<Unknown>' should be preceded by '<Unknown>'
c:\mysqlll\examples\libmysqltest\myTest.c(219): error C2143: syntax error : missing ';' before 'identifier'
c:\mysqlll\examples\libmysqltest\myTest.c(219): error C2065: 'row' : undeclared identifierTja genau das bekomm ich nicht hin!
includet habe ich: #include <mysql.h> und die libmySQL.lib hab ich auch mal gelinkt... geht nicht!!!
chris
-
Hast du auch den entsprechenden Pfad eingestellt bzw. direkt angegeben (#include "d:/mysql/include/mysql.h")
Und vorher sollte man anscheinend windows.h einbindenaber benutz mal die Forensuche, da wirst du bestimmt fündig
-
Hm ja habe es direkt mit dem PFad probiert... Geht nicht. Also ich meine: es ergibt das selbe Resultat. Aber ich hab den richtigen Pfad eingestellt... Also es klappt von dem her schon! Nur ich kann überhaupt keine Variablen verwenden. MYSQL_ROW... Da kommen sofort Fehler. Dabei brauche ich das so dringend!
Nein ich finde da leider nichts... Scheint ja ein Lib Problem oder so zu sein kA
-
Probier es doch mal mit der ODBC - oder willst du diese nicht nutzen ???
Da würder der Code ungefähr so aussehen zum auslesen aus zwei Spalten:
// Auslesen!! HSTMT hstmtSelect; /* Allocate the statement handles */ retcode = SQLAllocStmt(hdbc1, &hstmtSelect); if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) { ProcessLogMessages(SQL_HANDLE_STMT, hstmtSelect, "SQLAllocStmt() Failed\n\n", TRUE); return(9); } /* SELECT the result set and bind its columns to local storage */ retcode = SQLExecDirect(hstmtSelect,(SQLCHAR *)"SELECT * FROM test",SQL_NTS); if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) { ProcessLogMessages(SQL_HANDLE_STMT, hstmtSelect, "SQLExecDirect() Failed\n\n", TRUE); return(9); } // Ausgabe !!! // SQLBindCol variables SQLCHAR szName[MAXNAME+1]; SQLINTEGER iName,cbiName; SQLINTEGER cbName; retcode = SQLBindCol(hstmtSelect, (SQLSMALLINT)1, SQL_C_ULONG, &iName, 0, &cbiName); if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) { ProcessLogMessages(SQL_HANDLE_STMT, hstmtSelect, "SQLBindCol() Failed\n\n", TRUE); return(9); } retcode = SQLBindCol(hstmtSelect, (SQLSMALLINT)2, SQL_C_CHAR, szName, MAXNAME, &cbName); if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) { ProcessLogMessages(SQL_HANDLE_STMT, hstmtSelect, "SQLBindCol() Failed\n\n", TRUE); return(9); } while ( (retcode = SQLFetch(hstmtSelect) ) != SQL_NO_DATA ) { if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) { ProcessLogMessages(SQL_HANDLE_STMT, hstmtSelect, "SQLFetch() Failed\n\n", TRUE); return(9); }//*/ retcode = SQLGetData(hstmtSelect, (SQLSMALLINT)1, SQL_C_ULONG, &iName, 0, &cbiName); if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) { ProcessLogMessages(SQL_HANDLE_STMT, hstmtSelect, "SQLGetData() Failed\n\n", TRUE); return(9); }//*/ retcode = SQLGetData(hstmtSelect, (SQLSMALLINT)2, SQL_C_CHAR, szName, MAXNAME, &cbName); if ( (retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO) ) { ProcessLogMessages(SQL_HANDLE_STMT, hstmtSelect, "SQLGetData() Failed\n\n", TRUE); return(9); }//*/ printf("id = %d ", iName); printf("Name = %s ", szName); }//while
Vielleicht kommst du ja mit OdBC besser
MfG Unwissender
-
Das ist alles sehr seltsam
- zeig doch mal den ganzen Code; vielleicht findet sich dann jemand, der das bei sich mal testet
-
warum hier odbc wenn mysql so eine schöne c-api hat?
http://www.mysql.com/doc/de/C.html
-
ps: @flenders
falls du den odbc code meinst mit zeigen musst du einfach eine dns zur datenbank anlegen und folgende header includieren:#include <windows.h> #include <stdlib.h> #include <stdio.h> #include <sql.h> #include <sqlext.h>
dazu benötigst du in winapi manie handles:
SQLHANDLE henv; SQLHANDLE hdbc; SQLHANDLE hstmt; RETCODE rc;
und mit denen kann man dann drauf zugreifen
rc = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); rc = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_UINTEGER); rc = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); rc = SQLConnect(hdbc, (SQLCHAR *)dsn, SQL_NTS, (SQLCHAR *) user, SQL_NTS, (SQLCHAR *) pass, SQL_NTS); rc = SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hstmt); rc = SQLPrepare(hstmt, (SQLCHAR *)Statement, SQL_NTS); rc = SQLExecute(hstmt); rc = SQLFetch(hstmt);
dann kann man wie oben loslegen..
gibt dann übrigens einige eigene datentypen
SQLCHAR m_Id[ID_LEN];
aber vielleicht meintest du auch den mysql problemfall..
-
Ich meinte den Problemfall. Es ist doch seltsam, dass er die Typen nicht anerkennt, obwohl er ja anscheinend alle nötigen header (windows.h und mysql.h) includiert hat - oder sind es noch mehr
Ich habe noch nie was mit MySQL und C gemacht, immer nur mit PHP, deshalb kann ich jetzt hier auch nicht mehr groß weiterhelfen.
@elise: Du kannst da sicher noch den Fehler finden
-
hier gibts eine schöne musterlösung...
http://www.in.tu-clausthal.de/~hoerner/db0102/Musterloesung5.pdf
ps: ein libproblem kann es noch nicht sein, wenn er die datentypen nicht anerkennt und sie als compilerfehler moniert.
die libmySQL.lib muss natürlich mitgelinkt sein.
der mysql server muss schließ und endlich laufen.
sonst fällt mir auch nix ein.
-
was mir in deiner musterlösung auffällt:
MYSQL RES *result=malloc(sizeof(MYSQL RES)); //wofür soll das gut sein´?? //und MYSQL* mysql=malloc(sizeof(MYSQL)); mysql_init(mysql); //kann durch ersetzt werden. MYSQL* mysql=mysql_init(NULL);
-
habe sie eben ergooglet und nicht alles durchgeschaut und den lehrbeauftragten der tu ilmenau getraut.
im grunde muss bei ChrisK erstmal mysql gefunden werden... aber vielleicht läuft es bei ihm ja jetzt...
-
ich brauch für die sachen immer etwas länger! aber die pdf datei sieht sehr interessant aus! ich probiere mich mal und sag dann, wies funktioniert/nicht funktionier! DANKE MAL! bis dann!
-
für DevCPP gibt es auch neuerdings auch ein mysql beispiel1. Simpel gehalten:
/* Name: MySQLClientTest (module) Original Author: Dinesh V. R., dinesh@dvrsol.com Editor: Kip Warner, "decrypted" into Vertigo syntax and prepared for dev Date: 23/03/03 12:38 Description: Example to show usage of MySQL databases. */ // Includes... #include <windows.h> #include <mysql.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> // Database name... char szDB[] = "evolution"; const int nMaxBufSize = 1024; // Entry point... int main(int argc, char *argv[]) { // Variables... MYSQL *myData; MYSQL_RES *res; MYSQL_FIELD *fd; MYSQL_ROW row; int i, j, k, l, x; char aszFlds[25][25]; char szSQL[] = "SELECT * FROM b2users"; // assumed that there is table properties // Try to select database and check for error... if((myData = mysql_init((MYSQL*) 0)) && mysql_real_connect( myData, NULL, NULL, NULL, NULL, MYSQL_PORT, NULL, 0 )) { // Failed... if(mysql_select_db(myData, szDB) < 0) { // Tell user what's going on, close database, then quit... printf("Can't select the %s database!\n", szDB); mysql_close(myData); getch(); return 2; } } // Failed to connect... else { // Tell user what's going on, close database, then quit... printf("Can't connect to the mysql server on port %d!\n", MYSQL_PORT); mysql_close(myData); getch(); return 1; } // Query database with "SELECT * FROM PROPERTIES" command... if(mysql_query(myData, szSQL) == 0) { // I have no idea what he's doing here... res = mysql_store_result(myData); i = (int) mysql_num_rows(res); l = 1; // Display query result... printf("Query: %s\nNumber of records found: %d\n", szSQL, i); // Get the field-specific characteristics here.... for(x = 0; fd = mysql_fetch_field(res); x++) strcpy(aszFlds[x], fd->name); // I have no idea what he is doing here either... while(row = mysql_fetch_row(res)) { // Wtf... j = mysql_num_fields(res); printf( "Record #%d:-\n", l++); for(k = 0 ; k < j ; k++) printf( " Fld #%d (%s): %s\n", k + 1, aszFlds[k], (((row[k]==NULL)||(!strlen(row[k]))) ? "NULL" : row[k])); puts("==============================\n"); } // Free the result... mysql_free_result(res); } // Failed to query database... else printf("Couldn't execute %s on the server !\n", szSQL); // Close connection to database... mysql_close(myData); // Wait for key, then terminate... getch(); return 0; }