1.常用的数据库访问技术
1.1 proc/c++ c/c++中访问oracle数据库的技术
1.2 odbc/ado vc中访问数据库的技术
1.3 jdbc java中访问数据库的技术
2.C语言中访问MySQL数据库
C语言连接MySQL数据库
3.1 本地连接
3.1.1 相关的数据类型和函数
MYSQL类型
该结构代表一个数据库连接的句柄,几乎所有的MySQL函数都会使用
mysql_init()函数
– 函数原型
MYSQL* mysql_init(MYSQL* mysql)
– 功能
分配或初始化与mysql_real_connect()相适应的一个MYSQL对象.
mysql_real_connect()函数
– 函数原型
MYSQL* mysql_real_connect(
MYSQL* mysql, // 已有的MYSQL结构的地址
const char* host, // 主机名或ip地址
const char* user, // 登录名
const char* passwd, // 密码
const char* dbname, // 数据库名
unsigned int port, // 端口号 0
const char* unix_socket, // 套接字或命名管道 null
unsigned long client_flag // 一般为 0
);
– 功能
和运行在指定主机上的MySQL数据库引擎建立连接
– 返回值
连接成功,返回MYSQL*连接句柄.如果失败,返回NULL
mysql_close()函数
– 函数原型
void mysql_close(MYSQL* mysql)
– 功能
关闭前面打开的连接
案例:连接本机的choose数据库,用户名:root, 密码:tarena
01conn.c
需要的头文件: mysql/mysql.h
链接时: gcc 01conn.c -lmysqlclient
3.2 远程连接数据库
案例: 使用ip地址实现远程连接
02rconn.c
4.DML操作
4.1 相关的函数
/设置字符集/
mysql_query(&mysql,“set character set utf8”);
03insert.c
4.3 delete语句
案例:根据学号删除学生信息
04delete.c
4.4 update语句
数据类型: MYSQL_RES 结果集
– 函数原型
MYSQL_RES* mysql_store_result(MYSQL* mysql)
–功能
对于检索了数据的操作(select show desc等),将查询的结果集读取到客户端
– 返回值
成功时,返回MYSQL_RES结果集,出现错误时,返回NULL
案例:05select.c
MYSQL_FIELD: 该结构中包含了关于字段的信息,包括字段名、类型、大小等。
char* name
char* table
char* db
…
案例:06select.c
练习:查询所有学生及其所在班级的信息,列出学号、姓名和班级名称
案例:07select.c
6.错误处理
6.1 相关的函数
综合案例:实现一个迷你型的学生管理系统。功能如下:
1.添加学生
2.根据学号修改学生信息
3.根据学号删除学生信息
4.显示学生列表
5.根据学号检索学生信息
0.退出
代码见Student.c
#include
#include
#include
void addstu(MYSQL mysql); // 添加学生
void modifystu(MYSQL mysql); // 修改学生信息
void delstu(MYSQL mysql); // 删除指定学生
void stulist(MYSQL mysql); // 显示学生列表
void searchbyno(MYSQL mysql);// 查询指定学生信息
int main(){
int option; // 接收用户的选项
MYSQL mysql;
mysql_init(&mysql);
if(!(mysql_real_connect(&mysql,"localhost","root","tarena","choose",0,NULL,0))){
printf("连接失败,%s\n",mysql_error(&mysql));
return -1;
}
// 设置字符集
mysql_query(&mysql,"set character set utf8");
while(1){
printf("\n\t学生管理系统\n");
printf("1.添加学生\n");
printf("2.修改学生信息\n");
printf("3.删除学生\n");
printf("4.学生列表\n");
printf("5.查询指定学生信息\n");
printf("0.退出\n");
printf("请选择:");
scanf("%d",&option);
switch(option){
case 1:
printf("学生管理系统--添加学生\n");
addstu(mysql);
break;
case 2:
printf("学生管理系统--修改学生信息\n");
modifystu(mysql);
break;
case 3:
printf("学生管理系统--删除学生\n");
delstu(mysql);
break;
case 4:
printf("学生管理系统--学生列表\n");
stulist(mysql);
break;
case 5:
printf("学生管理系统--查询指定学生信息\n");
searchbyno(mysql);
break;
case 0:
printf("退出学生管理系统\n");
mysql_close(&mysql);// 关闭数据库连接
exit(0);
}
}
return 0;
}
// 添加学生
void addstu(MYSQL mysql){
char stuno[15];
char stuname[15];
char phone[15];
int c_no;
char sqlstr[200];
printf("请输入学生的学号:");
scanf("%s",stuno);
printf("请输入学生的姓名:");
scanf("%s",stuname);
printf("请输入联系方式:");
scanf("%s",phone);
printf("请人数班号:");
scanf("%d",&c_no);
sprintf(sqlstr,"insert into student values('%s','%s','%s',%d)",stuno,stuname,phone,c_no);
// printf("%s\n",sqlstr);
if(mysql_query(&mysql,sqlstr)){
printf("添加学生失败,%s\n",mysql_error(&mysql));
}
else{
printf("添加学生成功\n");
}
}
// 修改学生信息
void modifystu(MYSQL mysql){
char stuno[15];
char stuname[15];
char phone[15];
int c_no;
char sqlstr[200];
printf("请输入要修改学生的学号:");
scanf("%s",stuno);
printf("请输入学生的姓名:");
scanf("%s",stuname);
printf("请输入联系方式:");
scanf("%s",phone);
printf("请输入班号:");
scanf("%d",&c_no);
sprintf(sqlstr,"update student set student_name='%s',student_contact='%s',class_no=%d where student_no='%s'",stuname,phone,c_no,stuno);
// printf("%s\n",sqlstr);
if(mysql_query(&mysql,sqlstr)){
printf("修改学生失败,%s\n",mysql_error(&mysql));
}
else{
printf("修改学生成功\n");
}
}
// 删除指定学生信息
void delstu(MYSQL mysql){
char stuno[15];
char sqlstr[200];
printf("请输入要删除学生的学号:");
scanf("%s",stuno);
sprintf(sqlstr,"delete from student where student_no='%s'",stuno);
// printf("%s\n",sqlstr);
if(mysql_query(&mysql,sqlstr)){
printf("删除学生失败,%s\n",mysql_error(&mysql));
}
else{
printf("删除学生成功\n");
}
}
// 显示学生列表
void stulist(MYSQL mysql)
{
unsigned int num_fields,num_rows;
MYSQL_RES* res;
MYSQL_FIELD* fields;
MYSQL_ROW row;
mysql_query(&mysql,"select student_no 学号,student_name 姓名,student_contact 联系方式,class_no 班号 from student");
res = mysql_store_result(&mysql);
if(res){
num_fields=mysql_num_fields(res);// 列数
num_rows=mysql_num_rows(res); // 行数
fields = mysql_fetch_fields(res);// 列的信息
// 输出列名
for(int i=0;i