0

步骤:
- 安装 Mysql Server 2005
- 下载 Mysql++,构建调试版和发布版。
- 运行 install.hta 并选择一个目录
- 在 MSVC++ 2008 中添加库/包含目录
- 在我的应用程序中包含 mysql++.h
- 将 .dll 文件(libMYSQL.dll 和 mysqlpp.dll 和 mysqlpp_d.dll)移动到 Debug 文件夹。

相关代码:

#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 管理员完全相同的凭据并正确登录。

帮助 :(

4

2 回答 2

2

我不会做这个指针:

mysqlpp::Connection* conn;

只需使其成为班级的普通成员即可。

mysqlpp::Connection conn;

这有几个优点。
但对你来说最重要的是你会避免浅拷贝问题。

规则 4:

如果对象是 RAW 指针的所有者,则需要定义以下 4 个成员以确保正确处理内存管理:

* Constructor
* Copy Constructor
* Assignment Operator
* Destructor

这是因为如果您不定义它们,编译器会自动为您生成上述方法。在大多数情况下,这些方法都有效,但如果您的对象包含您拥有的 RAW 指针(即删除它),那么编译器生成的这些方法的版本将出现严重错误。

于 2009-01-05T18:45:52.803 回答
0

我也会使用字符串而不是 char 指针:

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() 移动到 constructor(),您可以使对象始终有效。

于 2009-01-05T18:55:33.970 回答