C ++ Mysql ++, всегда не удается подключиться! - PullRequest
0 голосов
/ 22 декабря 2008

шагов:
- Установлен 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");

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

Справка: (

Ответы [ 2 ]

2 голосов
/ 05 января 2009

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

mysqlpp::Connection* conn;

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

mysqlpp::Connection conn;

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

Правило 4:

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

* Constructor
* Copy Constructor
* Assignment Operator
* Destructor

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

0 голосов
/ 05 января 2009

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

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 () в конструктор (), вы можете сделать объект всегда действительным.

...