функции соединителя mysql C не работают при определении в классе

#c #mysql #c 11

#c #mysql #c 11

Вопрос:

Я пытался реализовать функции в mysql c-connector из класса «Server» в моем проекте. Вот как выглядит конструктор класса: (БАЗА ДАННЫХ и СОКЕТ определены #).

 Server::Server(MYSQLamp; conn)
{
    mysql_init(amp;conn);
    mysql_real_connect(amp;conn,"localhost","username","passwd",DATABASE,0,SOCKET,0);
    if (mysql_real_connect(amp;conn,"localhost","santu","hello",DATABASE,0,SOCKET,0) == NULL) {
        cout << mysql_error(amp;conn) << endl;
    }
    else
    {
        cout << "Connected." << endl;
    }
}
 

Когда я пытаюсь вызвать класс из «main.cpp » с дескриптором соединения это вызывает ошибку.

 Cannot connect twice. Already connected.
 

но если методы были написаны вне класса, он работает безупречно. В принципе, это работает.

 #include "Server.hxx"

MYSQL san;

int main(int argc, char** argv)
{
    mysql_init(amp;san);
    mysql_real_connect(amp;san,"localhost","santu","hello", "test",0,"/tmp/mysql.sock",0);
    cout << mysql_error(amp;san) << endl;
    return 0;
}
 

Но этого не происходит, и происходит сбой с вышеупомянутой ошибкой.

 #include "Server.hxx"

MYSQL san;

int main(int argc, char** argv)
{
    Server S0(san);
    return 0;
}
 

Ответ №1:

В определении функции вашего класса вы вызываете mysql_real_connect дважды:

 mysql_real_connect(amp;conn,"localhost","username","passwd",DATABASE,0,SOCKET,0);
if (mysql_real_connect(amp;conn,"localhost","santu","hello",DATABASE,0,SOCKET,0) == NULL) {
 

Просто удалите первую строку, и все будет работать нормально.

Комментарии:

1. Но почему он не может игнорировать второе соединение? ранее я не мог выполнить mysql_close (amp;san). это дало мне ошибку шины. Не могли бы вы, пожалуйста, объяснить это?

2. @Vasanth трудно сказать, не глядя на внутренности кода MySQL API, но я думаю, что это просто не так, как разработан интерфейс.