C語言實現遠端MySql的增刪改查
阿新 • • 發佈:2018-12-30
mysql_query(MYSQL *connevtion, char *sql)
執行SELECT語句得到查詢結果
MYSQL_RES *mysql_store_result(MYSQL *pmysql);
成功返回一個查詢結果指標,查詢為結果或者錯誤返回NULL
mysql_free_result(MYSQL_RES *result)
呼叫完mysql_store_result,一定要釋放相關資源。
檢視查詢結果的行資訊
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result); //返回的是記錄(行)
檢視查詢結果的欄位資訊
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result); //返回的是欄位(列)
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <errno.h> #include <termios.h> #include <mysql/mysql.h> #define BUFSIZE 1024 MYSQL mysql, *connection = NULL; void deletename(char *SQL) { memset(SQL, 0, BUFSIZE); sprintf(SQL, "%s", "請輸入要幹掉的名字>:"); write(STDOUT_FILENO, SQL, strlen(SQL));// 這句話是替代printf函式的,這樣寫就不需要\n也能像螢幕輸出了 // SQL程式的標準寫法如下所示 char name[1024]; memset(name, 0, sizeof(name)); read(STDIN_FILENO, name, sizeof(name));// 等待使用者輸入要刪除的名字 name[strlen(name) - 1] = 0;// 將字串最後一個回車去掉 memset(SQL, 0, BUFSIZE); sprintf(SQL, "delete from table1 where name = '%s'", name); printf("'%s'\n", SQL); } void insertname(char *SQL) { memset(SQL, 0, BUFSIZE); sprintf(SQL, "%s", "請輸入要插入的名字>:"); write(STDOUT_FILENO, SQL, strlen(SQL));// 這句話是替代printf函式的,這樣寫就不需要\n也能像螢幕輸出了 // SQL程式的標準寫法如下所示 char name[1024]; memset(name, 0, sizeof(name)); read(STDIN_FILENO, name, sizeof(name));// 等待使用者輸入要插入的名字 name[strlen(name) - 1] = 0;// 將字串最後一個回車去掉 sprintf(SQL, "%s", "請輸入要插入的性別>:"); write(STDOUT_FILENO, SQL, strlen(SQL));// 這句話是替代printf函式的,這樣寫就不需要\n也能像螢幕輸出了 char sex[1024]; memset(sex, 0, sizeof(sex)); read(STDIN_FILENO, sex, sizeof(sex));// 等待使用者輸入要插入的性別 sex[strlen(sex) - 1] = 0;// 將字串最後一個回車去掉 sprintf(SQL, "%s", "請輸入要插入的年齡>:"); write(STDOUT_FILENO, SQL, strlen(SQL));// 這句話是替代printf函式的,這樣寫就不需要\n也能像螢幕輸出了 char age[1024]; memset(age, 0, sizeof(age)); read(STDIN_FILENO, age, sizeof(age));// 等待使用者輸入要插入的年齡 age[strlen(age) - 1] = 0;// 將字串最後一個回車去掉 sprintf(SQL, "%s", "請輸入要插入的班級>:"); write(STDOUT_FILENO, SQL, strlen(SQL));// 這句話是替代printf函式的,這樣寫就不需要\n也能像螢幕輸出了 char classid[1024]; memset(classid, 0, sizeof(classid)); read(STDIN_FILENO, classid, sizeof(classid));// 等待使用者輸入要插入的班級 classid[strlen(classid) - 1] = 0;// 將字串最後一個回車去掉 sprintf(SQL, "INSERT INTO table1 (name, sex, age, class) VALUES ('%s', '%s', %s, '%s')", name, sex, age, classid); printf("'%s'\n", SQL); } void updatename(char *SQL) { memset(SQL, 0, BUFSIZE); sprintf(SQL, "%s", "請輸入要修改的名字>:"); write(STDOUT_FILENO, SQL, strlen(SQL));// 這句話是替代printf函式的,這樣寫就不需要\n也能像螢幕輸出了 // SQL程式的標準寫法如下所示 char name[1024]; memset(name, 0, sizeof(name)); read(STDIN_FILENO, name, sizeof(name));// 等待使用者輸入要更新的名字 name[strlen(name) - 1] = 0;// 將字串最後一個回車去掉 memset(SQL, 0, BUFSIZE); sprintf(SQL, "%s", "請輸入要修改的性別>:"); write(STDOUT_FILENO, SQL, strlen(SQL));// 這句話是替代printf函式的,這樣寫就不需要\n也能像螢幕輸出了 // SQL程式的標準寫法如下所示 char sex[1024]; memset(sex, 0, sizeof(sex)); read(STDIN_FILENO, sex, sizeof(sex));// 等待使用者輸入要更新的性別 sex[strlen(sex) - 1] = 0;// 將字串最後一個回車去掉 memset(SQL, 0, BUFSIZE); sprintf(SQL, "%s", "請輸入要修改的年齡>:"); write(STDOUT_FILENO, SQL, strlen(SQL));// 這句話是替代printf函式的,這樣寫就不需要\n也能像螢幕輸出了 // SQL程式的標準寫法如下所示 char age[1024]; memset(age, 0, sizeof(age)); read(STDIN_FILENO, age, sizeof(age));// 等待使用者輸入要更新的性別 age[strlen(age) - 1] = 0;// 將字串最後一個回車去掉 memset(SQL, 0, BUFSIZE); sprintf(SQL, "%s", "請輸入要修改的班級>:"); write(STDOUT_FILENO, SQL, strlen(SQL));// 這句話是替代printf函式的,這樣寫就不需要\n也能像螢幕輸出了 // SQL程式的標準寫法如下所示 char classes[1024]; memset(classes, 0, sizeof(classes)); read(STDIN_FILENO, classes, sizeof(classes));// 等待使用者輸入要更新的班級 classes[strlen(classes) - 1] = 0;// 將字串最後一個回車去掉 memset(SQL, 0, BUFSIZE); sprintf(SQL, "UPDATA table1 SET sex = '%s', age = '%s', class = '%s' WHERE name = '%s'", sex, age, classes, name); printf("'%s'\n", SQL); } void selectname(char *SQL) { /* char SQL[1024]; memset(SQL, 0, BUFSIZE); sprintf(SQL, "%s", "請輸入要查詢的名字>:"); write(STDOUT_FILENO, SQL, strlen(SQL));// 這句話是替代printf函式的,這樣寫就不需要\n也能像螢幕輸出了 char name[1024]; memset(name, 0, sizeof(name)); read(STDIN_FILENO, name, sizeof(name));// 等待使用者輸入要更新的名字 name[strlen(name) - 1] = 0;// 將字串最後一個回車去掉 memset(SQL, 0, BUFSIZE); if (strlen(name) == 0) { sprintf(SQL, "SELECT * FROM table1"); } else { sprintf(SQL, "SELECT * FROM table1 WHERE name = '%s'", name); } */ if (mysql_query(connection, SQL) != 0) { printf("query error, %s\n", mysql_error(&mysql)); } // 呼叫mysql__stor_result得到查詢結果,放到result當中 MYSQL_RES *result = mysql_store_result(connection); // 要知道返回資料有多少列才能自由的使用各種SELECT語句 MYSQL_FIELD *field; int iFieldCount = 0; while (1) { field = mysql_fetch_field(result);// 迴圈得到列名,如果迴圈到列的最後,返回NULL if (field == NULL) break; iFieldCount++; printf("%s\t", field->name); } printf("\n"); // 迴圈遍歷每一行 MYSQL_ROW row; while (1) { row = mysql_fetch_row(result); if (row == NULL) break; int i = 0; for (; i < iFieldCount; i++) { printf("%s\t", (const char*)row[i]); } printf("\n"); } mysql_free_result(result); } int main(int arg, char *args[]) { if (arg < 5) { return -1; } mysql_init(&mysql); // 相當於SQL內部初始化了一個TCP的socket,同時初始化了SQL必須的記憶體和一些結構 // 連線mysql_server connection = mysql_real_connect(&mysql, args[1], args[2], args[3], args[4], 0, 0, 0); if (connection == NULL) { printf("connect error %s\n", mysql_error(&mysql)); return -1; } if (mysql_query(connection, "SET NAMES utf8") != 0) { printf("設定字符集錯誤, %s\n", mysql_error(&mysql)); } char buf[BUFSIZE]; memset(buf, 0, sizeof(buf)); strcpy(buf, "請選擇\n1:插入\n2:刪除\n3:修改\n4:查詢\n"); write(STDOUT_FILENO, buf, sizeof(buf)); memset(buf, 0, sizeof(buf)); read(STDIN_FILENO, buf, sizeof(buf)); if (strncmp(buf, "4", 1) == 0) { memset(buf, 0, sizeof(buf)); strcpy(buf, "請輸入任意SELECT語句:"); write(STDOUT_FILENO, buf, sizeof(buf)); memset(buf, 0, sizeof(buf)); read(STDIN_FILENO, buf, sizeof(buf)); selectname(buf); } else { if (strncmp(buf, "1", 1) == 0) { insertname(buf); } if (strncmp(buf, "2", 1) == 0) { deletename(buf); } if (strncmp(buf, "3", 1) == 0) { updatename(buf); } mysql_query(connection, buf); } mysql_close(connection); return EXIT_SUCCESS; } /* 下面測試 printf("AAAAAAAAAAAA");// 這個時候printf會吧輸出的字串放到輸出緩衝區裡面,直到遇到\n才會輸出,或者輸出緩衝區滿了 memset(name, 0, sizeof(name)); read(STDIN_FILENO, name, sizeof(name));// 等待使用者輸入要刪除的名字 name[strlen(name) - 1] = 0;// 將字串最後一個回車去掉 */ /*struct termios term; // 定義一個termios結構 if (tcgetattr(STDIN_FILENO, &term) == -1) { printf("tchetattr error is %s\n", strerror(errno)); return 0; } // oldterm = term; // 保留當前termios設定,以便程式退出的時候可以恢復termios //term.c_lflag &= ~ICANON;// 取消ICANON選項(不規範輸入) //term.c_lflag |= ICANON;// 設定ICNON選項(規範輸入) //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)); } //system("stty erase ^H");// 可以實現在輸入狀態下,按退格鍵刪除,不回顯,等同於上面功能 */