tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
10
ZUGRIFFE
22841
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Cloudchaser Cloudchaser ist offline Mitglied
    Registriert seit
    Jan 2007
    Beiträge
    10
    Hallo tutorial.de!

    Es war eigentlich nicht beabsichtigt, dass mein erster Beitrag direkt eine Frage ist , aber es soll wohl so sein .

    Also ich versuche im Moment bereits seit ein paar Tagen einen Zugriff durch C++ auf eine lokale MySQL-Datenbank zu realisieren. Ich habe mich bis jetzt durch alle möglichen Internetforen und Seiten gelesen und auch schon viele Fehler entfernen können, doch dass einzige was passiert ist das Auftauchen neuer Fehler. Dabei verwendete ich erstmal zum Testen nur Beispielcode.

    Ich wüsste gerne, wie ich den OBCD verstehen muss - was ist es und wie verwende ich es? Habe es in Visual C++ eingebunden als Datenquelle, aber auch nur, weil gesagt wurde, dass man das machen muss. Auf Deutsch gesagt: Ich warte darauf, dass man irgendwo den Ort, den Benutzernamen und das Passwort für den Server eingeben muss...und dann später Befehle als String an die Datenbank schickt...habe es aber bis jetzt nicht gefunden

    In den Code sind mittlerweile alle Headerdateien die gewünscht waren eingebunden (mysql.h und winsock2.h) aber leider haben sich jetzt nur die Fehler geändert und ich weiss im Moment nicht, was er eigentlich von mir will (abgesehen von: "Ich bin der Pc, das passt mir nicht, ändere es!" )

    Die Fehlermeldung sieht so aus:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    Kompilieren...
    stdafx.cpp
    Kompilieren...
    Datenbankverbindung.cpp
    c:\[...]\projects\datenbankverbindung\datenbankverbindung\datenbankverbindung.cpp(47) : warning C4267: 'Argument': Konvertierung von 'size_t' nach 'unsigned long', Datenverlust möglich
    Manifest in Ressourcen wird kompiliert...
    Verknüpfen...
    Datenbankverbindung.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_mysql_error@4" in Funktion ""void __cdecl check_error(void)" (?check_error@@YAXXZ)".
    Datenbankverbindung.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_mysql_errno@4" in Funktion ""void __cdecl check_error(void)" (?check_error@@YAXXZ)".
    Datenbankverbindung.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_mysql_close@4" in Funktion "_main".
    Datenbankverbindung.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_mysql_real_query@12" in Funktion "_main".
    Datenbankverbindung.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_mysql_real_connect@32" in Funktion "_main".
    Datenbankverbindung.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_mysql_init@4" in Funktion "_main".
    C:\[...]\Visual Studio 2005\Projects\Datenbankverbindung\Debug\Datenbankverbindung.exe : fatal error LNK1120: 6 nicht aufgelöste externe Verweise.

    "Mein" Code sieht im Moment so aus:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    
    #include "stdafx.h"
    #include <stdio.h> 
    #include <stdlib.h>
    #include "C:\Programme\Microsoft Platform SDK for Windows Server 2003 R2\Include\WinSock2.h"
    #include "C:\Programme\MySQL\MySQL Server 5.0\include\mysql.h"
    #include "C:\Programme\Microsoft Platform SDK for Windows Server 2003 R2\Include\Windows.h"
     
     
    MYSQL  *my; 
    void check_error(void)  
    { 
       if (mysql_errno(my) != 0) 
       { 
          fprintf(stderr, "Fehler: %s\n", mysql_error(my)); 
          exit(EXIT_FAILURE); 
       } 
    } 
     
    int main () 
    {   
      // Handle 
       my = mysql_init(NULL); 
       if(my == NULL) 
       { 
          fprintf(stderr, " Initialisierung fehlgeschlagen\n"); 
          return EXIT_SUCCESS; 
       } 
       // verbindung mit server 
       if( mysql_real_connect(my, "localhost", "root", "root", NULL, 0, NULL, 0))   
       { 
          printf("Fehler"); 
       } else { 
          printf("Erfolgreich mit dem MySQL-Server verbunden\n"); 
       } 
       // mysql code 
     
       char *argument; 
        argument = "INSERT INTO `test` `id`='1'"; 
        mysql_real_query(my, argument, strlen(argument)); 
        check_error(); 
        
       // verbindung trennen 
       mysql_close (my); 
       return EXIT_SUCCESS; 
    }

    Muchas Gracias für alle Antworten. Kenne mittlerweile x Foren und Seiten...aber irgendwie scheint mein PC wohl sehr eigenwillig zu sein
     

  2. #2
    Radhad Radhad ist offline Mitglied Diamant
    Registriert seit
    Mar 2003
    Ort
    Wuppertal (NRW)
    Beiträge
    1.917
    Blog-Einträge
    35
    Interessant, ich habe nur die Standard Bibliotheken von Visual C++ 6.0 verwendet, da ich nicht wusste, wie ich die MySQL++ Klasse einbinden kann...

    Hier ist ein Kleines C++ Programm, welches ich geschrieben habe. Allerdings gehen manche SQL Befehle nicht wie "SHOW TABLES FROM databse;".

    Hier mal das Programm (zum kompilieren muss es als MFC Programm ausgeführt -> Projekt -> Einstellungen):
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    
    #include <afxwin.h>
    #include <afxdb.h>
    #include <iostream>
    #include <conio.h>
    #include <stdio.h>
     
     
    using namespace std;
     
     
    void read()
    {
        system("cls");
     
        CString ODBC;
     
        CDatabase db;
        ODBC = "DRIVER={MySQL ODBC 3.51 Driver};PORT=3306;SERVER=127.0.0.1;DATABASE=sample;USER=root;PWD=";
     
        db.OpenEx(ODBC, CDatabase::noOdbcDialog); // Connection-Daten: DSN(MySQL), UID(root), PWD(test)
        if(db.IsOpen() == 0)
        {
            cout << "Die Verbindung zur Datenbank konnte nicht hergestellt werden!" << endl; // Ausgabe: Verbindung nicht hergestellt
        }
        else
        {
            CRecordset rs(&db);
            rs.Open(rs.forwardOnly, _T( "SELECT * FROM Users" ));
     
            CDBVariant varValue;
     
            int n = rs.GetODBCFieldCount();
            int i = 0;
            int count = 0;
     
            while( !rs.IsEOF() )
            {
                count++;
                for(i = 0; i < n; i++)
                {
                    rs.GetFieldValue(i, varValue, DEFAULT_FIELD_TYPE);
                    
                    switch(varValue.m_dwType)
                    {
                    case DBVT_NULL:
                        cout << "NULL";
                        break;
                    case DBVT_BOOL:
                        cout << varValue.m_boolVal;
                        break;
                    case DBVT_UCHAR:
                        cout << varValue.m_chVal;
                        break;
                    case DBVT_SHORT:
                        cout << varValue.m_iVal;
                        break;
                    case DBVT_LONG:
                        cout << varValue.m_lVal;
                        break;
                    case DBVT_SINGLE:
                        cout << varValue.m_fltVal;
                        break;
                    case DBVT_DOUBLE:
                        cout << varValue.m_dblVal;
                        break;
                    case DBVT_DATE :
                        cout << varValue.m_pdate;
                        break;
                    case DBVT_STRING:
                        cout << varValue.m_pstring->GetBuffer(1);
                        break;
                    case DBVT_BINARY:
                        cout << varValue.m_pbinary;
                        break;
                    default:
                        break;
                    }
     
                    if(i < n)
                    {
                        cout << " - ";
                    }
                
                    varValue.Clear();
                }
                cout << endl;
                rs.MoveNext();
            }
            rs.Close();
            cout << endl << "-----------" << endl << "Rows: " << count << endl;
            cout << "Columns: " << n << endl << "Weiter ";
        }
        db.Close();
        getch();
        fflush(stdin);
    }
     
    void write()
    {
        system("cls");
     
        char username[255], vorname[255], nachname[255];
        CString Vorname;
        CString Nachname;
        CString Username;
        CString ODBC;
     
        cout << "Username: ";
        cin >> username;
        cout << "Vorname: ";
        cin >> vorname;
        cout << "Nachname: ";
        cin >> nachname;
     
        Username.Format("%s",username);
        Vorname.Format("%s",vorname);
        Nachname.Format("%s",nachname);
     
        ODBC = "DRIVER={MySQL ODBC 3.51 Driver};PORT=3306;SERVER=127.0.0.1;DATABASE=sample;USER=root;PWD=";
     
        CString InsertString = "INSERT INTO user (username, vorname, nachname) VALUES ('" + Username + "', '" + Vorname + "', '" + Nachname + "')";
     
        CDatabase db;
        db.OpenEx(ODBC, CDatabase::noOdbcDialog); // Connection-Daten: DSN(MySQL), UID(root), PWD(test)
     
        db.ExecuteSQL( InsertString );
     
        db.Close();
    }
     
    void main()
    {
        int eingabe;
     
        do
        {
            system("cls");
            cout << "[1] Daten lesen" << endl;
            cout << "[2] Datensatz schreiben" << endl;
            cout << "[0] Ende" << endl;
            cout << "Auswahl: ";
            cin >> eingabe;
            fflush(stdin);
     
            switch(eingabe)
            {
            case 1:
                read();
                break;
            case 2:
                write();
                break;
            default:
                system("cls");
            }
        }
        while(eingabe != 0);
    }
    Erlaubt ein Webhoster externen Datenbankzugriff (Hostloco.de z.B.) dann kann man mit dem Programm auch darauf zugreifen. Man muss nur den Connection String ändern.


    Gruß Radhad
    PS: Ich entwickel gerade ein MFC Programm welches Daten sowohl aus MS Access als auch aus MySQL lesen kann. Dafür verwende ich auch oben stehende Code-Teile.
     
    Mein neues Projekt: zandman.de - Bericht über den Aufbau einer Entwicklungsumgebung für Test-Driven-Development mit phpUnderControl und dem Aufbau einer Webapplikation mit Zend Framework Version 1.9.x

  3. #3
    Cloudchaser Cloudchaser ist offline Mitglied
    Registriert seit
    Jan 2007
    Beiträge
    10
    Danke für den Code und den Link zu den ConnectionStrings.
    Ich werde das jetzt einfach mal ausprobieren. Auf jeden Fall ein wohl sehr gut funktionierendes Beispiel, wenn du es weiterentwickelst. Werde mir das 'Wie' anschauen und vlt finde ich ja Schwachstellen bei mir.

    Ich fände es trotzdem toll, wenn ich es ohne MFC machen könnte...wenn noch jmd eine Ahnung hat, was das Problem beim o.g. Code sein könnte - ich freue mich auch über Hinweise - es müssen nicht perfekte Lösungen sein.
     

  4. #4
    SuperSonik SuperSonik ist offline Mitglied Gold
    Registriert seit
    May 2004
    Ort
    Wassenberg (NRW)
    Beiträge
    120
    Hallo,
    muß es den mit den MFC sein ?
    In Qt kann ich dir das recht einfach erklären.....
    MFG,
    SuperSonik
    Geändert von SuperSonik (25.01.07 um 16:46 Uhr)
     

  5. #5
    SuperSonik SuperSonik ist offline Mitglied Gold
    Registriert seit
    May 2004
    Ort
    Wassenberg (NRW)
    Beiträge
    120
    Naja,
    ich beschreibe es mal vielleicht hilft es ja auch anderen ....

    Also neben allen anderen includes braucht man zunächst das include des Treibers.
    Die Treiber liefert Qt mit, für ODBC muß man natürlich den ODBC Connector von MySQL installiert haben und unter Systemsteuerung->Leistung und W..->Verwaltung->Datenquellen
    richtig eingerichtet haben.

    Code :
    1
    
    #include <C:\Qt\4.1.0\src\sql\drivers\odbc\qsql_odbc.h>

    Im Folgenden gehe ich immer davon aus, dass man die entsprechenden includes immer macht. (#include <QtSql/QSqlDatabase>,#include <QtSql/QODBCDriver>,#include <QtSql/QSqlQuery>, usw ...)

    Der restliche Code ist eigentlich recht einfach:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
                QString ip,dbname,username,passwort;
                ip ="123.123.123.123"; 
                dbname = "testdb";
                username = "mueller";
                passwort = "geheim";
                QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
                db.setHostName(ip);
                db.setDatabaseName(dbname);
                db.setUserName(username);
                db.setPassword(passwort);
                db.open();
                QSqlQuery query;
                query.prepare("INSERT INTO testable(s1, s2, s3, s4) "
                          "VALUES (:s1, :s2, :s3, :s4)");
                query.bindValue(":s1", wert1);
                query.bindValue(":s2", wert2);
                query.bindValue(":s3", wert3);
                query.bindValue(":s4", wert4);
                query.exec();

    INSERT usw. würde natürlich ähnlich funktionieren.
    Neben QSqlQuery gibts noch QSqlTableModel und ein paar andere Klassen bei denen man die SQL-Befehle nicht selber schreiben muß.
    Gruß,
    SuperSonik
     

  6. #6
    Cloudchaser Cloudchaser ist offline Mitglied
    Registriert seit
    Jan 2007
    Beiträge
    10
    Hört sich echt gut an...kann man so mitlesen.
    Problem: Qt gibts irgendwie nur für MingW-Compiler...ich würde aber gerne in Visual Studio verbleiben...
     

  7. #7
    SuperSonik SuperSonik ist offline Mitglied Gold
    Registriert seit
    May 2004
    Ort
    Wassenberg (NRW)
    Beiträge
    120
    Zitat Zitat von Cloudchaser Beitrag anzeigen
    Hört sich echt gut an...kann man so mitlesen.
    Problem: Qt gibts irgendwie nur für MingW-Compiler...ich würde aber gerne in Visual Studio verbleiben...
    Du kannst im Visual Studio bleiben. Du mußt nur make durch nmake ersetzen.
    Es gibt sogar ein Tool, dass dir direkt ein Visual Studio Projekt erzeugt. - Ich weiß im Moment aber nicht mehr wie's heißt. Da mußt Du mal in der Doku nachschauen.
    Ach, ja es gibt zwei Versionen von Qt einmal mit MinGW einmal ohne. Du brauchst die ohne.
    Gruß,
    Sonik
     

  8. #8
    Cloudchaser Cloudchaser ist offline Mitglied
    Registriert seit
    Jan 2007
    Beiträge
    10
    Okidoki...dann Danke für die Infos. _Noch_ funktioniert es nicht, aaaaber das wird sich ändern . Im Zweifelsfall gibts für den PC Schläge auf den Hinterkopf....
     

  9. #9
    Cloudchaser Cloudchaser ist offline Mitglied
    Registriert seit
    Jan 2007
    Beiträge
    10
    Howdy!
    Habe ein wenig weitergesucht und -probiert und alle Fehler ausmerzen können, bis auf einen neu aufgetauchten Fehler:

    Code :
    1
    
    LINK : fatal error LNK1104: Datei 'C:\Programme\MySQL\MySQL.obj' kann nicht geöffnet werden

    Ich habe die libmysql.lib beim Linker eingefügt bei den 'Befehlszeilen' unter den Projekteigenschaften in Visual C++ 2003 .NET eingefügt.Desweiteren habe ich unter den Konfigurationseigenschaften des Projektes in 'C/C++' die Laufzeitbibliothek auf 'Multithreaded (/MT)' umgestellt, was den Fehler von
    MySQL.obj konnte nicht gefunden werden auf obigen Fehler umgeändert hat (was ja in gewisser Weise schon ein Fortschritt ist - sie ist immerhin schon da ).

    [edit]Klappt ...er hat bei dem o.g. Fehler das Leerzeichen im "MySQL Server"-Ordner nicht verstehen und hat deswegen Mist gebaut....
    Geändert von Cloudchaser (30.01.07 um 18:13 Uhr)
     

  10. #10
    smathedark smathedark ist offline Mitglied Bronze
    Registriert seit
    May 2007
    Beiträge
    43
    Hallo,

    ich stehe jetzt an genau dem selben Punkt wie du. Auch bei mir kann er den mysql.obj file nicht öffnen. Du sagtest das es an den Leerzeichen im Ordnernamen liegt. Wenn ich dort die Leerzeichen entferne und dann die MySql-Konsole starte legt er aber automatisch wieder einen Ordner mit Leerzeichen im Namen an und das Problem bleibt das gleiche. Wie genau hast du das Problem gelöst?

    Gruß
     

  11. #11
    Cloudchaser Cloudchaser ist offline Mitglied
    Registriert seit
    Jan 2007
    Beiträge
    10
    Hi smathedark!

    Also ich schätze, dass du das Ganze dann nochmal neu (diesmal in den Ordner ohne Leerzeichen) installieren musst, da er dass wohl sonst irgendwo hinterlegt hat und einfach immer einsetzt, sollte es mal nicht so sein.

    Hoffe die Antwort erreicht dich noch

    Gruß

    Cloudchaser
     

Ähnliche Themen

  1. Antworten: 8
    Letzter Beitrag: 22.09.10, 11:11
  2. Antworten: 3
    Letzter Beitrag: 22.03.10, 13:18
  3. datenbankverbindung
    Von smista im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 12.02.07, 19:43
  4. Datenbankverbindung zu MySQL in XAMPP
    Von WIK-Lars im Forum Java
    Antworten: 1
    Letzter Beitrag: 11.02.07, 14:45
  5. MySQL Java Datenbankverbindung Fehler
    Von DayXtry im Forum Java
    Antworten: 12
    Letzter Beitrag: 02.12.05, 20:03