C语言数据库编程

发布于:2025-07-14 ⋅ 阅读:(17) ⋅ 点赞:(0)

一,连接数据库

1,头文件和库

头文件 :
#include<mysql/mysql.h>
库:
mysqlclient
gcc xxx.c -lmysqlclient

2,连接数据库的相关函数

  • mysql_init
    函数原型: MYSQL *mysql_init ( MYSQL *mysql )
    功能: 分配或初始化 MYSQL 对象,如果 mysql 为空指针,返回一个新对象
    否则初始化对象,调用mysql_close() 来关闭连接。
    返回值: 初始化的 MYSQL 句柄 失败则返回 NULL

  • mysql_real_connect
    函数原型:
    MYSQL *mysql_real_connect(
    MYSQL *mysql, //已有MYSQL结构的地址
    const char *host , //主机名或 IP 地址
    const char *user , //登录名
    const char *passwd , // 密码
    const char *db , // 数据库名称
    unsigned int port , // 端口号 默认 0
    const char unix_socket , // 套接字或命名管道 默认NULL
    unsigned long client_flag // 一般为 0
    )
    功能:连接数据库
    返回值: 连接成功,返回 MYSQL
    句柄,连接失败,返回 NULL。

  • mysql_close
    函数原型: void mysql_close(MYSQL *mysql)
    功能:关闭前面打开的连接,如果句柄是由 mysql_init() 分配的,该函数还将解除分配 给mysql指向的连接句柄。
    返回值: 无。

3,错误处理相关函数

  • mysql_errno
    函数原型: unsigned int mysql_errno(MYSQL *mysql)
    功能:对于由mysql指定的连接,mysql_errno()返回最近调用的API函数的错误代码
    返回值: 如果失败,返回上次mysql_xxx()调用的错误代码,没有错误返回0.

  • mysql_error
    函数原型: const char * mysql_error(MYSQL *mysql)
    功能:对于由mysql指定的连接,对于失败的最近调用的API函数,mysql_error()返回
    包含错误信息的,由NULL结束的字符串,如果该函数未失败,该函数的返回值
    可能是以前的错误,或指明无错误的空字符串。
    返回值: 返回描述错误的,由NULL结尾的字符串,如果未出现错误,返回空字符串。

4,连接数据库以及错误处理示例

// An highlighted block
#include<stdio.h>
#include<mysql/mysql.h>

int  main()
{
    MYSQL  mysql;
    mysql_init(&mysql);     //初始化MYSQL结构
    //连接数据库
    if(!(mysql_real_connect(&mysql,"localhost","root","tarena","choose",0,NULL,0)))
    {
        printf("连接失败\n");
        printf("错误号:%d\ : %sn",mysql_errno(&mysql),mysql_error(&mysql));
        
    }
   mysql_close(&mysql);    //关闭数据库
}

二,DML操作

1,相关函数

  • mysql_query
    函数原型: int mysql_query(MYSQL *mysql , const char *query)
    功能: 执行“ NULL结束的字符串 ” 指向 SQL 语句。
    返回值: 成功为 0 ,

  • mysql_affected_rows
    函数原型: my_ulonglong mysql_affected_rows (MYSQL *mysql)
    功能: 返回上次 insert ,update , delete 语句影响的行数
    返回值: 大于 0 的整数表明受影响或检索的行数。 0 表示未更新记录, -1 表示查询返回错误。

2,insert操作

  • 向student表中插入一条数据,
// An highlighted block
#include<mysql/mysql.h>
 
MYSQL* mysql;
mysql = mysql_init(NULL);
mysql = mysql_real_connect(mysql,"","root","tarena","choose",0,NULL,0);
mysql_query(mysql,"set character set utf8");
mysql_query(mysql,"insert into student values('20171001','小李',‘13512345678’,‘NULL’)");
mysql_close(mysql);

2,update操作

mysql_query(mysql,“set character set utf8”);
sprintf(sqlstr, "update student set student_name = ’ %s ‘, student_contact = ’ %s’ , class_no = %d where student_no = ’ %s ’ " , stu_name , phone , c_no , stu_no );

mysql_query (mysql , sqlstr) ;
num_rows = mysql_affected_rows (mysql);

三,SELECT操作

1,相关函数

  • mysql_store_result
    函数原型: MYSQL_RES *mysql_store_result (MYSQL *mysql)
    功能: 对于成功检索了数据的操作(select , show , describe 等),必须调用
    mysql_store_result() 或 mysql_use_result()。 对于其他操作,不需要
    调用这两个函数。
    mysql_store_result() 将查询的全部结果读取到客户端。
    返回值: 成功时,返回 MYSQL_RES 结果集。出错时,返回NULL

  • mysql_free_result
    函数原型: void mysql_free_result (MYSQL_RES *result)
    功能: 释放由 mysql_store_result() , mysql_use_result() , mysql_list_dbs()
    等为结果集分配的内存。完成对结果集的操作后,必须调用mysql_free_result
    释放结果集使用的内存。释放完成后,不要尝试访问结果集
    返回值:

  • mysql_num_fields
    函数原型: unsigned int mysql_num_fields (MYSQL_RES *res)
    功能: 返回结果集中的列数
    返回值: 表示结果集中列数的无符号数

  • mysql_fetch_fields
    函数原型: MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res)
    功能: 对于结果集,返回所有 MYSQL_FIELD 结构的数组。每个结构提供了结果集中
    一列的字段定义。
    返回值: 关于结果集所有列的 MYSQL_FIELD 结构的数组
    MYSQL_FIELD 结构:该结构包含关于字段的信息,如字段名,类型和大小
    主要成员:name, org_name , tables , db …

  • mysql_fetch_row
    函数原型: MYSQL_ROW mysql_fetch_row (MYSQL_RES *res)
    功能: 检索结果集的下一行
    返回值: 下一行的 MYSQL_ROW 结构。如果没有更多要检索的行或出现了错误,
    返回NULL

// An highlighted block
MYSQL  mysql;
MYSQL_RES *res;     //结果集
unsigned int num_fields;   //列数
unsigned int num_rows;     //行数
MYSQL_FIELD*  fields;      //列的信息
mysql_init(&mysql);
if(!(mysql_real_connect(&mysql,"localhost","root","tarena0","choose",0,NULL,0)))
{
     return;
}
mysql_query(&mysql,"select * from student");
res = mysql_store_result(&mysql);   //获取结果集
if(res)
{
    num_fields = mysql_num_fields(res);  //列数
    num_rows = mysql_num_rows(res);      //行数
    printf("列数:%d , 行数:%d \n",num_fields , num_rows);
    fields = mysql_fetch_fields(res);    //获取消息的结构体数组
    printf("成功获取结果\n"); 
}

mysql_free_result(res);    //释放结果集
mysql_close(&mysql);
return  0;


网站公告

今日签到

点亮在社区的每一天
去签到