Błąd programu podczas połączenia z mysql (connector/c++)

0

Witam, niedawno zacząłem pisać program w Dev-cpp 5.11, który ma łączyć się z bazą danych MySQL.

Korzystam z bibliotek Connector/C++ pobranych ze strony dev.mysql.com. Dodatkowo musiałem dołożyć pliki "Boost". Po nierównej walce z wersjami i kompatybilnością udało się poprawnie skompilować program. Niestety Zaraz po uruchomieniu podczas wykonywania

 driver = get_driver_instance();

program się zawiesza a pomocny windows 10 proponuje debug albo zamknięcie programu. ("Process exited after 1.923 seconds with return value 3221225477")

Udało mi się wyczytać ze wartość 3221225477 = 0xC0000005 = STATUS_ACCESS_VIOLATION. (O jakie naruszenie zasad chodzi?)

Poniżej zamieszczam kod źródłowy banalnego programu:

 #include <stdlib.h>
#include <iostream>
#include <cstdio>
#include <string>

#include "mysql_connection.h"

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>

#include "coma_class.h"

using namespace std;

void send_log(string log){
	cout << "[Comatose] " + log << endl;
}

int main(int argc, char** argv) {
	send_log("Opening connection...");
	try {
		sql::Driver *driver;
  		sql::Connection *con;
  		sql::Statement *stmt;
  		sql::ResultSet *res;
		send_log("Opening database connection...");
		driver = get_driver_instance();
  		con = driver->connect("tcp://127.0.0.1:3306", "root", ""); // nazwa uzytkownika sie zgadza, bez hasla server mysql lokalnie dziala
  		con->setSchema("comatose"); // nie wplywa na blad (probowalem ukryc zeby sprawdzic)
  		stmt = con->createStatement(); // to tez nie
		delete res;
		delete stmt;
		delete con;
	} catch (sql::SQLException &e) {
  		cout << "# ERR: SQLException in " << __FILE__;
  		cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
  		cout << "# ERR: " << e.what();
  		cout << " (MySQL error code: " << e.getErrorCode();
  		cout << ", SQLState: " << e.getSQLState() << " )" << endl;
	}
	
	string command_line = "";
	while(1){
		cout << "SERVER@ROOT> ";
		getline(cin, command_line);
		
		if(command_line == "exit"){
			return 0;
		} else {
		    cout << "Unknown command." << endl;
		    command_line = "";
        }
	}
	return 0;
}

Kod mysql-a wzięty z przykładu z ich strony. https://dev.mysql.com/doc/connector-cpp/en/connector-cpp-examples-complete-example-1.html

Wiecie może dlaczego tak się dzieje mimo poprawnej kompilacji i jak to naprawić? Jeśli potrzeba dodatkowych informacji/screenow to piszcie a dodam :)

1

Może będzie pomocne:
http://stackoverflow.com/questions/17980387/connection-crash-in-mysql-c;
https://dev.mysql.com/doc/connector-cpp/en/connector-cpp-bugs.html - patrz ostatni podpunkt;
czyli zamiast debug spróbuj release lub na odwrót.

0

Próbowałem już różnych sposobów kompilacji (znalazłem tą stronę wcześniej) niestety bezskutecznie :/
http://stackoverflow.com/questions/14570347/mysql-connector-c-bad-access-crash w tym linku jest coś ciekawego i zaraz to wypróbuje, nie wiem czemu wcześniej tego nie widziałem

Btw, crash występuje nawet gdy wszystkie linie kodu MySQL są ukryte a zostaje samo odwołanie do plików naglowkowych MySQL :o

1

