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,
RobertErgä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: