文档章节

C连接MySQL数据库开发之Linux环境完整示例演示(增、删、改、查)

yangxin0917
 yangxin0917
发布于 2014/12/18 19:32
字数 1086
阅读 23
收藏 1

一、开发环境


ReadHat6.3 32位、mysql5.6.15、gcc4.4.6


二、编译


gcc -I/usr/include/mysql -L/usr/lib -lmysqlclient main.c -o main.out

-I:指定mysql头文件所在目录(默认去/usr/include目录下寻找所用到的头文件)

-L:指定mysql动态库文件所在目录(默认从/usr/lib目录查找)

-l:链接libmysqlclient.so动态库

-o:生成的可执行文件名


三、完整示例

//
//  main.c
//  mysql数据库编程
//
//  Created by YangXin on 14-5-22.
//  Copyright (c) 2014年 yangxin. All rights reserved.
//

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql.h>

MYSQL mysql;

// 查询
int query();
// 修改
int update();
// 添加数据
my_ulonglong add();
// 参数化添加数据
my_ulonglong addByParams();
// 删除数据
my_ulonglong delete();
// 打印数据库服务器信息
void printMySqlInfo();

int main(int argc, const char * argv[])
{
    /*连接之前,先用mysql_init初始化MYSQL连接句柄*/
    mysql_init(&mysql);
    
    /*使用mysql_real_connect连接服务器,其参数依次为MYSQL句柄,服务器IP地址,
     登录mysql的用户名,密码,要连接的数据库等*/
    if(!mysql_real_connect(&mysql, "localhost", "root", "yangxin", "test", 0, NULL, 0)) {
        printf("connecting to Mysql error:%d from %s\n",mysql_errno(&mysql), mysql_error(&mysql));
        return -1;
    }else {
        printf("Connected Mysql successful!\n");
    }
    
    printMySqlInfo();
    
    // 设置编码
    mysql_query(&mysql, "set names utf8");
    
    // 参数化添加数据
    addByParams();
    
    // 查询
    query();
    
    // 修改
    update();
    
    // 添加
    add();
    
    // 删除
    delete();
    
    /*关闭连接*/
    mysql_close(&mysql);
    return 0;
}

// 查询
int query()
{
    int flag, i;
    const char *sql = NULL;
    MYSQL_RES *res = NULL;
    MYSQL_ROW row = NULL;
    MYSQL_FIELD *fields = NULL;
    sql = "select * from t_user" ;
    flag = mysql_real_query(&mysql, sql, (unsigned int)strlen(sql));
    if (flag) {
        printf("query error:%d from %s\n",mysql_errno(&mysql),mysql_error(&mysql));
        return -1;
    }
    
     // 将查询结果读取到内存当中,如果数据很多的情况会比较耗内存
    res = mysql_store_result(&mysql);
    // res = mysql_use_result(&mysql); // 需要用到的时候,每次从服务器中读取一行
    
    // 字段数量
    unsigned int field_count = mysql_field_count(&mysql);
    printf("field_cout:%d\n",field_count);
    
    // 查询总数
    my_ulonglong rows = mysql_num_rows(res);
    printf("%lld\n",rows);
    
    // 获取所有字段
    fields = mysql_fetch_fields(res);
    for (int i = 0; i < mysql_num_fields(res); i++) {
         printf("%s\t", fields[i].name);
    }
    
    printf("\n");
    
    // 遍历结果集
    while((row = mysql_fetch_row(res)))
    {
        for (i = 0; i < mysql_num_fields(res); i++)
        {
            printf("%s\t",row[i]);
           
        }
        
        printf("\n");
    }
    
    // 释放结果集
    mysql_free_result(res);
    
    return 0;
}

// 修改
int update()
{
    const char *sql = NULL;
    int flag = -1;
    sql = "update t_user set name='lisi',age=20 where id=1";
    // 执行SQL指令
    flag = mysql_real_query(&mysql, sql, (unsigned int)strlen(sql));
    if (flag) {
        printf("update data error:%d from %s\n",mysql_errno(&mysql),mysql_error(&mysql));
        return  -1;
    }
    
    printf("update success.\n");
    
    return 0;
}

