#include <stdio.h> #include <mysql.h> #include <string.h> int main(){ MYSQL mysql; mysql_init(&mysql); mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "gbk");//这句话很关键,防止在命令行中中文乱码 if(NULL == mysql_real_connect(&mysql,"127.0.0.1","root","1234","cesdb",3306,NULL,0)) { printf("MySQL connect fail.\n"); mysql_close(&mysql); return -1; } else printf("MySQL connect success!\n"); mysql_close(&mysql); } 编译完之后,点击运行还是显示未编译怎么办
时间: 2024-03-12 07:44:36 浏览: 86
你需要检查编译器是否正确配置,并且确认是否正确编译了该文件。可以尝试在命令行中使用编译器进行编译,例如使用gcc编译该文件:
```
gcc -o test test.c `mysql_config --cflags --libs`
```
其中test.c是你的文件名,test是编译后的可执行文件名。如果编译成功,可以在命令行中输入`./test`来运行该程序。如果仍然无法运行,可以检查是否缺少MySQL的库文件或者是否正确链接了库文件。
相关问题
修改以下代码,并解释改正的原因:#define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:6031) #include <stdio.h> #include <stdlib.h> #include <mysql.h> #include <string.h> #define N 3 MYSQL* conn; MYSQL m; void initialize() { // 初始化链接 conn = mysql_init(NULL); mysql_options(&m, MYSQL_SET_CHARSET_NAME, "gbk"); // 连接数据库 if (!mysql_real_connect(conn, "localhost", "b", "12345", "tang", 0, NULL, 0)) { printf("连接数据库失败: %s\n", mysql_error(conn)); exit(1); } else printf("数据库连接成功!\n"); } //录入学生信息 void Insert(MYSQL* mysql) { int i = 0; char* str1 = "insert into student(id,name,chengji) values("; char sql_insert[200]; for (i = 1; i <= N; i++) { char id[12], name[9]; char chengji=0; printf("请输入学生学号:"); gets_s(id, 12); printf("请输入学生姓名:"); gets_s(name, 9); printf("请输入学生成绩:"); gets_s(chengji, 9); int n = getchar(); sprintf(sql_insert," %s'%s', %5s", str1, id, name, chengji); mysql_query(mysql, sql_insert); printf("录入信息成功!\n"); } return; } // 显示学生信息 void Display(MYSQL* mysql) { char* str = "select from student"; MYSQL_RES* res; //一个结果集结构体 MYSQL_ROW row = NULL; //char**二维数组,存放一条条记录(一条记录代表一个学生的信息) char id[12], name[9]; char chengji; //向HySQL发送SQL语句 mysql_query(mysql, str); //获取结果集 res = mysql_store_result(mysql); //打印 printf("id\t name\t chengji\t"); while (row = mysql_fetch_row(res)) { for (int i = 0; i < mysql_num_fields(res); i++) { switch (i) { case 0: { strcpy(id, row[i]); break; } case 1: { strcpy(name, row[i]); break; } case 2: { strcpy(chengji, row[i]); break; } break; } } } printf("10s\t, %11s\t,%4s\n", id, name,chengji); nysql_free_result(res); } void finalize(){ // 关闭连接 mysql_close(conn); printf("已关闭数据库"); } int main() { initialize(); insert(); finalize(); return 0; }
下面是修改后的代码,同时也会解释改正的原因:
```c
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>
#include <string.h>
#define N 3
MYSQL* conn;
MYSQL m;
void initialize() {
// 初始化链接
conn = mysql_init(NULL);
mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk");
// 连接数据库
if (!mysql_real_connect(conn, "localhost", "b", "12345", "tang", 0, NULL, 0)) {
printf("连接数据库失败: %s\n", mysql_error(conn));
exit(1);
}
else printf("数据库连接成功!\n");
}
//录入学生信息
void Insert(MYSQL* mysql) {
int i = 0;
char* str1 = "insert into student(id,name,chengji) values(";
char sql_insert[200];
for (i = 1; i <= N; i++) {
char id[12], name[9];
char chengji[9];
printf("请输入学生学号:");
fgets(id, 12, stdin);
printf("请输入学生姓名:");
fgets(name, 9, stdin);
printf("请输入学生成绩:");
fgets(chengji, 9, stdin);
int n = getchar();
sprintf(sql_insert, " %s'%s', '%s', '%s')", str1, id, name, chengji);
mysql_query(mysql, sql_insert);
printf("录入信息成功!\n");
}
return;
}
// 显示学生信息
void Display(MYSQL* mysql) {
char* str = "select * from student";
MYSQL_RES* res; //一个结果集结构体
MYSQL_ROW row = NULL; //char**二维数组,存放一条条记录(一条记录代表一个学生的信息)
char id[12], name[9];
char chengji[9];
//向MySQL发送SQL语句
mysql_query(mysql, str);
//获取结果集
res = mysql_store_result(mysql);
//打印
printf("id\t name\t chengji\t\n");
while (row = mysql_fetch_row(res)) {
for (int i = 0; i < mysql_num_fields(res); i++) {
switch (i) {
case 0: {
strcpy(id, row[i]);
break;
}
case 1: {
strcpy(name, row[i]);
break;
}
case 2: {
strcpy(chengji, row[i]);
break;
}
}
}
printf("%s\t %s\t %s\t\n", id, name, chengji);
}
mysql_free_result(res);
}
void finalize() {
// 关闭连接
mysql_close(conn);
printf("已关闭数据库");
}
int main() {
initialize();
Insert(conn);
Display(conn);
finalize();
return 0;
}
```
改正的原因如下:
1. `MYSQL* conn; MYSQL m;` 这一行代码中,`MYSQL m;`是不需要的,因为我们只需要一个`MYSQL*`类型的指针即可。
2. `mysql_options(&m, MYSQL_SET_CHARSET_NAME, "gbk");` 中的`&m`应该改为`conn`,因为我们要设置的是`conn`这个MySQL连接的属性,而不是`m`这个无用的变量。
3. `gets_s`函数不是标准C函数,且存在安全问题,所以应该使用更安全的`fgets`函数。同时,`chengji`应该是一个字符串类型,而不是字符类型。
4. `mysql_query`函数执行的SQL语句中,缺少了一个右括号`)`,导致语法错误。
5. `Display`函数中的SQL语句缺少了`*`,导致无法获取到所有的学生信息。
6. `Display`函数中打印学生信息的语句格式不正确,应该为`"%s\t %s\t %s\t\n"`。
7. `mysql_free_result`函数的名称拼写错误,应该为`mysql_free_result`。
#define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:6031) #include <stdio.h> #include <stdlib.h> #include <mysql.h> #include <string.h> #define N 3 MYSQL* conn; MYSQL m; mysql_init(); void initialize() { // 初始化链接 conn = mysql_init(NULL); mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk"); // 连接数据库 if (!mysql_real_connect(conn, "localhost", "b", "12345", "tang", 0, NULL, 0)) { printf("连接数据库失败: %s\n", mysql_error(conn)); exit(1); } else printf("数据库连接成功!\n"); } void Insert(MYSQL* conn) { int i = 0; char* str1 = "insert into student(id,name,chengji) values("; char sql_insert[200]; for (i = 1; i <= N; i++) { char id[12], name[9]; char chengji[9]; printf("请输入学生学号:"); fgets(id, 12, stdin); printf("请输入学生姓名:"); fgets(name, 9, stdin); printf("请输入学生成绩:"); fgets(chengji, 9, stdin); //int n = getchar(); sprintf_s(sql_insert, sizeof(sql_insert), "%s'%s','%s','%s'%s", str1, id, name, chengji, ")"); mysql_query(conn, sql_insert); printf("录入信息成功!\n"); } return; } // 显示学生信息 void Display(MYSQL* mysql) { char* str = "select * from student"; MYSQL_RES* res; //一个结果集结构体 MYSQL_ROW row = NULL; //char**二维数组,存放一条条记录(一条记录代表一个学生的信息) char id[12], name[9]; char chengji[9]; //向MySQL发送SQL语句 mysql_query(mysql, str); //获取结果集 res = mysql_store_result(mysql); //打印 printf("id\t name\t chengji\t\n"); while (row = mysql_fetch_row(res)) { for (int i = 0; i < mysql_num_fields(res); i++) { switch (i) { case 0: { strcpy(id, row[i]); break; } case 1: { strcpy(name, row[i]); break; } case 2: { strcpy(chengji, row[i]); break; } } } printf("%s\t %s\t %s\t\n", id, name, chengji); } mysql_free_result(res); } void finalize() { // 关闭连接 mysql_close(conn); printf("已关闭数据库"); } int main() { initialize(); Insert(conn); Display(conn); finalize(); return 0; }修改代码并解释
修改后的代码如下:
```
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>
#include <string.h>
#define N 3
MYSQL* conn;
void initialize() {
// 初始化链接
conn = mysql_init(NULL);
mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk");
// 连接数据库
if (!mysql_real_connect(conn, "localhost", "b", "12345", "tang", 0, NULL, 0)) {
printf("连接数据库失败: %s\n", mysql_error(conn));
exit(1);
}
else {
printf("数据库连接成功!\n");
}
}
void Insert(MYSQL* conn) {
int i = 0;
char* str1 = "insert into student(id,name,chengji) values(";
char sql_insert[200];
for (i = 1; i <= N; i++) {
char id[12], name[9], chengji[9];
printf("请输入学生学号:");
fgets(id, 12, stdin);
printf("请输入学生姓名:");
fgets(name, 9, stdin);
printf("请输入学生成绩:");
fgets(chengji, 9, stdin);
// fgets会读取到'\n',需要将其替换为'\0'
id[strcspn(id, "\n")] = '\0';
name[strcspn(name, "\n")] = '\0';
chengji[strcspn(chengji, "\n")] = '\0';
sprintf_s(sql_insert, sizeof(sql_insert), "%s'%s','%s','%s')", str1, id, name, chengji);
mysql_query(conn, sql_insert);
printf("录入信息成功!\n");
}
return;
}
void Display(MYSQL* mysql) {
char* str = "select * from student";
MYSQL_RES* res; //一个结果集结构体
MYSQL_ROW row = NULL; //char**二维数组,存放一条条记录(一条记录代表一个学生的信息)
char id[12], name[9], chengji[9];
//向MySQL发送SQL语句
mysql_query(mysql, str);
//获取结果集
res = mysql_store_result(mysql);
//打印
printf("id\t name\t chengji\t\n");
while (row = mysql_fetch_row(res)) {
strcpy(id, row[0]);
strcpy(name, row[1]);
strcpy(chengji, row[2]);
printf("%s\t %s\t %s\t\n", id, name, chengji);
}
mysql_free_result(res);
}
void finalize() {
// 关闭连接
mysql_close(conn);
printf("已关闭数据库");
}
int main() {
initialize();
Insert(conn);
Display(conn);
finalize();
return 0;
}
```
主要修改的地方:
1. 在输入学生信息时,使用`fgets`函数读取输入,需要将读取到的换行符`\n`替换为字符串结束符`\0`。
2. 在显示学生信息时,直接使用`strcpy`函数将结果集中的字符串赋值给变量,不再使用`switch`语句。
3. 在插入学生信息时,修正了SQL语句的拼接错误,将`'%s'%s`改为`'%s','%s','%s')`。
4. 对代码进行了格式化,使其更加清晰易读。
该程序的功能是将学生信息录入数据库,并显示出来。程序在运行时会提示用户输入学生学号、姓名、成绩等信息,将这些信息插入到数据库中。然后程序会查询数据库中的所有学生信息,并将其按照一定的格式打印出来。最后关闭数据库连接。
阅读全文