MySQL數據庫c語言接口

目錄

提問:

        1.MySQL數據庫提供的接口有哪些?

        2.如何通過c語言使用數據庫?

1.MySQL數據庫提供的接口有哪些?

1.1 綜述

1.1.1 主要流程

1.1.2 mysql_init()

1.1.3 mysql_real_connect()

1.1.4 mysql_query()

1.1.5 mysql_store_result()、mysql_use_result()


提問:

        1.MySQL數據庫提供的接口有哪些?

        2.如何通過c語言使用數據庫?

1.MySQL數據庫提供的接口有哪些?

1.1 綜述

1.1.1 主要流程

  1. 數據庫結構體初始化:mysql_init()
  2. 數據庫的連接(登錄 數據庫):mysql_real_connect()
  3. 對數據庫的操作:mysql_query()
  4. 讀取操作返回的數據:mysql_store_result(),mysql_fetch_fields() ,  mysql_num_fields() ,  mysql_fetch_row()  , mysql_free_result()
  5. 關閉與數據庫的連接 :mysql_close()
  • 在linux中構建的Makefile工程要安裝 libmysqlclient-dev 才能使用API接口的頭文件。 
    命令:sudo apt-get install libmysqlclient-dev

  • 安裝好後的頭文件在:/usr/include/mysql

  • 編譯模板爲

	gcc query.c -o query_mysql -I /usr/include/mysql/ -lmysqlclient

 

1.1.2 mysql_init()

MYSQL *mysql_init(MYSQL *mysql);

初始化MYSQL結構體。

 

1.1.3 mysql_real_connect()

重要的結構體:(下方鏈接)

MySQL官方文檔——數據結構

頭文件:

#include <mysql/mysql.h>

 

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)

與數據庫建立連接。
參數*mysql爲一個指針,指向現有MYSQL結構體。
參數host爲一個字符串,可以爲主機名或ip地址
        爲NULL或"localhost",與本地主機連接。在Unix上,客戶端使用Unix套接字文件進行連接。
參數user指定登錄的用戶名
參數passwd指定登錄的密碼
參數db指定登錄的數據庫
參數port指定使用的端口號,如果port不爲0,則該值用作TCP / IP連接的端口號。
參數unix_socket 不爲NULL,指定要使用的套接字或命名管道。可以爲NULL。
參數client_flag用來開啓某些特殊功能,一般爲0

 

1.1.4 mysql_query()

int mysql_query(MYSQL *mysql, const char *stmt_str);


執行以null結尾的字符串指向的SQL語句stmt_str。通常,字符串必須由單個SQL語句組成,而不包含終止分號(;)或\g。
成功返回0,執行錯誤返回非0 。

 

1.1.5 mysql_store_result()mysql_use_result()

MYSQL_RES *mysql_use_result(MYSQL *mysql);

MYSQL_RES *mysql_store_result(MYSQL *mysql);

獲得結果集

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

從結果集中,取出一行

void mysql_free_result(MYSQL_RES *result);

釋放結果集,方便下一次使用。
不釋放,下次使用會失敗。
  • mysql_use_result()啓動結果集檢索,但實際上並沒有將結果集讀取到客戶端中,mysql_store_result()也是一樣的。相反,必須通過調用來mysql_fetch_row()單獨檢索每一行。這會直接從服務器讀取查詢結果,而不會將其存儲在臨時表或本地緩衝區中,這樣會更快並且使用的內存要少得多。客戶端僅爲當前行和可能長到max_allowed_packet字節的通信緩衝區分配內存 。
  • When using mysql_use_result(), you must execute mysql_fetch_row() until a NULL value is returned, otherwise, the unfetched rows are returned as part of the result set for your next query. The C API gives the error Commands out of sync; you can't run this command now if you forget to do this!
  • 先給一個例子吧!有下面的例子可只只需要改變query裏的命令既可以實現增刪查改。
#include <mysql/mysql.h>
#include <stdio.h>
#include <string.h>
int main(int argc,char* argv[])
{
	if(argc!=2)
	{
		printf("error args\n");
		return -1;
	}
	MYSQL *conn;
	MYSQL_RES *res;
	MYSQL_ROW row;
	char* server="localhost";
	char* user="root";
	char* password="123";
	char* database="test";    //要訪問的數據庫名稱
	char query[300]="select * from person where name='";
	sprintf(query,"%s%s%s",query, argv[1],"'");
	puts(query);
	int t;

        //初始化conn
	conn=mysql_init(NULL);
        //建立與數據庫的連接
	if(!mysql_real_connect(conn,server,user,password,database,0,NULL,0))
	{
		printf("Error connecting to database:%s\n",mysql_error(conn));
		return -1;
	}else{
		printf("Connected...\n");
	}
        //通過query中語句,查詢消息
	t=mysql_query(conn,query);
	if(t)
	{
		printf("Error making query:%s\n",mysql_error(conn));
	}else{
                 //得到結果集
		res=mysql_use_result(conn);
		if(res)
		{
            printf("use result\n");
                        //循環讀取每一行,爲NULL就退出
			while((row=mysql_fetch_row(res))!=NULL)
			{	
			         //printf("num=%d\n",mysql_num_fields(res));//獲取列數
				for(t=0;t<mysql_num_fields(res);t++)
				{
						printf("%8s ",row[t]);
				}
				printf("\n");
			}
		}else{
			printf("Don't find data\n");
		}
                  //釋放結果集,不然無法保證再次使用
		mysql_free_result(res);
	}
        //關閉數據庫連接
	mysql_close(conn);
	return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章