【问题标题】:How to init MYSQL correctly如何正确初始化MYSQL
【发布时间】:2022-01-01 14:37:31
【问题描述】:

我写了一个服务器使用cpp连接mysqllibmysqlclient.a,代码是这样的:

#ifndef __IVC_MYSQLAPI_H__
#define __IVC_MYSQLAPI_H__

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <mysql.h>
#include <string.h>
#include <vector>

using namespace std;

class ConnMysql {
public:
    ConnMysql();
    ~ConnMysql();
    int connInit(const char* host,int port,const char* user,const char* password,const char* database);
    int executeSql(const char* sql, std::vector<std::string> &v);
    void close();

private:
    MYSQL *sock;
    MYSQL  *my_sql;
};

ConnMysql::ConnMysql(){

}

ConnMysql::~ConnMysql(){

}

int ConnMysql::connInit(const char* host,int port,const char* user,const char* password,const char* database){
    my_sql = mysql_init(NULL);
    if (my_sql == NULL) {
        fprintf(stderr, "Init failed\n");
        return -1;
    }

    sock = mysql_real_connect(my_sql, host,
                user, password, database, port, NULL, CLIENT_MULTI_STATEMENTS);
    
    if (sock < 0) {
        return -1;
    }
}

int ConnMysql::executeSql(const char* sql, std::vector<std::string> &v) {
    mysql_query(sock, sql);
    MYSQL_RES *res_ptr;
    res_ptr = mysql_store_result(sock);
    if(res_ptr == nullptr) {   
        printf("Get data from mysql failed\n");            
        return -1;
    }  
    MYSQL_ROW sqlrow;
    int j = mysql_num_fields(res_ptr);          
    while((sqlrow = mysql_fetch_row(res_ptr))) {
        v.push_back(std::string(sqlrow[0]));
    }

    return 0;
}

void ConnMysql::close() {
    mysql_close(sock);
    sock=NULL;
    my_sql = NULL;
}

#endif //__IVC_MYSQLAPI_H__

这样调用的方法:

ConnMysql connsql = ConnMysql{};
fprintf(stderr, "begin to init\n");
if (connsql.connInit(ip, port, username, pwd, database) < 0) {
    fprintf(stderr, "mysql init return failed\n");
    return -1;
}

std::string sql = "select env_code from env_codes where env_type = 1";
connsql.executeSql(sql.c_str(), v);
for (int len=0; len < v.size(); len++) {
    fprintf(stderr, "get: %s\n", v[len].c_str());
}
connsql.close();

我偶尔会收到诸如Init failed 之类的错误,但并非总是如此。我的问题是

  1. 我的代码有问题吗?忘记发布什么?
  2. 如何获取mysql初始化失败的原因?

【问题讨论】:

  • 尝试检查mysql错误代码

标签: c++ mysql mysql-connector


【解决方案1】:

我改成这样mysql_real_connect

if(mysql_real_connect(my_sql, host,
                user, password, database, port, NULL, CLIENT_MULTI_STATEMENTS) == NULL) 
{
    return -1;
}

并删除MYSQL *sock参数,将sock改为my_sql,如mysql_query(sock, sql)改为mysql_query(my_sql, sql)。看起来可行。

【讨论】:

    猜你喜欢
    • 2010-11-11
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 2021-02-25
    • 2014-04-03
    相关资源
    最近更新 更多