Visual C++ 6 mit MySql ohne ODBC?



  • Hallo zusammen,

    kann mir irgendjemand sagen, ob und wie ich ohne eine ODBC-Schnittstelle eine Verbindung zu einer MySql-Datenbank aufbauen kann? Die verwendete Sprache/Umgebung ist Visual C++ 6. Da das Programm äußerst portabel sein muss, muss ich leider auf eine ODBC-Schnittstelle verzichten, was die Sache natürlich etwas einfacher machen würde.

    Ich habe nun stundenlang gegoogelt und Foren abgegrast, leider scheinen sich an dem Thema schon mehrere die Zähne ausgebissen zu haben... Deshalb wäre ich sehr dankbar, wenn irgendjemand von euch das schon einmal hinbekommen hat und mir einen Tipp oder zumindest eine Richtung/Stichwort geben könnte. Danke!

    Viele Grüße,
    Robert

    Ergänzung:

    Das allgemeingültige Beispiel (http://www.c-plusplus.net/forum/viewtopic.php?t=39524) aus den FAQ funktioniert leider nicht, da bekomme ich diese Fehlermeldungen:

    Kompilierung läuft...
    MySqlTestDlg.cpp
    C:\Code\MySqlTest\MySqlTestDlg.cpp(180) : warning C4101: 'mRecord' : Unreferenzierte lokale Variable
    C:\Code\MySqlTest\MySqlTestDlg.cpp(182) : warning C4101: 'mError' : Unreferenzierte lokale Variable
    C:\Code\MySqlTest\MySqlTestDlg.cpp(179) : warning C4101: 'mTabelle' : Unreferenzierte lokale Variable
    Linker-Vorgang läuft...
    MySqlTestDlg.obj : error LNK2001: Nichtaufgeloestes externes Symbol _mysql_close@4
    MySqlTestDlg.obj : error LNK2001: Nichtaufgeloestes externes Symbol _mysql_error@4
    MySqlTestDlg.obj : error LNK2001: Nichtaufgeloestes externes Symbol _mysql_real_connect@32
    MySqlTestDlg.obj : error LNK2001: Nichtaufgeloestes externes Symbol _mysql_init@4
    Debug/MySqlTest.exe : fatal error LNK1120: 4 unaufgeloeste externe Verweise
    Fehler beim Ausführen von link.exe.

    MySqlTest.exe - 5 Fehler, 3 Warnung(en)



  • Ich hab's jetzt hinbekommen! Hier nochmal eine Zusammenfassung für alle, die vor dem gleichen Problem stehen:

    - MySQL installieren
    - neues Projekt, MFC-Anwendung
    - jetzt ganz wichtig:
    - unter Projekteinstellungen/Linker/Eingabe:

    Objekt-/Bibliothek-Module: libmysql.lib
    Zusätzlicher Bibliothekspfad: C:\Program Files (x86)\MySQL\MySQL Server 5.5\lib

    - unter C/C++/Präprozessor:

    Zusätzliche Include-Verzeichnisse: C:\Program Files (x86)\MySQL\MySQL Server 5.5\include

    (Den Pfad müsst ihr natürlich anpassen, ich hab' hier ein Windows 7 64bit)

    Dann habe ich nur noch einen Button hinzugefügt und eine Funktion, dann hat es funktioniert. Hier ist mal mein Quelltext:

    // MySqlTestDlg.cpp : Implementierungsdatei
    //
    
    #include "stdafx.h"
    #include "MySqlTest.h"
    #include "MySqlTestDlg.h"
    #include <mysql.h>
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    // CAboutDlg-Dialogfeld für Anwendungsbefehl "Info"
    
    class CAboutDlg : public CDialog
    {
    public:
    	CAboutDlg();
    
    // Dialogfelddaten
    	//{{AFX_DATA(CAboutDlg)
    	enum { IDD = IDD_ABOUTBOX };
    	//}}AFX_DATA
    
    	// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
    	//{{AFX_VIRTUAL(CAboutDlg)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV-Unterstützung
    	//}}AFX_VIRTUAL
    
    // Implementierung
    protected:
    	//{{AFX_MSG(CAboutDlg)
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    
    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    	//{{AFX_DATA_INIT(CAboutDlg)
    	//}}AFX_DATA_INIT
    }
    
    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CAboutDlg)
    	//}}AFX_DATA_MAP
    }
    
    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    	//{{AFX_MSG_MAP(CAboutDlg)
    		// Keine Nachrichten-Handler
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // CMySqlTestDlg Dialogfeld
    
    CMySqlTestDlg::CMySqlTestDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CMySqlTestDlg::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(CMySqlTestDlg)
    		// HINWEIS: Der Klassenassistent fügt hier Member-Initialisierung ein
    	//}}AFX_DATA_INIT
    	// Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CMySqlTestDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CMySqlTestDlg)
    		// HINWEIS: Der Klassenassistent fügt an dieser Stelle DDX- und DDV-Aufrufe ein
    	//}}AFX_DATA_MAP
    }
    
    BEGIN_MESSAGE_MAP(CMySqlTestDlg, CDialog)
    	//{{AFX_MSG_MAP(CMySqlTestDlg)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_BN_CLICKED(IDC_TEST, OnTest)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // CMySqlTestDlg Nachrichten-Handler
    
    BOOL CMySqlTestDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
    
    	// IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden.
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		CString strAboutMenu;
    		strAboutMenu.LoadString(IDS_ABOUTBOX);
    		if (!strAboutMenu.IsEmpty())
    		{	
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
    	//  wenn das Hauptfenster der Anwendung kein Dialogfeld ist
    	SetIcon(m_hIcon, TRUE);			// Großes Symbol verwenden
    	SetIcon(m_hIcon, FALSE);		// Kleines Symbol verwenden
    
    	// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    
    	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    
    void CMySqlTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialog::OnSysCommand(nID, lParam);
    	}
    }
    
    // Wollen Sie Ihrem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie 
    //  den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das 
    //  Dokument/Ansicht-Modell verwenden, wird dies automatisch für Sie erledigt.
    
    void CMySqlTestDlg::OnPaint() 
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // Gerätekontext für Zeichnen
    
    		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
    
    		// Symbol in Client-Rechteck zentrieren
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Symbol zeichnen
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    }
    
    // Die Systemaufrufe fragen den Cursorform ab, die angezeigt werden soll, während der Benutzer
    //  das zum Symbol verkleinerte Fenster mit der Maus zieht.
    HCURSOR CMySqlTestDlg::OnQueryDragIcon()
    {
    	return (HCURSOR) m_hIcon;
    }
    
    void CMySqlTestDlg::OnTest() 
    {
        MYSQL_RES *mTabelle;
        MYSQL_ROW mRecord;
        MYSQL *mConnection, mDB;
        int mError;
        mysql_init(&mDB);
        mConnection = mysql_real_connect(&mDB,"localhost","root","passwort","test",0,0,0);
        if (mConnection == NULL)  
    	{
            MessageBox("Es konnte keine Verbindung zur Datenbank hergestellt werden!");
            return;
        } 
    	else 
    	{
    		MessageBox("Es wurde erfolgreich eine Verbindung hergestellt!");
        }
        mysql_close(mConnection); 	
    }
    

    Dieser Code funktioniert bei mir ohne Linkerfehler. Ich lege das Projekt mal auf meinen Webspace: www.robert-klerx.de/MySqlTest.zip

    Viel Spaß damit! :xmas1:


Anmelden zum Antworten