目錄
1.1.5 mysql_store_result()、mysql_use_result()
提問:
1.MySQL數據庫提供的接口有哪些?
2.如何通過c語言使用數據庫?
1.MySQL數據庫提供的接口有哪些?
1.1 綜述
1.1.1 主要流程
- 數據庫結構體初始化:mysql_init()
- 數據庫的連接(登錄 數據庫):mysql_real_connect()
- 對數據庫的操作:mysql_query()
- 讀取操作返回的數據:mysql_store_result(),mysql_fetch_fields() , mysql_num_fields() , mysql_fetch_row() , mysql_free_result()
- 關閉與數據庫的連接 :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()
重要的結構體:(下方鏈接)
頭文件:
#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 executemysql_fetch_row()
until aNULL
value is returned, otherwise, the unfetched rows are returned as part of the result set for your next query. The C API gives the errorCommands 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;
}