C++ Mysql++, всегда не удается подключиться!

Шаги:
- Установлен Mysql Server 2005
- Скачал Mysql++, собрал как отладочную, так и выпускную версию.
- Запустил install.hta и выбрал каталог
- Добавлена ​​библиотека / включить каталог в MSVC++ 2008
- Включен MySQL ++. Ч в моем приложении
- Перемещены файлы.dll (libMYSQL.dll, mysqlpp.dll и mysqlpp_d.dll) в папку "Отладка".

Соответствующий код:

#include "mysql++.h"

class Database {

private:

    mysqlpp::Connection* conn;

public:

    ~Database();
    bool Connect(char* ip, char* user, char* pass, char* db);

};

bool Database::Connect(char* ip, char* user, char* pass, char* db) {
    conn = new mysqlpp::Connection(false);
    return conn->connect(db, ip, user, pass);
}

Database::~Database() {
    if(conn) {
        delete[] conn;
    }
}

Проблема:

Database db;
db.Connect("127.0.0.1", "root", "mypassword", "mydb");

Это всегда будет возвращаться к ложному, даже если я использую те же учетные данные с MySQL Administrator и вход в систему правильно.

Помогите:(

2 ответа

Я бы не сделал этот указатель:

mysqlpp::Connection* conn;

Просто сделайте это нормальным членом класса.

mysqlpp::Connection conn;

Это имеет несколько преимуществ.
Но самое важное для вас - это то, что вы избежите проблемы мелкого копирования.

Правило 4:

Если объект является владельцем указателя RAW, вам необходимо определить следующие 4 члена, чтобы убедиться, что вы правильно обрабатываете управление памятью:

* Constructor
* Copy Constructor
* Assignment Operator
* Destructor

Это потому, что если вы не определите их, компилятор автоматически сгенерирует для вас вышеуказанные методы. В большинстве случаев это работает, но если ваш объект содержит RAW-указатель, которым вы владеете (то есть вы его удаляете), то все пойдет не так с созданной компилятором версией этих методов.

Также я бы использовал строки, а не указатели на символы:

bool Database::Connect(char* ip, char* user, char* pass, char* db)

Пытаться:

Database::Database(std::string const& ip,
                   std::string const& user,
                   std::string const& pass,
                   std::string const& db)

Обратите внимание, что, переместив код из метода Connect() в конструктор (), вы можете сделать объект всегда действительным.

Другие вопросы по тегам