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