C語言連線mysql簡單查詢例項入門-mysql_init,mysql_real_connect,mysql_query,mysql_close等
一: 分配或初始化與mysql_real_connect()相適應的MYSQL物件。用mysql_init()函式。
MYSQL *mysql_init(MYSQL *mysql)
描述
分配或初始化與mysql_real_connect()相適應的MYSQL物件。如果mysql是NULL指標,該函式將分配、初始化、並返回新物件。否則,將初始化物件,並返回物件的地址。如果mysql_init()分配了新的物件,當呼叫mysql_close()來關閉連線時。將釋放該物件。
返回值
初始化的MYSQL*控制程式碼。如果無足夠記憶體以分配新的物件,返回NULL。
錯誤
在記憶體不足的情況下,返回NULL。
二:連線資料庫引擎,通過函式mysql_real_connect()嘗試與執行在主機上的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)
描述
mysql_real_connect()嘗試與執行在主機上的MySQL資料庫引擎建立連線。在你能夠執行需要有效MySQL連線控制程式碼結構的任何其他API函式之前,mysql_real_connect()必須成功完成。
引數的指定方式如下:
· 第1個引數應是已有MYSQL結構的地址。呼叫mysql_real_connect()之前,必須呼叫mysql_init()來初始化MYSQL結構。通過mysql_options()呼叫,可更改多種連線選項。請參見25.2.3.48節,“mysql_options()”。
· “host”的值必須是主機名或IP地址。如果“host”是NULL或字串"localhost",連線將被視為與本地主機的連線。如果作業系統支援套接字(Unix)或命名管道(Windows),將使用它們而不是TCP/IP連線到伺服器。
· “user”引數包含使用者的MySQL登入ID。如果“user”是NULL或空字串"",使用者將被視為當前使用者。在UNIX環境下,它是當前的登入名。在Windows ODBC下,必須明確指定當前使用者名稱。請參見26.1.9.2節,“在Windows上配置MyODBC DSN”。
· “passwd”引數包含使用者的密碼。如果“passwd”是NULL,僅會對該使用者的(擁有1個空密碼欄位的)使用者表中的條目進行匹配檢查。這樣,資料庫管理員就能按特定的方式設定MySQL許可權系統,根據使用者是否擁有指定的密碼,使用者將獲得不同的許可權。
註釋:呼叫mysql_real_connect()之前,不要嘗試加密密碼,密碼加密將由客戶端API自動處理。
· “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(取代了wait_timeout)秒的不活動時間。客戶端的會話wait_timeout變數被設為會話interactive_timeout變數的值。 |
CLIENT_LOCAL_FILES |
允許LOAD DATA LOCAL處理功能。 |
CLIENT_MULTI_STATEMENTS |
通知伺服器,客戶端可能在單個字串內傳送多條語句(由‘;’隔開)。如果未設定該標誌,將禁止多語句執行。 |
CLIENT_MULTI_RESULTS |
通知伺服器,客戶端能夠處理來自多語句執行或儲存程式的多個結果集。如果設定了CLIENT_MULTI_STATEMENTS,將自動設定它。 |
CLIENT_NO_SCHEMA |
禁止db_name.tbl_name.col_name語法。它用於ODBC。如果使用了該語法,它會使分析程式生成錯誤,在捕獲某些ODBC程式中的缺陷時,它很有用。 |
CLIENT_ODBC |
客戶端是ODBC客戶端。它將mysqld變得更為ODBC友好。 |
CLIENT_SSL |
使用SSL(加密協議)。該選項不應由應用程式設定,它是在客戶端庫內部設定的。 |
返回值
如果連線成功,返回MYSQL*連線控制程式碼。如果連線失敗,返回NULL。對於成功的連線,返回值與第1個引數的值相同。
三:查詢資料庫中的某一個表內容,通過函式mysql_query()來實現。
本例呼叫為:mysql_query(connect, "select * from dept);
int mysql_query(MYSQL *mysql, const char *query)
描述
執行由“Null終結的字串”查詢指向的SQL查詢。正常情況下,字串必須包含1條SQL語句,而且不應為語句新增終結分號(‘;’)或“\g”。如果允許多語句執行,字串可包含多條由分號隔開的語句。請參見25.2.9節,“多查詢執行的C API處理”。
mysql_query()不能用於包含二進位制資料的查詢,應使用mysql_real_query()取而代之(二進位制資料可能包含字元‘\0’,mysql_query()會將該字元解釋為查詢字串結束)。
如果希望瞭解查詢是否應返回結果集,可使用mysql_field_count()進行檢查。請參見25.2.3.22節,“mysql_field_count()”。
返回值
如果查詢成功,返回0。如果出現錯誤,返回非0值。
查詢的結果需要mysql_store_result來獲取。查詢的結果通過結構體mysql關聯。
四:顯示查詢資料庫中資料表的內容,mysql_store_result()將mysql_query()查詢的全部結果讀取到客戶端,分配1個MYSQL_RES結構,並將結果置於該結構中。
此時應該注意,查詢的結果有可能是多行。
應該呼叫函式mysql_field_count()返回表的列數。
可以呼叫函式mysql_fetch_row()來獲取多行結果的一行內容。
可以通過函式mysql_fetch_fields()來獲取表頭的內容。
MYSQL_RES *mysql_store_result(MYSQL *mysql)
描述
對於成功檢索了資料的每個查詢(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必須呼叫mysql_store_result()或mysql_use_result() 。
對於其他查詢,不需要呼叫mysql_store_result()或mysql_use_result(),但是如果在任何情況下均呼叫了mysql_store_result(),它也不會導致任何傷害或效能降低。通過檢查mysql_store_result()是否返回0,可檢測查詢是否沒有結果集(以後會更多)。
如果希望瞭解查詢是否應返回結果集,可使用mysql_field_count()進行檢查。請參見25.2.3.22節,“mysql_field_count()”。
mysql_store_result()將查詢的全部結果讀取到客戶端,分配1個MYSQL_RES結構,並將結果置於該結構中。
如果查詢未返回結果集,mysql_store_result()將返回Null指標(例如,如果查詢是INSERT語句)。
如果讀取結果集失敗,mysql_store_result()還會返回Null指標。通過檢查mysql_error()是否返回非空字串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以檢查是否出現了錯誤。
如果未返回行,將返回空的結果集。(空結果集設定不同於作為返回值的空指標)。
一旦呼叫了mysql_store_result()並獲得了不是Null指標的結果,可呼叫mysql_num_rows()來找出結果集中的行數。
可以呼叫mysql_fetch_row()來獲取結果集中的行,或呼叫mysql_row_seek()和mysql_row_tell()來獲取或設定結果集中的當前行位置。
一旦完成了對結果集的操作,必須呼叫mysql_free_result()。
請參見25.2.13.1節,“為什麼在mysql_query()返回成功後,mysql_store_result()有時會返回NULL”.
返回值
具有多個結果的MYSQL_RES結果集合。如果出現錯誤,返回NULL。
mysql_field_count()簡介:
unsigned int mysql_field_count(MYSQL *mysql)
描述
返回作用在連線上的最近查詢的列數。
該函式的正常使用是在mysql_store_result()返回NULL(因而沒有結果集指標)時。在這種情況下,可呼叫mysql_field_count()來判定mysql_store_result()是否應生成非空結果。這樣,客戶端就能採取恰當的動作,而無需知道查詢是否是SELECT(或類似SELECT的)語句。在這裡給出的示例中,演示了完成它的方法。
請參見25.2.13.1節,“為什麼在mysql_query()返回成功後,mysql_store_result()有時會返回NULL”.
返回值
表示結果集中列數的無符號整數。
錯誤
無。
mysql_fetch_row()簡介:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
描述
檢索結果集的下一行。在mysql_store_result()之後使用時,如果沒有要檢索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之後使用時,如果沒有要檢索的行或出現了錯誤,mysql_fetch_row()返回NULL。
行內值的數目由mysql_num_fields(result)給出。如果行中儲存了呼叫mysql_fetch_row()返回的值,將按照row[0]到row[mysql_num_fields(result)-1],訪問這些值的指標。行中的NULL值由NULL指標指明。
可以通過呼叫mysql_fetch_lengths()來獲得行中欄位值的長度。對於空欄位以及包含NULL的欄位,長度為0。通過檢查欄位值的指標,能夠區分它們。如果指標為NULL,欄位為NULL,否則欄位為空。
返回值
下一行的MYSQL_ROW結構。如果沒有更多要檢索的行或出現了錯誤,返回NULL。
錯誤
注意,在對mysql_fetch_row()的兩次呼叫之間,不會復位錯誤。
· CR_SERVER_LOST
在查詢過程中,與伺服器的連線丟失。
· CR_UNKNOWN_ERROR
出現未知錯誤。
mysql_fetch_fields()簡介:
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)
描述
對於結果集,返回所有MYSQL_FIELD結構的陣列。每個結構提供了結果集中1列的欄位定義。
返回值
關於結果集所有列的MYSQL_FIELD結構的陣列。
錯誤
無。
示例:
unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *fields;
num_fields = mysql_num_fields(result);
fields = mysql_fetch_fields(result);
for(i = 0; i < num_fields; i++)
{
printf("Field %u is %s\n", i, fields[i].name);
}
五:釋放記憶體,釋放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等為結果集分配的記憶體。
void mysql_free_result(MYSQL_RES *result)
描述
釋放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等為結果集分配的記憶體。完成對結果集的操作後,必須呼叫mysql_free_result()釋放結果集使用的記憶體。
釋放完成後,不要嘗試訪問結果集。
返回值
無。
錯誤
無。
六:關閉前面開啟的mysql連線。
void mysql_close(MYSQL *mysql)
描述
關閉前面開啟的連線。如果控制程式碼是由mysql_init()或mysql_connect()自動分配的,mysql_close()還將解除分配由mysql指向的連線控制程式碼。
返回值
無。
錯誤
無。
通過mysql客戶端來查詢資料庫test中表department的內容:
通過C語言程式呼叫Mysql的API函式來查詢資料庫test中表department的內容:
原始碼:
/*************************************************************************
> File Name:mysql_test.c
> Author:
> Mail:
> Created Time: 2016年02月11日 星期四 10時45分31秒
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>
int main()
{
int ret = 0;
MYSQL mysql;
MYSQL * connect = NULL;
connect = mysql_init(&mysql);
if(connect == NULL){
ret = mysql_errno(&mysql);
printf("mysql_init error, %s\n", mysql_error(&mysql));
return ret;
}
printf("mysql_init ok...\n");
//connect = mysql_real_connect(connect, NULL, "root", "yxk", "mydb61", 0, NULL, 0);
connect = mysql_real_connect(connect, "localhost", "root", "yxk", "test", 0, NULL, 0);
if(connect == NULL){
ret = mysql_errno(&mysql);
printf("mysql_real_connect error, err is: %s\n", mysql_error(&mysql));
return ret;
}
printf("mysql_real_connect ok...\n");
const char * query = "select * from department";
ret = mysql_query(connect, query);
if(ret != 0){
printf("mysql_query error\n");
return ret;
}
MYSQL_RES *result = mysql_store_result(&mysql);
if(result == NULL){
printf("mysql_store_result error\n");
return -1;
}
int field_num = mysql_field_count(&mysql);
//表頭
MYSQL_FIELD * fields = mysql_fetch_fields(result);
int i = 0;
printf("------------------------------------------\n");
for(i= 0; i < field_num; i++){
printf("%s \t", fields[i].name);
}
printf("\n------------------------------------------\n");
//表內容
MYSQL_ROW row = NULL;
while(row = mysql_fetch_row(result)){
for(i= 0; i < field_num; i++){
printf("%s \t", row[i]);
}
printf("\n");
}
mysql_free_result(result);//釋放記憶體
mysql_close(connect);
printf("mysql_close...\n");
return ret;
}
Makefile檔案:
mysql_test:mysql_test.c
gcc mysql_test.c -o mysql_test -I/usr/include/ -L/usr/lib/x86_64-linux-gnu/ -lmysqlclient
clean:
rm mysql_test
執行輸出結果:
相關文章
- C語言入門很簡單pdfC語言
- sql 連線查詢例項(left join)三表連線查詢SQL
- MySql中的資料查詢語言(DQL)三:連線查詢MySql
- c++ 連線mysql例項C++MySql
- mysql查詢語句5:連線查詢MySql
- 《MySQL 入門教程》第 18 篇 連線查詢MySql
- opengl簡單入門例項
- 《MySQL 入門教程》第 07 篇 簡單查詢MySql
- MySQL內連線查詢語句MySql
- MySQL的簡單查詢語句MySql
- MySQL入門系列:查詢簡介(五)之子查詢MySql
- 使用SSMS連線和查詢 SQL Server 例項SSMSQLServer
- python連結mysql查詢資料例項PythonMySql
- 入門MySQL——查詢語法練習MySql
- MySQL入門系列:查詢簡介(二)MySql
- C語言連線mysql資料庫查詢中文的資料表亂碼問題C語言MySql資料庫
- 圖查詢語言 nGQL 簡明教程 vol.01 快速入門
- 3.DQL資料查詢語言(內連線,外連線,自連線)
- C語言折半查詢C語言
- MySQL之連線查詢MySql
- MySQL入門系列:查詢簡介(七)之組合查詢MySql
- 超級簡單入門vuex 小例項Vue
- MySQL之連線查詢和子查詢MySql
- c語言入門C語言
- MySQL - 資料查詢 - 簡單查詢MySql
- MySQL — 資料查詢語言MySql
- 【由淺入深學MySQL】- MySQL連線查詢詳解MySql
- 簡單的mysql查詢MySql
- MySQL學習-連線查詢MySql
- MySQL8:連線查詢MySql
- SignalR2 永久連線簡單例項1SignalR單例
- Mysql 簡單入門MySql
- Django+MySQL 例項入門DjangoMySql
- 《明解c語言:入門篇》閱讀後的簡單評價C語言
- mysql-分組查詢-子查詢-連線查詢-組合查詢MySql
- 簡單的查詢語法
- in子查詢與表連線是否等價?
- 【SpringBoot】SpringBoot + MyBatis 連線 MySQL 並完成簡單查詢的流程Spring BootMyBatisMySql