1.常用的数据库访问技术
1.1 proc/c++ c/c++中访问oracle数据库的技术
1.2 odbc/ado vc中访问数据库的技术
1.3 jdbc java中访问数据库的技术
2.C语言中访问MySQL数据库
- linux下
API函数 - windows下
odbc/ado
-
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()函数
– 函数原型
int mysql_query(MYSQL* mysql,const char* query)
– 功能
执行query指向的sql语句.
– 返回值
执行成功,返回0.如果出现错误,返回非0值
4.2 insert语句
案例: 向选课系统"choose"的学生表student中插入一行数据
/设置字符集/
mysql_query(&mysql,“set character set utf8”);
03insert.c
4.3 delete语句
案例:根据学号删除学生信息
04delete.c
4.4 update语句
- select操作
5.1 相关的函数
- mysql_store_result()函数
数据类型: MYSQL_RES 结果集
– 函数原型
MYSQL_RES* mysql_store_result(MYSQL* mysql)
–功能
对于检索了数据的操作(select show desc等),将查询的结果集读取到客户端
– 返回值
成功时,返回MYSQL_RES结果集,出现错误时,返回NULL
- mysql_free_result()函数
– 函数原型
void mysql_free_result(MYSQL_RES* res)
– 功能
释放结果集 - mysql_num_fields()函数
– 函数原型
unsigned int mysql_num_fields(MYSQL_RES* res)
– 功能
返回结果集中的列数 - mysql_num_rows()函数
– 函数原型
my_ulonglong mysql_num_rows(MYSQL_RES* res)
– 功能
返回结果集中的行数 - mysql_field_count()函数
– 函数原型
unsigned int mysql_field_count(MYSQL* mysql)
– 功能
返回查询的列数
当执行的是dml操作时,返回0 - mysql_affected_rows()函数
– 函数原型
unsigned int mysql_affected_rows(MYSQL* mysql)
– 功能
返回执行dml操作时,影响的行数
案例:05select.c
- mysql_fetch_fields()函数
– 函数原型
MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES* res)
– 功能
对于结果集,返回所有MYSQL_FIELD结构的数据,数组中的每个元素提供了结果集中一个字段的信息
MYSQL_FIELD: 该结构中包含了关于字段的信息,包括字段名、类型、大小等。
char* name
char* table
char* db
…
- mysql_fetch_row()函数
– 函数原型
MYSQL_ROW mysql_fetch_row(MYSQL_RES* res)
– 功能
检索结果集中的下一行
案例:06select.c
练习:查询所有学生及其所在班级的信息,列出学号、姓名和班级名称
案例:07select.c
6.错误处理
6.1 相关的函数
- mysql_errno()函数
– 函数原型
unsigned int mysql_errno(MYSQL* mysql)
– 功能
返回最近调用的mysql_xxx()API函数的错误代码
没有错误返回0 - mysql_error()函数
– 函数原型
const char* mysql_error(MYSQL* mysql)
– 功能
对于最近执行的mysql_xxx()API函数 ,如果错误,返回包含错误信息的字符串,没有错误时 ,返回NULL
综合案例:实现一个迷你型的学生管理系统。功能如下:
1.添加学生
2.根据学号修改学生信息
3.根据学号删除学生信息
4.显示学生列表
5.根据学号检索学生信息
0.退出
代码见Student.c
#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>
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<num_fields;i++){
printf("%s\t",fields[i].name);
}
printf("\n--------------------------------\n");
// 输出结果集中的数据
for(int i=0;i<num_rows;i++){
row = mysql_fetch_row(res);
for(int j=0;j<num_fields;j++){
printf("%s\t",row[j]);
}
printf("\n");
}
mysql_free_result(res);// 释放结果集
}
}
// 查询指定学生信息
void searchbyno(MYSQL mysql){
unsigned int num_fields,num_rows;
MYSQL_RES* res;
MYSQL_FIELD* fields;
MYSQL_ROW row;
char stuno[15];
char sqlstr[200];
printf("请输入要查询的学生的学号:");
scanf("%s",stuno);
sprintf(sqlstr,"select student_no 学号,student_name 姓名,student_contact 联系方式,class_no 班号 from student where student_no='%s'",stuno);
mysql_query(&mysql,sqlstr);
res = mysql_store_result(&mysql);
if(res){
num_fields=mysql_num_fields(res);// 列数
num_rows=mysql_num_rows(res);
if(!num_rows){
printf("要查询的学生不存在\n");
return;
}
fields = mysql_fetch_fields(res);// 列的信息
// 输出列名
for(int i=0;i<num_fields;i++){
printf("%s\t",fields[i].name);
}
printf("\n--------------------------------\n");
// 输出结果集中的数据
row = mysql_fetch_row(res);
for(int i=0;i<num_fields;i++){
printf("%s\t",row[i]);
}
printf("\n");
mysql_free_result(res);// 释放结果集
}
}