Witam, problemem były niekompatybilne biblioteki z dev c++. Nie udało mi się skompilować bibliotek pod deva dlatego postanowiłem spróbować w Microsoft Visual Studio 2010 Express.
Z racji mojej jeszcze małej wiedzy o c++ a zwłaszcza o środowisku Ms VS c++, zajęło mi to troche czasu. Poniżej przedstawiam moj miniprogram, może komuś się ta wiedza przyda :)

  1. Potrzebujemy kompletny mysql-connector-cpp-2.0, który można pobrać ze strony dev.mysql.com
  2. Biblioteki mysql wymagają plików BOOST więc je tez pobieramy (ja pobrałem boost_1_62_0)
  3. Tworzymy Nowy projekt (File->New->Project)
  4. W oknie kreatora wybieramy: Visual C++ -> Win32 -> Win32 Console Application
  5. Podajemy nazwę i przechodzimy dalej
  6. Pojawia nam się okienko "Win32 Application Wizard - nasza_nazwa_projektu". Tutaj wchodzimy w "Application Settings"
    6a. Jeśli nie jest wybrane, wybieramy "Application Type": "Console Application"
    6b. Jeśli nie jest zaznaczone, zaznaczamy checkbox "Prekompiled header" po czym klikamy "Finish" button aby zakonczyc proces tworzenia
  7. Twraz pozostałe ustawienia, otwieramy ustawienia projektu: Project -> Properties
  8. Configuration Properties -> C/C++ -> General -> Additional Include Directories - i tutaj dodajemy ścieżkę do folderu ../mysql/include oraz do głównego folderu boost (tylko nie do tego wewnętrznego bo tam tez jest boost folder)
  9. Configuration Properties -> C/C++ -> Preprocessor -> Preprocessor Definitions - tutaj dopisujemy "CPPCONN_PUBLIC_FUNC=" oraz "HAVE_INT8_T=1"
  10. Configuration Properties -> Linker -> General -> Additional Libary Directions - tutaj dodajemy sciezke do folderu "lib\opt" z folderu MySQL Connector/c++ oraz sciezke folderu "libs" z folderu boost.
  11. Zamieszczamy bibliotekę DLL "mysqlcppconn.dll" zaraz obok programu wykonywalnego lub w glownym folderze systemowym aby program miał do niej dostęp.
  12. Podobno zalecane jest ustawienie Solution Configuration na "Relase", nie "Debug" aczkolwiek mi ten mini programik zadziałał w obu przypadkach, nie wiem jak z bardziej skomplikowanym kodem.

Po takim przygotowaniu programu powinniśmy uzyskać dostęp do funkcji mysql Connector c++.

Mój program:

#include "stdafx.h"
#include <iostream>
#include <cstdio>

// MySQL Connector Headers
#include <mysql_connection.h>

#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
// end of MySQL Connector Headers

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	cout << "Opening program" << endl;
	
	try {
  sql::Driver *driver;
  sql::Connection *con;
  sql::Statement *stmt;
  sql::ResultSet *res;

  cout << "Opening drivers for mysql connection..." << endl;
  driver = get_driver_instance();
  cout << "Opening mysql connection..." << endl;
  con = driver->connect("tcp://127.0.0.1:3306", "uzytkownik", "haslo"); // u siebie wpiszcie oczywiście prawdziwe dane :)
  cout << "Opening database..." << endl;
  con->setSchema("comatose");

  stmt = con->createStatement();
  cout << "Opening `users` table..." << endl;
  res = stmt->executeQuery("SELECT * FROM `users` WHERE 1");
  while (res->next()) {
	  cout << "\t #" << res->getString("id") << " " << res->getString("nick") << endl;
  }
  delete res;
  delete stmt;
  delete con;

} catch (sql::SQLException &e) {
  cout << "# ERR: SQLException in " << __FILE__;
  cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
  cout << "# ERR: " << e.what();
  cout << " (MySQL error code: " << e.getErrorCode();
  cout << ", SQLState: " << e.getSQLState() << " )" << endl;
}


	char x;
	cin >> x;
	return 0;
}

Rezultat:
Untitled3.png
Do tej pory bez crashu :)

P.S. Dziękuję za nakierowanie mnie i ogólnie za chęć pomocy :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1