MySql学习day06 常用的数据库访问技术 C语言中访问MySQL数据库 C语言连接MySQL数据库 DML操作 select操作 错误处理

1.常用的数据库访问技术
1.1 proc/c++ c/c++中访问oracle数据库的技术
1.2 odbc/ado vc中访问数据库的技术
1.3 jdbc java中访问数据库的技术
2.C语言中访问MySQL数据库

  1. linux下
    API函数
  2. windows下
    odbc/ado
  1. C语言连接MySQL数据库
    3.1 本地连接
    3.1.1 相关的数据类型和函数

    1. MYSQL类型
      该结构代表一个数据库连接的句柄,几乎所有的MySQL函数都会使用

    2. mysql_init()函数
      – 函数原型
      MYSQL* mysql_init(MYSQL* mysql)
      – 功能
      分配或初始化与mysql_real_connect()相适应的一个MYSQL对象.

    3. 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

    4. 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 相关的函数

  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语句

  1. select操作
    5.1 相关的函数
  1. mysql_store_result()函数

数据类型: MYSQL_RES 结果集

– 函数原型
MYSQL_RES* mysql_store_result(MYSQL* mysql)
–功能
对于检索了数据的操作(select show desc等),将查询的结果集读取到客户端
– 返回值
成功时,返回MYSQL_RES结果集,出现错误时,返回NULL

  1. mysql_free_result()函数
    – 函数原型
    void mysql_free_result(MYSQL_RES* res)
    – 功能
    释放结果集
  2. mysql_num_fields()函数
    – 函数原型
    unsigned int mysql_num_fields(MYSQL_RES* res)
    – 功能
    返回结果集中的列数
  3. mysql_num_rows()函数
    – 函数原型
    my_ulonglong mysql_num_rows(MYSQL_RES* res)
    – 功能
    返回结果集中的行数
  4. mysql_field_count()函数
    – 函数原型
    unsigned int mysql_field_count(MYSQL* mysql)
    – 功能
    返回查询的列数
    当执行的是dml操作时,返回0
  5. mysql_affected_rows()函数
    – 函数原型
    unsigned int mysql_affected_rows(MYSQL* mysql)
    – 功能
    返回执行dml操作时,影响的行数

案例:05select.c

  1. mysql_fetch_fields()函数
    – 函数原型
    MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES* res)
    – 功能
    对于结果集,返回所有MYSQL_FIELD结构的数据,数组中的每个元素提供了结果集中一个字段的信息

MYSQL_FIELD: 该结构中包含了关于字段的信息,包括字段名、类型、大小等。
char* name
char* table
char* db

  1. mysql_fetch_row()函数
    – 函数原型
    MYSQL_ROW mysql_fetch_row(MYSQL_RES* res)
    – 功能
    检索结果集中的下一行

案例:06select.c

练习:查询所有学生及其所在班级的信息,列出学号、姓名和班级名称
案例:07select.c

6.错误处理
6.1 相关的函数

  1. mysql_errno()函数
    – 函数原型
    unsigned int mysql_errno(MYSQL* mysql)
    – 功能
    返回最近调用的mysql_xxx()API函数的错误代码
    没有错误返回0
  2. 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);// 释放结果集
    }
}




















  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值