標籤:使用者名稱 tle 主機 mysql資料庫 傳回值 explain 調用 連接埠 win
c語言操作Mysql資料庫,主要就是為了實現對資料庫的增、刪、改、查等操作,操作之前,得先串連資料庫啊,而串連資料庫主要有兩種方法。一、使用mysql本身提供的API,在mysql的安裝目錄中可可以看到大量的標頭檔、lib檔案、dll檔案,這說明mysql原生就支援了c語言,操作起來相當簡單。二、使用win32 api(這裡只探討windows平台),主要是ODBC。
ODBC API 介面是(Open Database Connectivity)開放式資料庫介面,它建立了一組規範,並提供了一組對資料庫訪問的標準API,這些API利用SQL來完成其大部分任務。ODBC本身也提供了對SQL語言的支援,使用者可以直接將SQL語句送給ODBC。這個基於ODBC的應用程式對資料庫的操作不依賴任何DBMS,不直接與DBMS打交道,所有的資料庫操作由對應的DBMS的ODBC驅動程式完成。也就是說,不論是FoxPro、Access還是Oracle資料庫,均可用ODBC API進行訪問。由此可見,ODBC的最大優點是能以統一的方式處理所有的資料庫。
這裡先從第一種方法開始,先認識基本的幾個api函數。
1 MYSQL *mysql_init(MYSQL *mysql)
功能: 分配或初始化MYSQL對象。
參數:mysql
待初始化的MYSQ對象,將對象地址傳入,NULL指標,該函數將分配、初始化、並返回新對象。否則,將初始化對象,並返回對象的地址。
用法執行個體:
MYSQL mysql;
mysql_init(&mysql); // 或者 mysql = mysql_init(NULL);
2 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 前面一個函數的返回的mysql執行個體控制代碼。host 要串連的資料庫的主機,可以是ip地址或主機名稱。user 表示登入資料庫的使用者名稱
passwd 登入的密碼。db 就是訪問的資料庫。port mysql的tcp/ip連接埠預設是3306.unix_socket 表示連線類型。client_flag 暫時為0即可。
3 int mysql_query(MYSQL *mysql,const char *query)
功能:根據query查詢語句執行查詢資料庫
參數: mysql mysql的執行個體。query 查詢語句字串
傳回值: 成功返回0,失敗返回非0
4 MYSQL_RES *mysql_store_result(MYSQL *mysql)
功能:得到查詢的結果集,對於成功檢索了資料的每個查詢(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必須調用mysql_store_result()或mysql_use_result()
參數:mysql前面的mysql執行個體
傳回值:成功返回MYSQL_RES結構體,該結構體中儲存查詢的結果
5 MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
功能:mysql_store_result得到的結果結構中提取一行,並把它放到一個行結構中。
傳回值:下一行的一個MYSQL_ROW結構當資料用完或發生錯誤時返回null
下面是簡單一實例代碼
#include <stdio.h>
#include <stdlib.h>
#include<Windows.h>
#include "C:\Program Files\MySQL\MySQL Server 5.7\include\mysql.h" //包含MySQL所需要的標頭檔
#pragma comment(lib, "libmysql.lib")
int main(void)
{
MYSQL mysql, *sock; //聲明MySQL的控制代碼
const char * host = "127.0.0.1"; //因為是作為本機測試,所以填寫的是本地IP
const char * user = "root"; //這裡改為你的使用者名稱,即串連MySQL的使用者名稱
const char * passwd = "root"; //這裡改為你的使用者密碼
const char * db = "test"; //這裡改為你要串連的資料庫的名字,一個資料可能有幾張表
unsigned int port = 3306; //這是MySQL的伺服器的連接埠,如果你沒有修改過的話就是3306。
const char * unix_socket = NULL; //unix_socket這是unix下的,我在Windows下,所以就把它設定為NULL
unsigned long client_flag = 0; //這個參數一般為0
const char * i_query = "select * from person"; //查詢語句,從那個表中查詢,這裡後面沒有;
MYSQL_RES * result; //儲存結果集的
MYSQL_ROW row; //代表的是結果集中的一行
//my_ulonglong row;
mysql_init(&mysql); //串連之前必須使用這個函數來初始化
if ( (sock = mysql_real_connect(&mysql, host, user, passwd, db, port, unix_socket, client_flag) ) == NULL ) //串連MySQL
{
printf("fail to connect mysql \n");
fprintf(stderr, " %s\n", mysql_error(&mysql));
exit(1);
}
else
{
fprintf(stderr, "connect ok!!\n");
}
if ( mysql_query(&mysql, i_query) != 0 ) //如果串連成功,則開始查詢 .成功返回0
{
fprintf(stderr, "fail to query!\n");
exit(1);
}
else
{
if ( (result = mysql_store_result(&mysql)) == NULL ) //儲存查詢的結果
{
fprintf(stderr, "fail to store result!\n");
exit(1);
}
else
{
while ( (row = mysql_fetch_row(result)) != NULL ) //讀取結果集中的資料,返回的是下一行。因為儲存結果集時,當前的遊標在第一行【之前】
{
printf("name is %s\t", row[0]); //列印當前行的第一列的資料
printf("age is %s\t\n", row[1]); //列印當前行的第二列的資料
//row = mysql_num_row(result);
//printf("%lu\n", mysql_num_row(result));
}
}
}
mysql_free_result(result); //釋放結果集
mysql_close(sock); //關閉串連
system("pause");
exit(EXIT_SUCCESS);
}
c語言操作mysql資料庫