使用到的软件:
编译器:Visual Studio 2019
数据库软件:MySQL 8.0
第一步:打开MySQL的安装目录,默认的安装路径为:C:\Program Files\MySQL\MySQL Server 8.0,查看其中是否有lib和inclass="superseo">clude目录,如果没有可能是安装不完全,建议重新安装MySQL。
第二步:使用VS2019创建一个新的工程,右击工程名,点击属性,
点击C/C++目录下的常规,将include目录复制粘贴至附加包含目录下。(VS2015之后可能会出现刚创建的项目中没有C/C++选项,这时只要写一些代码编译一下就会出现)
点击链接器下的常规,将lib目录粘贴至附加库目录下。
点击链接器下的输入,在附加依赖项添加libmysql.lib。
点击配置下的高级,将bin文件夹目录复制到环境下(注意在前面加上PATH=,以及最后的分号是英文符号)。最后点击应用。
然后将lib目录下的libmysql.ddl文件复制到与项目工程源文件相同的目录下
最后将项目的运行平台修改为×64。
至此在VS2019中使用C++访问MySQL数据库的环境配置结束。
2.对数据库的增删改查 *** 作 1.对数据库的查询 *** 作1.1查询全部数据并输出
mysql_store_result()函数可以将查询到的全部结果读取到客户端,然后可以调用mysql_fetch_row()来获取结果集中的行,需要注意的是,一旦完成了对结果集的 *** 作,就必须调用mysql_free_result()来释放结果集。
#include // mysql文件
#include
#include
#include
using namespace std;
MYSQL mysql; //数据库句柄
MYSQL_RES* res; //查询结果集
MYSQL_ROW row; //记录结构体
//查询全部数据并输出
void display()
{
//查询数据
int ret = mysql_query(&mysql, "select * from student;");
//获取结果集
res = mysql_store_result(&mysql);
cout << "ID " << "name " << "age " << "score" << endl;
//给ROW赋值,判断ROW是否为空,不为空就打印数据。
while (row = mysql_fetch_row(res))
{
cout << row[0] << " ";//打印ID
cout << row[1] << " ";//打印name
cout << row[2] << " ";//打印age
cout << row[3] << endl;//打印score
}
//释放结果集
mysql_free_result(res);
//关闭数据库
mysql_close(&mysql);
}
int main()
{
//初始化数据库
mysql_init(&mysql);
//设置字符编码
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");
//连接数据库
if (mysql_real_connect(&mysql, "localhost", "root", "root", "student", 3306, NULL, 0) == NULL)
//localhost为服务器,root为用户名和密码,school为数据库名,3306为端口
{
printf("错误原因: %s\n", mysql_error(&mysql));
printf("连接失败!\n");
exit(-1);
}
display();
//关闭数据库
mysql_close(&mysql);
return 0;
}
1.2查询指定数据并将mysql_fetch_row返回的字段中int或float的字段赋值给int或float类型的变量
由于mysql_row指针返回的是字符串数组,所有类型的数据都是作为字符串返回给客户端的,所有我们可以利用atoi()和stof()函数来实现将mysql_row中的字符串转化为对应的整型和浮点型的值。
//查询特定数据
void select(int& ID, char str[], int& age, float& score)
{
char str1[64] = "SELECT * FROM student WHERE NAME='";
char str2[2] = "'";
char buffer[1024];//缓冲区数组
sprintf_s(buffer, "%s%s%s", str1, str, str2);
mysql_query(&mysql, buffer);
res = mysql_store_result(&mysql);
//给ROW赋值,判断ROW是否为空,不为空就打印数据。
while (row = mysql_fetch_row(res))
{
ID = atoi(row[0]);
age = atoi(row[2]);
score = atof(row[3]);
cout <<"ID=" << ID << " name=" << row[1] << " age=" << age << " score=" << score << endl;
}
//释放结果集
mysql_free_result(res);
}
2.对数据库的插入数据 *** 作
sprintf()与printf()类似,只不过printf()是将内容打印至控制台,而sprintf()是将字符串打印至缓冲区。sprintf()主要功能是把格式化的数据写入某个字符串中,可以实现将字符串与数值拼接,并保存为一个字符串的功能,从而可以通过多个字符串与数值变量拼接,来实现可变的查询、插入、删除等sql语句。其中sprintf_s()是sprintf()的安全版本,它通过指定缓冲区长度来避免sprintf()存在的溢出风险,在使用上二者并无太大差别,但是在VS2018之后的版本如果使用sprintf()编译器会发出报错,提示你将其修改为sprintf_s()。
void insert(MYSQL* conn, int ID, char name[20], int age, float score)
//插入数据
{
char str[64] = "INSERT INTO student VALUES( ";
char buffer[128] = { 0 };
char str2[4] = ",'";
char str3[4] = "',";
char str4[2] = ",";
char str5[2] = ")";
int len = sprintf_s(buffer, "%s%d%s%s%s%d%s%f%s", str, ID, str2, name, str3, age, str4, score, str5);
mysql_query(&mysql, buffer);
if (len < 0)
cout << "存档失败!" << endl;
if (len > 0)
cout << "存档成功!" << endl;
}
3.对数据库的更新数据 *** 作
void update(MYSQL* conn, int ID, char name[20], int age, float score)
//更新数据
{
char str[64] = "UPDATE student SET ID=";
char buffer[128] = { 0 };
char str2[16] = ",age=";
char str3[16] = ",score=";
char str4[32] = " WHERE name='";
char str5[10] = "'";
int len = sprintf_s(buffer, "%s%d%s%d%s%f%s%s%s", str, ID, str2, age, str3, score, str4, name, str5);
mysql_query(&mysql, buffer);
if (len < 0)
cout << "修改失败!" << endl;
if (len > 0)
cout << "修改成功!" << endl;
}
4.对数据库的删除数据 *** 作
void delete(char str2[])
//删除数据
{
char str1[64] = "DELETE FROM student WHERE name='";
char str3[10] = "'";
char buffer[1024];
int len = sprintf_s(buffer, "%s%s%s", str1, str2, str3);
mysql_query(&mysql, buffer);
if (len < 0)
cout << "删除失败!" << endl;
else
cout << "删除成功!" << endl;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)