前言:最近用IPC、socket做ATM、聊天項目,考慮到需要用到數據庫,所以總結一下centos、ubantu環境下怎么用C語言操作數據庫,例如常見的增刪改查等!
一、Centos環境安裝mysql
要想進行 C 語言連接MySQL數據庫的操作,那么首先要安裝數據庫,安裝數據庫挺簡單的,這里暫不介紹了。等到 MySQL 安裝完畢之后,就可以在 C 語言下連接MySQL數據庫了。
首先要安裝一個叫 mysql-devel
東西,這個是一個驅動 通過 yum install mysql-devel
命令安裝,然后就是在命令行中執行 vim sql.c
命令,然后寫代碼。
二、介紹數據庫相關函數
- 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(指定特定功能) - mysql_real_query
函數原型:int mysql_real_query(MYSQL *mysql, const char *query, unsigned int length)
參數說明:
query:SQL語句;
length:SQL語句長度 - mysql_store_result
函數原型:MYSQL_RES *mysql_store_result(MYSQL *mysql)
返回值說明:具有多個結果的MYSQL_RES結果集合。如果出現錯誤,返回NULL。 - 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\n請選擇功能\n"); 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\n2.select\n3.delete\n"); 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\n", insert_query); res = mysql_query(&conn, insert_query); if (!res) { printf("insert %lu rows\n", (unsigned long)mysql_affected_rows(&conn)); } else { printf("insert error\n"); } break; case 2: //select printf("SQL語句: %s\n", select_query); if (mysql_query(&conn, select_query) != 0) { fprintf(stderr, "查詢失敗\n"); exit(1); } else { if ((result = mysql_store_result(&conn)) == NULL) { fprintf(stderr, "保存結果集失敗\n"); exit(1); } else { while ((row = mysql_fetch_row(result)) != NULL) { printf("name is %s , ", row[0]); printf("age is %s\n", row[1]); } } } break; case 3: //delete printf("姓名\n"); scanf("%s", str1); strcat(delete_query, str1); strcat(delete_query, "'"); printf("SQL語句: %s\n", delete_query); res = mysql_real_query(&conn, delete_query, (unsigned int)strlen(delete_query)); if (!res) { printf("delete successful\n"); } else { printf("delete error\n"); } 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
安裝過程中會提示設置密碼什么的,注意設置了不要忘了,安裝完成之后可以使用如下命令來檢查是否安裝成功:
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\n", mysql_error(conn)); exit(1); } if (mysql_query(conn, "show tables")) { fprintf(stderr, "%s\n", mysql_error(conn)); exit(1); } res = mysql_use_result(conn); printf("MySQL Tables in mysql database:\n"); while ((row = mysql_fetch_row(res)) != NULL) { printf("%s \n", row[0]); } mysql_free_result(res); mysql_close(conn); printf("finish! \n"); return 0; }
編譯代碼的時候需要鏈接mysql的庫,可以通過如下方式編譯:
g++ -Wall mysql_test.cpp -o mysql_test -lmsqlclient
總結:操作數據庫是最常見的了,一般公司都會封裝好現成的數據庫操作函數,但了解一下封裝原理,還是很好的!