// 添加
my_ulonglong add()
{
    const char *sql = NULL;
    int flag = -1;
    sql = "insert into t_user(name,age,address) values ('zhangsan',40,'beijing')";
    // 执行
    flag = mysql_real_query(&mysql, sql, strlen(sql));
    if (flag) {
        printf("add data error:%d from %s\n",mysql_errno(&mysql),mysql_error(&mysql));
        return -1;
    }
    
    // 删除的行数
    my_ulonglong affected_rows = mysql_affected_rows(&mysql);
    
    // 新添加记录的ID
    my_ulonglong newid = mysql_insert_id(&mysql);
    
    printf("success add %lld record data, newid:%lld!\n",affected_rows,newid);
    
    return newid;
}

// 参数化添加
my_ulonglong addByParams()
{
    const char *sql = NULL;
    MYSQL_STMT *stmt = NULL;
    MYSQL_BIND bnd[3];  // 占位符参数数量
    memset(&bnd, 0, sizeof(bnd));
    
    // 设置手动提交事务
    //mysql_autocommit(&mysql, 0);
    
    // 通过参数占位符的方式执行SQL
    sql = "insert into t_user(name,age,address) values (?,?,?)";
    
    stmt = mysql_stmt_init(&mysql);
    // 预处理SQL
    if(mysql_stmt_prepare(stmt, sql, (unsigned int)strlen(sql)))
    {
        fprintf(stderr, "mysql_stmt_prepare faild:%d from %s\n",
                mysql_stmt_errno(stmt),mysql_stmt_error(stmt));
        return -1;
    }
    
    // 封装占位符数据
    const char *name = "hanzhiqiang";
    bnd[0].buffer = (void *)name;
    bnd[0].buffer_type = MYSQL_TYPE_STRING;
    bnd[0].buffer_length = strlen(name);
    
    int age = 30;
    bnd[1].buffer = (void *)&age;
    bnd[1].buffer_length = sizeof(int);
    bnd[1].buffer_type = MYSQL_TYPE_LONG;
    
    const char *addres = "heimuer";
    bnd[2].buffer = (void *)addres;
    bnd[2].buffer_length = strlen(addres);
    bnd[2].buffer_type = MYSQL_TYPE_STRING;
    
    // 绑定占位符参数值
    if(mysql_stmt_bind_param(stmt, bnd))
    {
        fprintf(stderr, "mysql_stmt_bind_param faild:%d from %s\n",mysql_errno(&mysql), mysql_error(&mysql));
        return -2;
    }
    
    // 执行SQL
    if (mysql_stmt_execute(stmt)) {
        fprintf(stderr, "mysql_stmt_execute faild:%d from %s\n", mysql_errno(&mysql), mysql_error(&mysql));
        return -3;
    }
    
    // 关闭statement
    mysql_stmt_close(stmt);
    
    // 提交事务
    //mysql_commit(&mysql);
    
    // 事务回滚(在提交事务前)执行
    // mysql_rollback(&mysql);
    
    // 获取插入数据后,数据库受影响的记录数
    my_ulonglong newid = mysql_stmt_insert_id(stmt);
    printf("参数化语句插入新记录的id: %lld\n",newid);
    
    // 受影响的行数
    my_ulonglong affectedrows = mysql_stmt_affected_rows(stmt);
    printf("参数化语句插入受影响的行数:%lld\n",affectedrows);
    
    return newid;
}

my_ulonglong delete()
{
    const char *sql = NULL;
    int flag = -1;
    sql = "delete from t_user where id > 10";
    flag = mysql_real_query(&mysql, sql, strlen(sql));
    if (flag) {
        printf("delete data error:%d from %s\n",mysql_errno(&mysql), mysql_error(&mysql));
        return -1;
    }
    
    my_ulonglong affected_rows = mysql_affected_rows(&mysql);
    printf("删除的行数:%lld\n",affected_rows);
    
    printf("success delete %lld record data !\n",affected_rows);
    return affected_rows;
}

void printMySqlInfo()
{
    const char *stat = mysql_stat(&mysql);
    const char *server_info = mysql_get_server_info(&mysql);
    const char *clientInfo = mysql_get_client_info();
    unsigned long version =	mysql_get_client_version();
    const char *hostinfo =	mysql_get_host_info(&mysql);
    unsigned long serverversion = mysql_get_server_version(&mysql);
    unsigned int protoinfo = mysql_get_proto_info(&mysql);
    
    printf("stat:%s\n",stat);
    printf("server_info:%s\n",server_info);
    printf("clientInfo:%s\n",clientInfo);
    printf("version:%ld\n",version);
    printf("hostinfo:%s\n",hostinfo);
    printf("serverversion:%ld\n",serverversion);
    printf("protoinfo:%d\n",protoinfo);
    
    const char *charactername = mysql_character_set_name(&mysql);
    printf("client character set:%s\n",charactername);
    if (!mysql_set_character_set(&mysql, "utf8"))
    {
        printf("New client character set: %s\n",
               mysql_character_set_name(&mysql));
    }
}


本文转载自:http://blog.csdn.net/xyang81/article/details/26861009

yangxin0917
粉丝 3
博文 76
码字总数 31277
作品 0
昌平
高级程序员
私信 提问
完整的权限管理系统 - LaySSH

LaySSH是一款完全开源免费的开发框架,基于LayUI+SpringMVC+Spring+Hibernate+Mysql搭建而成,内置代码生成器,能够快速生成增删改查代码,节省开发时间,快速构建企业级的web应用系统。 该框...

herun
2018/02/02
6.5K
4
Android Studio 通过一个登录功能介绍SQLite数据库的使用

前言: SQLite简介:是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很...

AnneHan
2018/09/29
0
0
JDBC学习系列:使用JDBC对数据库进行CRUD

一、statement对象介绍     Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。   Statement对象的execute...

HenrySun
2016/10/04
34
0
【mysql】mysql增改查删基本命令以及备份操作

实验环境 虚拟化设备:Esxi6.0 系统:Redhat7 数据库:mariaDB #操作与mysql相同 第18章 使用MariaDB数据库管理系统。 学会4种备份MySQL数据库(基本备份方面没问题了) 一、初始化mariaDB服...

bestlope
2018/04/15
0
0
Android中数据存储--采用SQLite存储数据及在SDCard中创建数据库

SQLite数据库简单的认识 SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式...

鉴客
2011/11/14
2.5K
1

没有更多内容

加载失败,请刷新页面

加载更多

官方来源的 Duo Mobile App 解决了我的 Network Difficulties 问题

https://help.duo.com/s/article/2094?language=en_US 我利用百度搜索下载了一个 Duo Mobile App (由于 Google Play)在大陆不可用。 在扫描旧手机上的 Duo Mobile App 的二维码时, 显示出错...

圣洁之子
3分钟前
1
0
Zabbix监控Mysql容器(Docker容器)主从是否存活

1、在Zabbix Web端创建模板

abowu
4分钟前
1
0
基于 RocketMQ 的同城双活架构在美菜网的挑战与实践

本文整理自李样兵在北京站 RocketMQ meetup分享美菜网使用 RocketMQ 过程中的一些心得和经验,偏重于实践。 嘉宾李样兵,现就职于美菜网基础服务平台组,负责 MQ ,配置中心和任务调度等基础...

大涛学长
10分钟前
1
0
设计模式之:外观模式和桥接模式

作者:DevYK 链接:https://juejin.im/post/5d7e01f4f265da03b5747aac 外观模式 介绍 外观模式 (Facade) 在开发过程中的运用评率非常高,尤其是在现阶段,各种第三方 SDK “充斥” 在我们周边...

Java架构Monster
11分钟前
1
0
人证合一核验设备

人脸身份验证机,人证合一设备1:N如我们现在在车站或一些重要的场所如步行街、城中村等人流密集的场所应用的人脸识别布控系统,其特点是动态和非配合。所谓的动态也就是识别的不是照 片,不是...

非思丸智能
13分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部