【C/C++學院】(23)Mysql資料庫程式設計–C語言程式設計實現mysql客戶端
【送給在路上的程式設計師】
對於一個開發者而言,能夠勝任系統中任意一個模組的開發是其核心價值的體現。
對於一個架構師而言,掌握各種語言的優勢並可以利運用到系統中,由此簡化系統的開發,是其架構生涯的第一步。
對於一個開發團隊而言,能夠在短期內開發出使用者滿意的軟體系統是其核心競爭力的體現。
每一個程式設計師都不能固步自封,要多接觸新的行業,新的技術領域,突破自我。
makefile
.SUFFIXES: .c .o
CC=gcc
SRCS=mysql1.c
mydb.c
OBJS=$(SRCS:.c=.o)
EXEC=mysql1
all: $(OBJS)
$(CC) -o $(EXEC) $(OBJS) -lmysqlclient
@echo `-------------ok--------------`
.c.o:
$(CC) -Wall -g -o $@ -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
", mysql_error(&mysql));
return -1;//連線失敗,返回-1
}
printf("success connect to mysql
");
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
", mysql_error(connection));
return -1;//執行失敗,返回-1
}
MYSQL_RES *result = mysql_store_result(connection);//得到查詢結果
if (result == (MYSQL_RES *) NULL)
{
printf("%s
", 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 ", sqlField->name);//向螢幕列印欄位名
iFieldCount++;
}
printf("
");//每一行結尾列印一個
字元
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 ");//如果值為NULL,螢幕列印為"NULL"
else
printf("%s ", (const char *)sqlRow[i]);//螢幕列印為欄位內容
}
printf("
");//每一行結尾列印一個
字元
}
printf("query is ok, %u rows affected
", (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
", mysql_error(connection));
return -1;
}
printf("query is ok, %u rows affected
", (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
", 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] = ``;意思為把退格鍵修改為``
VERASE代表向前擦出一個字元,VINTR代表傳送ctrl + C中斷訊號,ctrl + c的ASCII碼為3
例如:term.c_cc[VINTR] = ` `;意思為將tab鍵設定為終端訊號
tcsetattr中,第二個引數說明,TCSAFLUSH:傳送了所有輸出後更改才生效,在更改發生時,未讀取的所有輸入資料都被刪除
TCSANOW:更改立即生效
TCSADRAIN:傳送了所有輸出後更改才發生,如果更改輸出引數則應該使用該選項
*/
term.c_cc[VERASE] = ``;//``為退格鍵的ASCII碼
if (tcsetattr(STDIN_FILENO, TCSANOW, &term) == -1)//設定系統termion
{
printf("tcsetattr error is %s
", strerror(errno));
}
return;
}
void returnstty()//恢復系統的termios設定
{
if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &oldterm) == -1)//設定系統termion
{
printf("tcsetattr error is %s
", 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;
}
|========== 吳英強CSDN部落格專欄==========|
|== C/C++學院 專欄文章的內容(不定期更新)===|
|== linux驅動開發 探索linux底層的奧祕 ========|
|== Java基礎學習篇 掌握java語言的基礎知識=====|
|====== 每天進步一點點,健康快樂每一天 ======|
相關文章
- 【C/C++學院】(21)Mysql資料庫程式設計–開發簡介/SQL語句C++MySql資料庫程式設計
- C語言MySQL程式設計示例C語言MySql程式設計
- MySQL的C語言程式設計(一)MySqlC語言程式設計
- C語言呼叫mysql資料庫API實現簡單的mysql客戶端的功能C語言MySql資料庫API客戶端
- 怎樣用c/c++程式設計連線mysql資料庫?C++程式設計MySql資料庫
- C++程式設計實現C++程式設計
- C語言/C++程式設計學習:棧的程式碼實現之陣列方案C語言C++程式設計陣列
- C語言程式設計C語言程式設計
- C++的函數語言程式設計C++函數程式設計
- C語言/C++對程式設計學習的重要性!C語言C++程式設計
- C語言如何實現泛型程式設計?C語言泛型程式設計
- C語言程式設計之《資料輸出》C語言程式設計
- C語言程式設計原理C語言程式設計
- c語言程式設計題C語言程式設計
- C++客戶端程式(socket)C++客戶端
- C++程式設計C++程式設計
- 基於C++程式設計醫院醫學影像系統PACS實現C++程式設計
- Bjarne Stroustrup:概觀C++程式設計語言 (轉)JARC++程式設計
- C 語言程式設計(unix) (轉)程式設計
- 結對程式設計(c語言)程式設計C語言
- The MySQL C API程式設計例項MySqlAPI程式設計
- [C++]C++程式設計例項C++程式設計
- socket程式設計實現tcp伺服器_C/C++程式設計TCP伺服器C++
- c語言程式設計--實驗報告一C語言程式設計
- c語言程式設計——實驗報告六C語言程式設計
- # c語言程式設計——實驗報告一C語言程式設計
- c語言程式設計——實驗報告一C語言程式設計
- c語言程式設計——實驗報告二C語言程式設計
- C語言程式設計—實驗報告四C語言程式設計
- C語言程式設計-實驗報告4C語言程式設計
- python mysql資料庫程式設計PythonMySql資料庫程式設計
- C語言/C++程式設計學習—資料結構—連結串列類的宣告及定義C語言C++程式設計資料結構
- 《C++程式設計教程》C++程式設計
- C++核心程式設計C++程式設計
- C 語言程式設計利器之 CLion程式設計
- C#函數語言程式設計C#函數程式設計
- C語言程式設計基本規範C語言程式設計
- 程式語言設計,程式設計哲學程式設計