【C/C++學院】(23)Mysql資料庫編程--C語言編程實現mysql用戶端

來源:互聯網
上載者:User

標籤:c語言   c   c++   編程   資料庫   

makefile

.SUFFIXES: .c .oCC=gccSRCS=mysql1.c            mydb.cOBJS=$(SRCS:.c=.o)EXEC=mysql1all: $(OBJS)    $(CC) -o $(EXEC) $(OBJS) -lmysqlclient    @echo ‘-------------ok--------------‘.c.o:    $(CC) -Wall -g -o [email protected] -c $< clean:    rm -f $(OBJS)    rm -f core*

mydb.h

#ifndef MYDB_H_#define MYDB_H_void init_db();int conn_db(const char *hostname, const char *username, const char *password,        const char *dbname);void disconn_db();int open_db(const char *SQL);int exec_db(const char *SQL);#endif /* MYDB_H_ */

mydb.c

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <mysql/mysql.h>#include "mydb.h"MYSQL *connection = NULL;MYSQL mysql;void init_db(){    mysql_init(&mysql);//初始化mysql}int conn_db(const char *hostname, const char *username, const char *password,        const char *dbname){    if (connection)        mysql_close(connection);    connection = mysql_real_connect(&mysql, hostname, username, password,            dbname, 0, 0, 0);//串連到mysql    if (connection == NULL)    {        printf("%s\n", mysql_error(&mysql));        return -1;//串連失敗,返回-1    }    printf("success connect to mysql\n");    return 0;}void disconn_db()//斷開資料庫連接{    if (connection)    {        mysql_close(connection);        connection = NULL;    }}int open_db(const char *SQL)//執行有返回資料集的SQL語句{    int state = mysql_query(connection, SQL);//執行SQL語句    if (state != 0)    {        printf("%s\n", mysql_error(connection));        return -1;//執行失敗,返回-1    }    MYSQL_RES *result = mysql_store_result(connection);//得到查詢結果    if (result == (MYSQL_RES *) NULL)    {        printf("%s\n", mysql_error(connection));        return -1;//執行失敗,返回-1    } else    {        MYSQL_FIELD *sqlField;        int iFieldCount = 0;        while (1)//迴圈遍曆所有欄位        {            sqlField = mysql_fetch_field(result);            if (sqlField == NULL)                break;            printf("%s\t", sqlField->name);//向螢幕列印欄位名            iFieldCount++;        }        printf("\n");//每一行結尾列印一個\n字元        MYSQL_ROW sqlRow;        while (1)//迴圈到每一行        {            sqlRow = mysql_fetch_row(result);            if (sqlRow == NULL)                break;            int i;            for (i = 0; i < iFieldCount; i++)//迴圈得到每一行中的每個欄位            {                if (sqlRow[i] == NULL)                    printf("NULL\t");//如果值為NULL,螢幕列印為"NULL"                else                    printf("%s\t", (const char *)sqlRow[i]);//螢幕列印為欄位內容            }            printf("\n");//每一行結尾列印一個\n字元        }        printf("query is ok, %u rows affected\n", (unsigned int)mysql_affected_rows(connection));        mysql_free_result(result);    }    return 0;}int exec_db(const char *SQL)//執行沒有返回資料集的SQL語句{    int state = mysql_query(connection, SQL);//執行SQL語句    if (state != 0)    {        printf("%s\n", mysql_error(connection));        return -1;    }    printf("query is ok, %u rows affected\n", (unsigned int)mysql_affected_rows(connection));    return 0;}

mysql1.c

#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <errno.h>#include <termios.h>#include "mydb.h"void sqldb(const char *src)//參數src為要執行的SQL語句{    if ((strncmp(src, "select", 6) == 0) || (strncmp(src, "SELECT", 6) == 0)            || (strncmp(src, "show", 4) == 0) || (strncmp(src, "SHOW", 4) == 0)            || (strncmp(src, "desc", 4) == 0) || (strncmp(src, "DESC", 4) == 0))    {        open_db(src);//如果src為有返回資料集SQL語句,那麼調用open_db函數    } else    {        exec_db(src);//如果src為沒有有返回資料集SQL語句,那麼調用exec_db函數    }}void work(const char *userid, const char *password){    init_db();    if (conn_db("localhost", userid, password, "test") != 0)//串連到資料庫    {        return;//串連資料庫失敗,函數退出    }    char buf[2048];    while (1)//迴圈從鍵盤讀取    {        write(STDOUT_FILENO, "mysql1>", strlen("mysql1>"));//螢幕輸出命令提示字元mysql1>        memset(buf, 0, sizeof(buf));        read(STDIN_FILENO, buf, sizeof(buf));//等待使用者從鍵盤輸入        if (strncmp(buf, "quit", 4) == 0)            break;//使用者輸入quit,迴圈break;        sqldb(buf);    }    disconn_db();//斷開資料庫連接}struct termios oldterm;void setstty()//設定輸入退格鍵,不回顯{    //system("stty erase ^H");//執行shell命令,也可以 用來設定讀取使用者鍵盤輸入的時候,退格鍵不回顯    struct termios term;    if(tcgetattr(STDIN_FILENO, &term) == -1)//得到系統termion的設定    {        printf("tcgetattr error is %s\n", strerror(errno));        return;    }    oldterm = term;//保留當前termios設定,以便程式退出的時候可以恢複termios    /*    term.c_lflag &= ~ICANON;//取消ICANON選項(不規範輸入)    term.c_lflag |= ICANON;//設定ICANON選項(規範輸入)    term.c_cc欄位為要設定的具體特殊輸入字元,如c_cc[VERASE]代表退格鍵,    term.c_cc[VERASE] = ‘\b‘;意思為把退格鍵修改為‘\b‘    VERASE代表向前擦出一個字元,VINTR代表發送ctrl + C中斷訊號,ctrl + c的ASCII碼為3    例如:term.c_cc[VINTR] = ‘\t‘;意思為將tab鍵設定為終端訊號    tcsetattr中,第二個參數說明,TCSAFLUSH:發送了所有輸出後更改才生效,在更改發生時,未讀取的所有輸入資料都被刪除    TCSANOW:更改立即生效    TCSADRAIN:發送了所有輸出後更改才發生,如果更改輸出參數則應該使用該選項    */    term.c_cc[VERASE] = ‘\b‘;//‘\b‘為退格鍵的ASCII碼    if (tcsetattr(STDIN_FILENO, TCSANOW, &term) == -1)//設定系統termion    {        printf("tcsetattr error is %s\n", strerror(errno));    }    return;}void returnstty()//恢複系統的termios設定{    if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &oldterm) == -1)//設定系統termion    {        printf("tcsetattr error is %s\n", strerror(errno));    }    return;}int main(int arg, char *args[]){    if (arg < 4)//如果沒有參數,main函數退出    {        return EXIT_FAILURE;    }    if (strncmp(args[1], "-u", 2) != 0)//如果第二個參數不是-u,main函數退出    {        return EXIT_FAILURE;    }    if (strncmp(args[3], "-p", 2) != 0)//如果第四個參數不是-p,main函數退出    {        return EXIT_FAILURE;    }    const char *passwd = getpass("please input password:");//輸入密碼,螢幕不回顯    setstty();//設定輸入退格鍵,不回顯    work(args[2], passwd);    returnstty();//恢複系統的termios設定    return EXIT_SUCCESS;}

【C/C++學院】(23)Mysql資料庫編程--C語言編程實現mysql用戶端

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.