概要
最近在做一个项目,在GNSS定位程序中添加一个功能,把输出的定位结果(时间、坐标等)存入数据库,从而可以实时在地图中显示。遇到了一些问题,所以总结记录一下。
主要遇到两个比较少见的问题,1、dll文件找不到;2、Winsock2.h编译报错重定义冲突(这篇写太多了,下一篇写)
整体流程
首先,先下载安装mysql,网上都有很多教程了,就不展开讲了,可以参照大佬们的教程(超详细MySQL安装教程和基本使用教程(自定义安装))。
直接在官网下载mysql官网,建议不要用太新版本的,不稳定,和大佬教程一样,用的8.0.22.
下载完了根据大佬的教程安装就可以了。
安装完了之后,打开MySQL Workbench,连接本机的数据库。也可以用命令行(自己学一些mysql语句MySQL语句详解(最详细))。
跟安装时设置的端口一样,然后ok就行。
然后新建一个数据库,点击红框标出的按钮。
输入名字,点击apply就行了。
在左边可以查看数据库里的东西,在Tables里面,右键点击Table,可以新建一个表格。设置表格名字,有哪些项目,并定义其数据类型,是整型就是INT,浮点型用FLOAT或者DOUBLE,字符串就用VERCHAR,看着定义吧。PK是关键字。这是做好的表格,并插入了一些数据。
做完上面的测试之后,就可以在vs中引用了,我用的是vs19,这个版本应该是没有太大的影响。
如何引用也可以直接参照大佬们的教程C++中使用MySQL数据库,很详细,就不多说了。
遇到的一个问题就是dll文件未找到。
这时候需要把mysql安装目录中 lib文件夹下的libmysql.dll复制到项目的工作目录中。如果没有工作目录为空,就复制到解决方案所在目录下。(我这里是空的)
然后就可以在vs中测试连接数据库了。
需要引入一些库:
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include "mysql.h"
using namespace std;
然后先定义并初始化数据库对象,并连接数据库:
MYSQL mysql;
mysql_init(&mysql);
//连接的数据库(句柄、主机名、用户名、密码、数据库名、端口号、socket指针、标记)
if (!mysql_real_connect(&mysql, "zhangsan", "zhangsan", "123456", "databases", 3306, nullptr, 0))
{
cout << "数据库连接失败" << mysql_errno(&mysql) << endl;
}
else
cout << "数据库连接成功" << endl << endl;
可以向已经建好的表插入数据(注意输入的sql1需要是char类型,所以只需要把string的mysql语句转化成char类型就行,sql语句要规范):
stringstream ss;
double time = 245456;
double X = 454611.544;
double Y = 464698441.554;
double Z = -5845441.544545;
int NSAT = 25;
string AMB = "float";
ss <<fixed<<setprecision(4)<< "insert into crd_output(time, X, Y, Z, NSAT, AMB) values(" << time << ", '" << X << "', '" << Y << "', '" << Z << "', '" << NSAT << "', '" << AMB << "');";
string str = ss.str();
const char* sql1 = str.c_str();
///< 调用查询接口
if (mysql_query(&mysql, sql1))
{
cout << "插入失败" << ": " << mysql_errno(&mysql) << endl;
}
else
{
cout << "插入成功" << endl << endl;
}
插入后,可以查看表中的数据:
MYSQL_RES* res = nullptr;
MYSQL_ROW row;
string str_sql;
str_sql = "select * from crd_output";
const char* sql = str_sql.c_str();
///< 调用查询接口
if (mysql_real_query(&mysql, sql, (unsigned int)strlen(sql)))
{
cout << "查询失败" << ": " << mysql_errno(&mysql) << endl;
}
else
{
cout << "查询成功" << endl << endl;
///< 装载结果集
res = mysql_store_result(&mysql);
if (nullptr == res)
{
cout << "装载数据失败" << ": " << mysql_errno(&mysql) << endl;
}
else
{
///< 取出结果集中内容
while (row = mysql_fetch_row(res))
{
cout << row[0] << " " << row[1] << " " << row[2] << " " << row[3] << " " << row[4] << " " << row[5] << endl;
}
}
}
最后,清除数据,断开数据库连接:
mysql_free_result(res);
// 关闭数据库连接
mysql_close(&mysql);
引用的博客
若涉及侵权,请联系我删除。
1、超详细MySQL安装教程和基本使用教程(自定义安装)
https://blog.youkuaiyun.com/Kc635908933/article/details/111715585
2、C++中使用MySQL数据库
https://blog.youkuaiyun.com/weixin_43450564/article/details/115537977
3、MySQL语句详解(最详细)
https://blog.youkuaiyun.com/qq_44944641/article/details/116840432