Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » MySQL Result in ofstream ausgeben....

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
01.03.2006, 13:03 Uhr
Noob2k5



Ich versuche in dieser Routine, das Ergebnis meines sql selects in eine Datei auszugeben:

C++:
void OutputDB()
{
    MYSQL_RES* result;
    std::string buffer;
    std::ofstream file("Mitarbeiter.dat");

    char DBuser[21];
    char DBpwd[21];
    std::cout<<"Geben Sie bitten ihren Benutzernamen an, um sich an der Datenbank anzumelden."<<std::endl;
    std::cout<<"Benutzername: ";
    std::cin.getline(DBuser,20);

    std::cout<<"Geben Sie bitten ihr Passwort an."<<std::endl;
    std::cout<<"Passwort: ";
    std::cin.getline(DBpwd,20);
        
    ConnectDB myDB("localhost",DBuser,DBpwd,"unternehmen",3306);
    SendRequestDB myReq;

    result = myReq.selectAll(myDB.pConnection);
    /* Test*/
    MYSQL_ROW rowContent;
    unsigned long int numRow;
    numRow  = (unsigned long int) mysql_num_rows(result);

    while(rowContent = mysql_fetch_row(result))
    {
        for(unsigned long int i = 0; i<= numRow;i++)
        {
            file << rowContent[i];
        }
    }


}



Das Programm fällt allerdings auf die Schnauze, es gibt wohl Probleme mit der strlen.asm, an der stelle mit dem ersten mov bleibt der Debug hängen - wieso?

C++:
str_misaligned:
        ; simple byte loop until string is aligned
        mov     al,byte ptr [ecx]
        add     ecx,1
        test    al,al
        je      short byte_3
        test    ecx,3
        jne     short str_misaligned

        add     eax,dword ptr 0         ; 5 byte nop to align label below

        align   16                      ; should be redundant


Kann mir jemand einen Tipp geben, warum ich nicht einfach den den Inhalt der Spalte in meine Ausgabedatei schieben kann?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.03.2006, 13:13 Uhr
virtual
Sexiest Bit alive
(Operator)


Dieser Assembler ausschnitt kann von überall und nirgends aufgerufen worden sein. Aber generell würde ich mal behaupten:

C++:
   numRow  = (unsigned long int) mysql_num_rows(result);

    while(rowContent = mysql_fetch_row(result))
    {
        for(unsigned long int i = 0; i<= numRow;i++)
        {
            file << rowContent[i];
        }
    }


Das sieht mir von der Logik her aus aus, daß die erste Zeile

C++:
   numColumns  = (unsigned long int) mysql_num_columns(result);


Oder ähnlich heißen sollte. Der Rest muß halt entsprechend auch angepasst werden.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.03.2006, 13:48 Uhr
Noob2k5




Zitat von virtual:
Dieser Assembler ausschnitt kann von überall und nirgends aufgerufen worden sein. Aber generell würde ich mal behaupten:

C++:
   numRow  = (unsigned long int) mysql_num_rows(result);

    while(rowContent = mysql_fetch_row(result))
    {
        for(unsigned long int i = 0; i<= numRow;i++)
        {
            file << rowContent[i];
        }
    }


Das sieht mir von der Logik her aus aus, daß die erste Zeile

C++:
   numColumns  = (unsigned long int) mysql_num_columns(result);


Oder ähnlich heißen sollte. Der Rest muß halt entsprechend auch angepasst werden.


Wenn ich anstelle der Ausgabe in die Datei, ein std::cout mache, funktioniert es (wen ich mysq_num_row(result) ) verwende. Ich werds mal mit der columns methode versuche, aber wirklich verstehen warum das deswegen schief laufen könnte verstehe ich nicht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.03.2006, 15:45 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Ansonsten solltest du prüfen ob ein Feld nicht NULL ist. sonst schiebst du einen Null-Pointer in file
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.03.2006, 20:10 Uhr
~Noob2k5
Gast


Das klappt jetzt soweit, danke.

Ich wollte den Inhalt der Datenbank jetzt formatiert in eine einfache .txt Datei ausgeben. Deswegen wollte ich Spalten einzel abgreifen und dann nach jeder Spalte ein "|" ausgeben.

Nun hab ich auf der mysql c-api referenzseite nachgeguckt und erstmal festgestellt das es keine methode seitens der api gibt um den Inhalt einer Spalte zu erfahren.

http://dev.mysql.com/doc/refman/5.0/en/c-api-function-overview.html

Scheint wohl nur zeilenweise zu gehen. Deswegen wollte ich den weg gehen und mit einem .write einfach in der Länge einer ganzen Zeile alles in die Datei schreiben. Nur leider wird Datenmüll mit ausgegeben, sollte der Inhalt eines Feldes nicht die maximal Länge des Datenbankfeldes benutzen. Sieht dann so aus das ich neben den Informationen noch irgendwelche Sonderzeichen da drin hab.

Jemand eine Idee wie ich den Datenmüll aus dem Datenstrom kriege, wenn ich eine feste Satzlänge benutze? Oder evtl. einen Trick wie ich doch auf den Spalteninhalt zugreifen kann?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.03.2006, 21:17 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi memset benutzen und den string mit 32 (leerzeichen) initialisieren. Achja wichtig: dann noch das letzte Zeichen terminieren.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.03.2006, 21:58 Uhr
~Noob2k5
Gast



Zitat von FloSoft:
hi memset benutzen und den string mit 32 (leerzeichen) initialisieren. Achja wichtig: dann noch das letzte Zeichen terminieren.


Hab mir memset mal angeguckt, das setzt ein char* voraus. Würde aber gerne direkt das Ergebnis meines SQL Querys formatiert ausgeben, sprich den Inhalt der in meiner MYSQL_ROW* Variable gespeichert ist.

Mein Code sieht derzeit so aus:


C++:
while(rowContent = mysql_fetch_row(result))
    {        
        for(unsigned long int i = 0; i<numCol; ++i)
        {
            
            file<<rowContent[i]<<"|";
            
        }
        //Zeilenumbruch nach jedem Datensatz
        file<<"\n";
    }


Ich muss mir als eine char* Variable machen, diese mit memset komplett mit ' ' vorbesetzen? Wieso ausgerechnet die Länge von 32? Mit terminieren der letzten Stelle war gemeint dort ein '\0' zu setzen?

Wenn dann meine variable soweit vorbereitet ist, convertiere ich meine MYSQL_ROW* Variable in einen String von da in einen c_string und schieb die in meine vorbereitet variable rein und dann in nach "file" zur eigentlichen ausgabe?

Ich bin mir ziemlich sicher das ich das falsch verstanden habe, hört sich nämlmich viel zu kompliziert an.........

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.03.2006, 22:47 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hallo,
ok hab dich wohl missverstanden

probier mal:


C++:
file<< setw(breiteeinerspalte) << rowContent[i]<<"|";



Dein Problem mit den "Sonderzeichen mit drin" liegt daran das das Datenresult zwar jeweils die Spaltenlänge deiner Spalten hat, der Inhalt nicht, wodurch der Rest "uninitialisiert" ist. Eigentlich sollten die Daten entsprechend nullterminiert sein, d.h nach dem letzten Zeichen Daten sollte ein \0 kommen.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.03.2006, 21:58 Uhr
~Noob2k5
Gast


Ahhhhhh, danke. Da war doch was :-).

Thx! klappt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: