Linuxcentos7/ubantu下:用C語言連線MySQL資料庫

2020柳發表於2018-09-05

  前言:最近用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

 

  總結:運算元據庫是最常見的了,一般公司都會封裝好現成的資料庫操作函式,但瞭解一下封裝原理,還是很好的!

 

 

作者:柳德維

——————————————-

個性簽名:獨學而無友,則孤陋而寡聞。做一個靈魂有趣的人!

如果覺得這篇文章對你有小小的幫助的話,記得在右下角點個“推薦”哦,博主在此感謝!

萬水千山總是情,打賞一分行不行,所以如果你心情還比較高興,也是可以掃碼打賞博主,哈哈哈(っ•̀ω•́)っ⁾⁾!


相關文章