c++ 連接mysql_C++ 连接MySql

官方文档

机器配置

机器环境:mac 10.14

mysql版本:8.0.4-rc,自行编译,编译步骤

mysql 存放路径:/Users/shiyibo/LNMP/mysql

IDE: CLion

目录划分:

| - main.cpp

| - myDb.h

| - MyDb.cpp

代码

/**

* file MyDb.h

*

* Created by shiyibo on 2018/12/21.

*/

#ifndef DB_MYDB_H

#define DB_MYDB_H

#include

#include "/Users/shiyibo/LNMP/mysql/include/mysql.h"

using namespace std;

class MyDb {

public:

MyDb();

~MyDb();

/**

* 连接mysql

*

* @param host

* @param user

* @param pwd

* @param db_name

* @param port

* @return

*/

bool initDB(string host, string user,string pwd,string db_name, int port);

/**

* 执行sql语句

*

* @param sql

* @return

*/

bool exeSQL(string sql);

private:

/**

* 连接mysql句柄指针

*/

MYSQL *mysql;

/**

* 指向查询结果的指针

*/

MYSQL_RES *result;

/**

* 按行返回的查询信息

*/

MYSQL_ROW row;

};

#endif //DB_MYDB_H

/**

* file MyDb.cpp

* Created by shiyibo on 2018/12/21.

*/

#include

#include

#include "MyDb.h"

using namespace std;

/**

* 初始化数据库连接变量

*/

MyDb::MyDb()

{

mysql = mysql_init(NULL);

if(!mysql) {

cout<

exit(1);

}

}

/**

* 释放资源

*/

MyDb::~MyDb()

{

if(mysql) {

mysql_close(mysql);

}

}

/**

*

* @param host

* @param user

* @param passwd

* @param db_name

* @oaram port

* @return

*/

bool MyDb::initDB(std::string host, std::string user, std::string passwd, std::string db_name, int port = 3306)

{

mysql = mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), port, NULL, 0);

if(!mysql) {

cout << "Error: " << mysql_error(mysql);

exit(1);

}

return true;

}

/**

* 执行sql 语句

* @param sql

* @return

*/

bool MyDb::exeSQL(std::string sql)

{

//mysql_query()执行成功返回0,执行失败返回非0值。

if (mysql_query(mysql,sql.c_str())) {

cout<

return false;

}

result = mysql_store_result(mysql);

if (result) {

//获取结果集中总共的字段数,即列数

int num_fields = mysql_num_fields(result);

unsigned long long num_rows = mysql_num_rows(result);

for(unsigned long long i = 0; i < num_rows; i++) {

row = mysql_fetch_row(result);

if(!row) {

break;

}

for(int j=0;j

cout<

}

cout<

}

} else {

//代表执行的是update,insert,delete类的非查询语句

if (mysql_field_count(mysql) == 0) {

// 返回update,insert,delete影响的行数

unsigned long long num_rows = mysql_affected_rows(mysql);

return num_rows;

} else {

cout << "Get result error: " << mysql_error(mysql);

return false;

}

}

return true;

}

#include

#include "MyDb.h"

int main() {

// std::cout << "Hello, World!" << std::endl;

MyDb db;

string host = "127.0.0.1";

string user = "root";

string passwd = "password";

string dbName = "test";

int port = 3307;

cout<

//连接数据库

bool conn = db.initDB(host, user, passwd, dbName, port);

if (!conn) {

cout<

}

cout<

//将用户信息添加到数据库

string sql = "INSERT account values(1, 'fengxin');";

db.exeSQL(sql);

sql = "INSERT account values(2, 'axin');";

db.exeSQL(sql);

//将所有用户信息读出,并输出。

sql = "SELECT * from account;";

db.exeSQL(sql);

return 0;

}

编译

g++ main.cpp MyDB.cpp -o main `mysql_config --cflags --libs`

运行

5bb806c09b1c

image.png

数据表

CREATE TABLE `account` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`name` varchar(25) NOT NULL DEFAULT '',

PRIMARY KEY (`id`)

)

5bb806c09b1c

image.png

问题

运行时遇到如下报错

./main

dyld: Library not loaded: @rpath/libmysqlclient.21.dylib

Referenced from: /Users/shiyibo/CLionProjects/db/./main

Reason: image not found

Abort trap: 6

解决方案:

方案1,来源

1、关闭csrutil

2、找到mysql安装路径,建立软连接

sudo ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib /usr/lib/libmysqlclient.21.dylib

效果: 原意是,建立一个从/usr/lib/libmysqlclient.21.dylib到/usr/local/mysql/lib/libmysqlclient.21.dylib的软连;

环境中编译的地址为 /Users/shiyibo/LNMP/mysql,默认的按照路径/usr/local/mysql/lib/libmysqlclient.21.dylib中没有这个目录;

换成了

sudo ln -s /Users/shiyibo/LNMP/mysql/lib/libmysqlclient.21.dylib /usr/lib/libmysqlclient21.dylib,重试,不管用;

方案2,来源

sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib/usr/lib/libmysqlclient.18.dylib

export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/usr/local/mysql/lib/"

使用第二种方案,可以成功编译,当然,路径也得换为/Users/shiyibo/LNMP/mysql/lib

最后

好多年不写C系列,代码丑陋,生疏,敬请谅解!

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值