Mysql —— linux下使用c语言访问mySql数据库
生活随笔
收集整理的這篇文章主要介紹了
Mysql —— linux下使用c语言访问mySql数据库
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
示例1:#include<stdio.h>#include<mysql.h>int?main(){MYSQL?mysql;mysql_init(&mysql);if(!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0)){fprintf(stderr,"Failedtoconnecttodatabase:Error:%s\n",mysql_error(&mysql));}mysql_close(&mysql);return?0;}示例2(linux下使用c語言訪問mySql數據庫):
/********************************************* 編譯命令:gcc aa.c -lmysqlclient -o aa* 執行命令:./aa* ******************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "mysql/mysql.h"MYSQL *g_conn;//mysql 鏈接
MYSQL_RES *g_res;//mysql 記錄集
MYSQL_ROW g_row;//字符串數組,mysql 記錄行const char *g_host_name = "localhost";
const char *g_user_name = "root";
const char *g_password = "asdfgh";
const char *g_db_name = "test";
const unsigned int g_db_port = 3306;#define MAX_BUF_SIZE 1024 //緩沖區最大字節數
char sql[MAX_BUF_SIZE];
char Time[MAX_BUF_SIZE];int iNum_rows = 0;//mysql語句執行結果返回行數賦初值
int flag = 0;//管理員權限開關
int i = 1;//系統運行開關 /***************************************************** time : 20180622* addby : swj* function :print_mysql_error() 打印錯誤信息* ******************************************************/
void print_mysql_error(const char *msg)
{if(msg)printf("%s: %s\n",msg,mysql_error(g_conn));elseputs(mysql_error(g_conn));
}
/***************************************************** time : 20180622* addby : swj* function :executesql() 執行sql語句,成功返回0,失敗返回-1 ******************************************************/
int executesql(const char * sql)
{if(mysql_real_query(g_conn,sql,strlen(sql)))return -1;return 0;
}
/***************************************************** time : 20180622* addby : swj* function :init_mysql() 初始化鏈接******************************************************/
int init_mysql()
{//init the database connection g_conn = mysql_init(NULL);//connection the database if(!mysql_real_connect(g_conn,g_host_name,g_user_name,g_password,g_db_name,g_db_port,NULL,0))return -1;//鏈接失敗if(executesql("set names utf8"))return -1;return 0; //返回成功
}
/***************************************************** * time : 20180622* * addby : swj* * function :create_database() 選擇數據庫 沒有的時候 創建數據;有的時候 進去數據* 庫 * ******************************************************/
void create_database()
{sprintf(sql,"use workdata");if(executesql(sql) == -1){puts("create database");executesql("create database workdata;");print_mysql_error(NULL);puts("choice database");executesql("use workdata;");print_mysql_error(NULL);puts("!!!Initialize the success!!!");}else{executesql("use workdata;");print_mysql_error(NULL);}}
/***************************************************** * time : 20180622* * addby : swj* * function :create_table() 創建表 * ******************************************************/
void create_table()
{sprintf(sql,"show tables;");executesql(sql);g_res = mysql_store_result(g_conn);iNum_rows = mysql_num_rows(g_res);if(iNum_rows == 0){puts("create users table");executesql("create table users(id_ int(11) unsigned primary key auto_increment,name_ char(255) not null unique,password_ char(32) not null,create_time_ datetime,creator_id_ int(11) unsigned,auth_type_ int(11) not null,dyn_sn_ char(10),dyn_pass_sn_ text,remark_ varchar(200),foreign key(creator_id_) references users(id_));");}mysql_free_result(g_res);//釋放結果集
}
/***************************************************** * time : 20180622* * addby : swj* * function :init_administrator() 初始化管理員賬戶* * 管理員用戶名:root 密碼:root* * ******************************************************/
void init_administrator()
{sprintf(sql,"select * from users where id_='1' and name_='root';");executesql(sql);g_res = mysql_store_result(g_conn);iNum_rows = mysql_num_rows(g_res);if(iNum_rows == 0){puts("Init Administrtor User");sprintf(sql,"insert into users values(1,'root','root','2017-08-18 12:21:11',1,0,'','','0:VIP 1:local pwd 2:local cert');");executesql(sql);}mysql_free_result(g_res);//釋放結果集
}
int main(void)
{puts("!!!The system is initializing!!!");/*初始化鏈接*///在初始化的時候 數據庫 test 是必須事先創建好的 否則會報錯Unknown database 'test' if(init_mysql())print_mysql_error(NULL);//當鏈接數據庫時候 有錯誤 會報錯//選擇數據庫workdata 沒有的時候 創建數據庫 有的時候 進去數據庫create_database(); //創建表create_table();//初始化管理員賬戶init_administrator();
//操作數據庫 查詢數據庫 表中的信息if(executesql("select * from users"))print_mysql_error(NULL);g_res = mysql_store_result(g_conn); // 從服務器傳送結果集至本地,mysql_use_result直接使用服務器上的記錄集 int iNum_rows = mysql_num_rows(g_res); // 得到記錄的行數 int iNum_fields = mysql_num_fields(g_res); // 得到記錄的列數 printf("共%d個記錄,每個記錄%d字段\n", iNum_rows, iNum_fields);printf("id_ | name_ |password_| create_time_ |creator_id_ | auth_type_ |dyn_sn_| dyn_pass_sn_ |remark_ \n");while ((g_row=mysql_fetch_row(g_res))) // 打印結果集printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",g_row[0],g_row[1],g_row[2],g_row[3],g_row[4],g_row[5],g_row[6],g_row[7],g_row[8]); // 第一,第二字段mysql_free_result(g_res); // 釋放結果集mysql_close(g_conn);return EXIT_SUCCESS;
}
當直接編譯.c文件的時候:會出現/tmp/ccp5dIsd.o:在函數‘print_mysql_error’中:aa.c:(.text+0x1e):對‘mysql_error’未定義的引用aa.c:(.text+0x48):對‘mysql_error’未定義的引用/tmp/ccp5dIsd.o:在函數‘executesql’中:aa.c:(.text+0x83):對‘mysql_real_query’未定義的引用………………錯誤是因為沒有進行編譯gcc aa.c -lmysqlclient -o aa
當test數據庫沒有事先創建好(Unknown database 'test'):當test數據庫事先創建好:https://baike.baidu.com/item/mysql_real_connect/4007597?fr=aladdinmysql_real_connect中文名數據庫聯接參數外文名mysql_real_connect頭文件#include<mysql.h>函數說明運行MySQL數據庫引擎建立連接
函數原型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)
第1個參數應是已有MYSQL結構的地址。調用mysql_real_connect()之前,必須調用mysql_init()來初始化MYSQL結構。通過mysql_options()調用,可更改多種連接選項。
“host”的值必須是主機名或IP地址。如果“host”是NULL或字符串"localhost",連接將被視為與本地主機的連接。如果操作系統支持套接字(Unix)或命名管道(Windows),將使用它們而不是TCP/IP連接到服務器。(host參數決定了聯接的類型)
“user”參數包含用戶的MySQL登錄ID。如果“user”是NULL或空字符串"",用戶將被視為當前用戶。在UNIX環境下,它是當前的登錄名。在Windows ODBC下,必須明確指定當前用戶名。
“passwd”參數包含用戶的密碼。如果“passwd”是NULL,僅會對該用戶的(擁有1個空密碼字段的)用戶表中的條目進行匹配檢查。這樣,數據庫管理員就能按特定的方式設置MySQL權限系統,根據用戶是否擁有指定的密碼,用戶將獲得不同的權限。
“db”是數據庫名稱。如果db為NULL,連接會將默認的數據庫設為該值。
如果“port”不是0,其值將用作TCP/IP連接的端口號。注意,“host”參數決定了連接的類型。如果unix_socket不是NULL,該字符串描述了應使用的套接字或命名管道。注意,“host”參數決定了連接的類型。
client_flag的值通常為0,但是,也能將其設置為下述標志的組合,以允許特定功能:
返回值如果連接成功,返回MYSQL*連接句柄。如果連接失敗,返回NULL。對于成功的連接,返回值與第1個參數的值相同參考鏈接:https://blog.csdn.net/happy_stars_2016/article/details/52664656
| 1、聯接數據庫 (test需要提前創建好)2、創建新的數據庫(workdata)3、創建user表 4、向表中插入信息 作為管理員的信息5、使用sql語句查詢表中的信息 |
| 執行結果顯示 |
當test數據庫沒有事先創建好(Unknown database 'test'):當test數據庫事先創建好:https://baike.baidu.com/item/mysql_real_connect/4007597?fr=aladdinmysql_real_connect中文名數據庫聯接參數外文名mysql_real_connect頭文件#include<mysql.h>函數說明運行MySQL數據庫引擎建立連接
函數原型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)
第1個參數應是已有MYSQL結構的地址。調用mysql_real_connect()之前,必須調用mysql_init()來初始化MYSQL結構。通過mysql_options()調用,可更改多種連接選項。
“host”的值必須是主機名或IP地址。如果“host”是NULL或字符串"localhost",連接將被視為與本地主機的連接。如果操作系統支持套接字(Unix)或命名管道(Windows),將使用它們而不是TCP/IP連接到服務器。(host參數決定了聯接的類型)
“user”參數包含用戶的MySQL登錄ID。如果“user”是NULL或空字符串"",用戶將被視為當前用戶。在UNIX環境下,它是當前的登錄名。在Windows ODBC下,必須明確指定當前用戶名。
“passwd”參數包含用戶的密碼。如果“passwd”是NULL,僅會對該用戶的(擁有1個空密碼字段的)用戶表中的條目進行匹配檢查。這樣,數據庫管理員就能按特定的方式設置MySQL權限系統,根據用戶是否擁有指定的密碼,用戶將獲得不同的權限。
“db”是數據庫名稱。如果db為NULL,連接會將默認的數據庫設為該值。
如果“port”不是0,其值將用作TCP/IP連接的端口號。注意,“host”參數決定了連接的類型。如果unix_socket不是NULL,該字符串描述了應使用的套接字或命名管道。注意,“host”參數決定了連接的類型。
client_flag的值通常為0,但是,也能將其設置為下述標志的組合,以允許特定功能:
| 標志名稱標志描述CLIENT_COMPRESS使用壓縮協議。CLIENT_FOUND_ROWS返回發現的行數(匹配的),而不是受影響的行數。CLIENT_IGNORE_SPACE允許在函數名后使用空格。使所有的函數名成為保留字。CLIENT_INTERACTIVE關閉連接之前,允許interactive_timeout秒的不活動時間。CLIENT_LOCAL_FILES允許LOAD DATA LOCAL處理功能。CLIENT_MULTI_STATEMENTS通知服務器,客戶端可能在單個字符串內發送多條語句。CLIENT_MULTI_RESULTS通知服務器,客戶端能夠處理來自多語句執行。CLIENT_NO_SCHEMA禁止db_name.tbl_name.col_name語法。CLIENT_ODBC客戶端是ODBC客戶端。它將mysqld變得更為ODBC友好。CLIENT_SSL使用SSL,該選項不應由應用程序設置,而是在客戶端庫內部設置。對于某些參數,能夠從選項文件獲得取值,而不是取得mysql_real_connect()調用中的確切值。為此,在調用mysql_real_connect()之前,應與MYSQL_READ_DEFAULT_FILE或MYSQL_READ_DEFAULT_GROUP選項一起調用mysql_options()。隨后,在mysql_real_connect()調用中,為準備從選項文件讀取值的每個參數指定“無值”值:對于host,指定NULL值或空字符串("")。對于user,指定NULL值或空字符串。對于passwd,指定NULL值。(對于密碼,mysql_real_connect()調用中的空字符串的值不能被選項文件中的字符串覆蓋,這是因為,空字符串明確指明MySQL賬戶必須有空密碼)。對于db,指定NULL值或空字符串對于port,指定“0”值。對于unix_socket,指定NULL值。對于某一參數,如果在選項文件中未發現值,將使用它的默認值,如本節前面介紹的那樣。 |
返回值如果連接成功,返回MYSQL*連接句柄。如果連接失敗,返回NULL。對于成功的連接,返回值與第1個參數的值相同參考鏈接:https://blog.csdn.net/happy_stars_2016/article/details/52664656
總結
以上是生活随笔為你收集整理的Mysql —— linux下使用c语言访问mySql数据库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell脚本——expect命令
- 下一篇: Mysql —— C语言链接mysql数