程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> MySQL的C說話API接口

MySQL的C說話API接口

編輯:關於C++

MySQL的C說話API接口。本站提示廣大學習愛好者:(MySQL的C說話API接口)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL的C說話API接口正文


1、起首固然是銜接數據庫,函數原型以下:

MYSQL * STDCALL 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 clientflag);

第一個參數 MYSQL是 C api中一個異常主要的變量,外面內存異常豐碩,有port,dbname,charset等銜接根本參數。它也包括了一個叫 st_mysql_methods的構造體變量,該變量外面保留著許多函數指針,這些函數指針將會在數據庫銜接勝利今後的各類數據操作中被挪用。mysql_real_connect函數中各參數,根本都是顧名思意。

2、銜接數據庫勝利以後便可以履行sql語句了應用mysql_query
int STDCALL mysql_query(MYSQL *mysql, const char *q);

第一個參數下面曾經引見過,第二個參數為要履行的sql語句。

這個函數整體就兩步:

(1)發送sql語句,其實就一個socket發送sql 語句,加上mysql固定的協定頭。懶的去看源碼了,抓了下包,以下:
0000 19 00 00 00 0373 65 6c 65 63 74 20 61 70 70 5f .....select app_
0010 6e 61 6d 65 20 66 72 6f 6d 20 61 70 70 name from app
白色部門是協定,後面兩位其實就是包的長度。詳細協定沒研討過。

(2)然後就是接收成果,這裡將會挪用MYSQL變量中的st_mysql_methods中的read_query_result函數指針

3、獲得成果

sql履行完今後,假如是查詢語句,我們固然還要讀取數據,假如update,insert等語句,那末就看下操作勝利與否便可。我們來看看若何獲得查詢成果: 假如mysql_query前往勝利,那末我們就經由過程mysql_store_result這個函數來讀取成果。原型以下:

MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);

該函數會挪用MYSQL變量中的st_mysql_methods中的 read_rows函數指針來獲得查詢的成果。同時該函數會前往MYSQL_RES 如許一個變量,該變量重要用於保留查詢的成果。同時該函數malloc了一片內存空間來存儲查詢過去的數據,所以我們必定要記的 free(result),否則是確定會形成內存洩露的。 履行完mysql_store_result今後,其實數據都曾經在MYSQL_RES 變量中了,上面的api根本就是讀取MYSQL_RES 中的數據。例如mysql_fetch_row這個函數,就是讀去查詢成果的一行。函數原型以下

MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);

它會前往一個MYSQL_ROW變量,MYSQL_ROW其實就是char **.就當做一個二維數組來用吧。還有許多api,不再逐個引見,年夜部門信息都在MYSQL_RES MYSQL這兩個構造體中。詳細可以參考mysql官方網站: http://dev.mysql.com/doc/refman/5.1/en/c.html 忽然發明官方網站材料好周全,貌似比任何書都要好。

上面來個例子:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<mysql/mysql.h>
#define MAX_COLUMN_LEN  32
int main(int argc , char *argv[])
{
  MYSQL my_connection;
  MYSQL_RES *result;
  MYSQL_ROW sql_row;
  MYSQL_FIELD *fd;
  char column[MAX_COLUMN_LEN][MAX_COLUMN_LEN];
  int res;
  mysql_init(&my_connection);
  if(mysql_real_connect(&my_connection,"127.0.0.1","用戶","暗碼","數據稱號",3306,NULL,0))
  {
    perror("connect");
    res=mysql_query(&my_connection,"select * from app");//查詢
    if(!res)
    {
      result=mysql_store_result(&my_connection);//保留查詢到的數據到result
      if(result)
      {
        int i,j;
        printf("the result number is %lu\n ",(unsigned long)mysql_num_rows(result));
        for(i=0;fd=mysql_fetch_field(result);i++)//獲得列名
        {
          bzero(column[i],sizeof(column[i]));
          strcpy(column[i],fd->name);
        }
        j=mysql_num_fields(result);
        for(i=0;i<j;i++)
        {
          printf("%s\t",column[i]);
        }
        printf("\n");
        while(sql_row=mysql_fetch_row(result))//獲得詳細的數據
        {
          for(i=0;i<j;i++)
          {
            printf("%s\t",sql_row[i]);
          }
          printf("\n");
        }
        
      }
    }
    else
    {
      perror("select");
    }
  }
  else
  {
    perror("connect:error");
  }
  mysql_free_result(MYSQL_RES *result);//釋放成果資本
  mysql_close(&my_connection);//斷開銜接

}

下面這個例子就是從一個表中查數據,然後輸入。 假如要insert或許update,只須要修正詳細的sql既可。詳細的操作都是經由過程mysql_query這個函數來弄定。 如今來說編譯的辦法吧,這裡我們須要.h和.so庫。我們可以在 http://dev.mysql.com/downloads/connector/c/6.0.html 下載Connector/C。簡略的辦法就是: 把外面include的器械拷貝到/usr/include/mysql/上面去,如許編譯的時刻就不須要加-I了,然後把lib上面的器械拷貝的/usr/lib/下去。

gcc詳細的編譯辦法:gcc ***.c -o *** -lmysqlclient

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved