zoukankan      html  css  js  c++  java
  • Linux centos 7/ubantu下: 用 C 语言连接 MySQL数据库

      前言:最近用IPC、socket做ATM、聊天项目,考虑到需要用到数据库,所以总结一下centos、ubantu环境下怎么用C语言操作数据库,例如常见的增删改查等!

      一、Centos环境安装mysql

      要想进行 C 语言连接MySQL数据库的操作,那么首先要安装数据库,安装数据库挺简单的,这里暂不介绍了。等到 MySQL 安装完毕之后,就可以在 C 语言下连接MySQL数据库了。

      首先要安装一个叫 mysql-devel 东西,这个是一个驱动 通过 yum install mysql-devel 命令安装,然后就是在命令行中执行 vim sql.c 命令,然后写代码。

      二、介绍数据库相关函数

    1. mysql_real_connect
      函数原型:MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)
      参数说明:
      host:本地用localhost或127.0.0.1,远程写IP;
      user、passwd:登陆数据库的用户名密码
      db:数据库名
      port:数据库所用的端口(MySQL一般为3306)
      unix_socket:先写个NULL(官方解释:如果unix_socket不是NULL,该字符串描述了应使用的套接字或命名管道)
      client_flag:先写个0(指定特定功能)
    2. mysql_real_query
      函数原型:int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)
      参数说明:
      query:SQL语句;
      length:SQL语句长度
    3. mysql_store_result
      函数原型:MYSQL_RES *mysql_store_result(MYSQL *mysql)
      返回值说明:具有多个结果的MYSQL_RES结果集合。如果出现错误,返回NULL。
    4. mysql_fetch_row
      函数原型:MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
      参数说明:具有多个结果的MYSQL_RES结果集合

      返回值说明:在mysql_store_result()之后使用时,如果没有更多的行可检索时,mysql_fetch_row()返回NULL。

      三、示例代码

    •   在执行程序之前需要建一个简单的表,建表语句如下:
    CREATE TABLE `person` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(64) NOT NULL DEFAULT '',
      `age` varchar(64) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      UNIQUE KEY `name` (`name`)
      ) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=utf8;
    •   程序显示对person表(上面通过建表语句建的表)的插入、查找和删除操作,代码如下:

      

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <mysql.h>
    
    int main() {
        MYSQL conn;
        int res;
        MYSQL_RES * result;
        MYSQL_ROW row;
        mysql_init(&conn);
    
        //第三、四和五个参数,需要自己修改一下
        if (mysql_real_connect(&conn, "localhost", "usre_name", "password", "DataBase_name", 0, NULL, 0)) {
            printf("coneect mysql successful
    请选择功能
    ");
            int choose;
            char str1[20], str2[20];
            char insert_query[80];
            char delete_query[50] = "delete from person where name='";
            char select_query[] = "select * from person";
            printf("1.insert
    2.select
    3.delete
    ");
            while (scanf("%d", &choose)) {
                switch (choose) {
                case 1:    //insert
                    printf("姓名 年龄:");
                    memset(insert_query, 0, sizeof(insert_query));
                    scanf("%s %s", str1, str2);
                    strcat(insert_query, "insert into person(name,age) values('");
                    strcat(insert_query, str1);
                    strcat(insert_query, "',");
                    strcat(insert_query, str2);
                    strcat(insert_query, ")");
                    printf("SQL语句: %s
    ", insert_query);
                    res = mysql_query(&conn, insert_query);
                    if (!res) {
                        printf("insert %lu rows
    ", (unsigned long)mysql_affected_rows(&conn));
                    }
                    else {
                        printf("insert error
    ");
                    }
                    break;
                case 2:    //select            
                    printf("SQL语句: %s
    ", select_query);
                    if (mysql_query(&conn, select_query) != 0) {
                        fprintf(stderr, "查询失败
    ");
                        exit(1);
                    }
                    else {
                    if ((result = mysql_store_result(&conn)) == NULL) {
                            fprintf(stderr, "保存结果集失败
    ");
                            exit(1);
                        }
                        else {
                            while ((row = mysql_fetch_row(result)) != NULL) {
                                printf("name is %s , ", row[0]);
                                printf("age is %s
    ", row[1]);
                            }
                        }
                    }
                    break;
                case 3:    //delete
                printf("姓名
    ");
                    scanf("%s", str1);
                    strcat(delete_query, str1);
                    strcat(delete_query, "'");            
                    printf("SQL语句: %s
    ", delete_query);
                res = mysql_real_query(&conn, delete_query, (unsigned int)strlen(delete_query));
                    if (!res) {
                        printf("delete successful
    ");
                    }
                    else {
                        printf("delete error
    ");
                    }
                    break;
                }
            }
            mysql_close(&conn);
        }
        return 0;
    }

      编译是要注意链上动态库,编译语句如下:

      gcc sql.c -o sql -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient

      总结:以上就可以完成对Centos环境,用C语言对数据库的操作了

      四、Ubantu环境安装mysql

      ubuntu上安装mysql非常简单只需要几条命令就可以完成。

      1. sudo apt-get install mysql-server
     
      2. apt-get isntall mysql-client
     
      3.  sudo apt-get install libmysqlclient-dev
     
      安装过程中会提示设置密码什么的,注意设置了不要忘了,安装完成之后可以使用如下命令来检查是否安装成功:
     
      sudo netstat -tap | grep mysql
     
      通过上述命令检查之后,如果看到有mysql 的socket处于 listen 状态则表示安装成功。
     
      登陆mysql数据库可以通过如下命令:
     
      mysql -u root -p 
     
      -u 表示选择登陆的用户名, -p 表示登陆的用户密码,上面命令输入之后会提示输入密码,此时输入密码就可以登录到mysql。
      
      然后通过 show databases; 就可以查看当前的数据库。
      我们选择 mysql数据库就行下一步操作,使用use mysql 命令,显示当前数据库的表单:show tables
      
      
      写一个简单的程序来访问该数据库,实现 show tables 功能:
      
    #include <mysql/mysql.h>
    #include <stdio.h>
    #include <stdlib.h>
    int main() 
    {
        MYSQL *conn;
        MYSQL_RES *res;
        MYSQL_ROW row;
        char server[] = "localhost";
        char user[] = "root";
        char password[] = "mima";
        char database[] = "mysql";
        
        conn = mysql_init(NULL);
        
        if (!mysql_real_connect(conn, server,user, password, database, 0, NULL, 0)) 
        {
            fprintf(stderr, "%s
    ", mysql_error(conn));
            exit(1);
        }
        
        if (mysql_query(conn, "show tables")) 
        {
            fprintf(stderr, "%s
    ", mysql_error(conn));
            exit(1);
        }
        
        res = mysql_use_result(conn);
        
        printf("MySQL Tables in mysql database:
    ");
        
        while ((row = mysql_fetch_row(res)) != NULL)
        {
            printf("%s 
    ", row[0]);
        }
        
        mysql_free_result(res);
        mysql_close(conn);
        
        printf("finish! 
    ");
        return 0;
    }

      

      编译代码的时候需要链接mysql的库,可以通过如下方式编译:

      g++ -Wall mysql_test.cpp -o mysql_test -lmsqlclient

      总结:操作数据库是最常见的了,一般公司都会封装好现成的数据库操作函数,但了解一下封装原理,还是很好的!

     
  • 相关阅读:
    mysql的统计函数(聚合函数)
    mysql中的五子查询
    mysql-蠕虫复制--快速插入数据
    mysql 外键的使用
    我的mysql入门笔记
    阿里云官方 Centos7 源码安装 LAMP环境
    xml格式数据转excel
    mysql的安装配置
    sublime中,怎么把所有的函数代码都折叠起来?
    点击文字或按钮弹出一个DIV窗口(DIV悬浮窗口)
  • 原文地址:https://www.cnblogs.com/liudw-0215/p/9593414.html
Copyright © 2011-2022 走看看