程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 用C說話操作MySQL數據庫的通用辦法

用C說話操作MySQL數據庫的通用辦法

編輯:MySQL綜合教程

用C說話操作MySQL數據庫的通用辦法。本站提示廣大學習愛好者:(用C說話操作MySQL數據庫的通用辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是用C說話操作MySQL數據庫的通用辦法正文


在我們的web運用中,固然PHP、JSP等劇本均供給了MySQL的接口,然則明顯直接應用C說話具有更好的平安性和機能,在這篇文章中可以或許有所表現。

先看構造體:
以下代碼塊是用來銜接數據庫的通信進程,要銜接MYSQL,必需樹立MYSQL實例,經由過程mysql_init初始化方能開端停止銜接.

typedef struct st_mysql { 
NET net; /* Communication parameters */ 
gptr connector_fd; /* ConnectorFd for SSL */ 
char *host,*user,*passwd,*unix_socket, 
*server_version,*host_info,*info,*db; 
unsigned int port,client_flag,server_capabilities; 
unsigned int protocol_version; 
unsigned int field_count; 
unsigned int server_status; 
unsigned long thread_id; /* Id for connection in server */ 
my_ulonglong affected_rows; 
my_ulonglong insert_id; /* id if insert on table with NEXTNR */ 
my_ulonglong extra_info; /* Used by mysqlshow */ 
unsigned long packet_length; 
enum mysql_status status; 
MYSQL_FIELD *fields; 
MEM_ROOT field_alloc; 
my_bool free_me; /* If free in mysql_close */ 
my_bool reconnect; /* set to 1 if automatic reconnect */ 
struct st_mysql_options options; 
char scramble_buff[9]; 
struct charset_info_st *charset; 
unsigned int server_language; 
} MYSQL;

這個構造代表前往行的一個查詢的(SELECT, SHOW, DESCRIBE, EXPLAIN)的成果。前往的數據稱為“數據集”,用過數據庫的同伙應當對數據庫中查詢後獲得的成果集不會生疏,在C的API裡對應的就是MYSQL_RES了,從數據庫讀取數據,最初就是從MYSQL_RES中讀取數據。

typedef struct st_mysql_res { 
my_ulonglong row_count; 
unsigned int field_count, current_field; 
MYSQL_FIELD *fields; 
MYSQL_DATA *data; 
MYSQL_ROWS *data_cursor; 
MEM_ROOT field_alloc; 
MYSQL_ROW row; /* If unbuffered read */ 
MYSQL_ROW current_row; /* buffer to current row */ 
unsigned long lengths; / column lengths of current row */ 
MYSQL handle; / for unbuffered reads */ 
my_bool eof; /* Used my mysql_fetch_row */ 
} MYSQL_RES;

--------------------------------
再看函數:
C說話操作mysql數據 經常使用函數

所需頭文件: #include <mysql/mysql.h>
功效: 取得或初始化一個MYSQL構造
函數原型: MYSQL *mysql_init(MYSQL *mysql)
函數前往值: 一個被始化的MYSQL*句柄
備注: 在內存缺乏的情形下,前往NULL

所需頭文件: #include <mysql/mysql.h>
函數功效: 封閉一個辦事器銜接,並釋放與銜接相干的內存
函數原型: void mysql_close(MYSQL *mysql);
函數傳入值: MYSQL:類型的指針
函數前往值: 無

所需頭文件: #include <mysql/mysql.h>
函數功效: 銜接一個MySQL辦事器
函數原型: MYSQL * mysql_connect(MYSQL *mysql,const char *host,const char *user,const char *passwd);
函數傳入值: mysql表現一個現存mysql構造的地址
 host表現MYSQL辦事器的主機名或IP
 user表現登錄的用戶名
 passwd表現登錄的暗碼
函數前往值: 假如銜接勝利,一個MYSQL *銜接句柄:假如銜接掉敗,NULL
備注: 該函數不推舉,應用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 int client_flag);
函數傳入值: mysql表現一個現存mysql構造的地址
 host表現MYSQL辦事器的主機名或IP
 user表現登錄的用戶名
 passwd表現登錄的暗碼
 db表現要銜接的數據庫
 port表現MySQL辦事器的TCP/IP端口
 unix_socket表現銜接類型
 client_flag表現MySQL運轉ODBC數據庫的標志
函數前往值: 假如銜接勝利,一個MYSQL*銜接句柄:假如銜接掉敗,NULL

所需頭文件: #include <mysql/mysql.h>
函數功效: 前往最新的UPDATE,DELETE或INSERT查詢影響的行數
函數傳入值: MYSQL:類型指針
函數前往值: 年夜於零的一個整數表現遭到影響或檢索出來的行數。零表現沒有區配查序中WHERE子句的記載或今朝還沒有查詢被履行;-1表現查詢前往一個毛病,或關於一個SELECT查詢

所需頭文件: #include <mysql/mysql.h>
函數功效: 對指定的銜接履行查詢
函數原型: int mysql_query(MYSQL *mysql,const char *query);
函數傳入值: query表現履行的SQL語句
函數前往值: 假如查詢勝利,為零,失足為非零。
相干函數: mysql_real_query

所需頭文件: #include <mysql/mysql.h>
函數功效: 為無緩沖的成果集取得成果標識符
函數本相: MYSQL_RES *mysql_use_result(MYSQL *mysql);
函數傳入值: MYSQL:類型的指針
函數前往值: 一個MYSQL_RES成果構造,假如產生一個毛病發NULL

#incluee <mysql/mysql.h>
檢索一個成果聚集的下一行
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
MYSQL_RES:構造的指針
下一行的一個MYSQL_ROW構造。假如沒有更多的行可檢索或假如湧現一個毛病,NULL

#include <mysql/mysql.h>
前往指定成果集中列的數目
unsigned int mysql_num_fields(MYSQL_RES *res);
MYSQL_RES 構造的指針
成果聚集中字段數目的一個無符號整數

#include <mysql/mysql.h>
創立一個數據庫
int mysql_create_db(MYSQL *mysql,const char *db);
MYSQL:類型的指針
db:要創立的數據庫名
假如數據庫勝利地被創立,前往零,假如產生毛病,為非零。

#include <mysql/mysql.h>
選擇一個數據庫
int mysql_select_db(MYSQL *mysql,const char *db);
MYSQL:類型的指針
db:要創立的數據庫名
假如數據庫勝利地被創立,前往零,假如產生毛病,為非零。

----------------------------------------------

--------------
再看例子:

 許多人用到MySQL來開辟一些項目,有時為了機能,我們會直接用C說話來開辟相干的模塊,特別在我們的web運用中,固然PHP、JSP等劇本均供給了MySQL的接口,然則明顯直接應用C說話具有更好的平安性和機能,Michael之前用PHP開辟的多個項目中就應用了C說話編寫的這類接口,然後再編譯到php外面,供php劇本直接應用,這方面的話題就不多說了,上面重要說一下在Linux下若何用C說話銜接MySQL數據庫,而且讀取外面的 數據前往,同時若何停止編譯。
這裡的年夜部門代碼參考了MySQL刊行包外面的.c源文件,年夜家也能夠去外面找找相干的代碼,上面這段代碼完成了銜接到當地MySQL辦事器上9tmd_bbs_utf8數據庫,從數據表tbb_user中依據輸出的userid獲得該用戶的用戶名並打印輸入到終端。
  

#if defined(_WIN32) || defined(_WIN64) //為了支撐windows平台上的編譯
#include <windows.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include "mysql.h" //我的機械上該文件在/usr/local/include/mysql下

//界說數據庫操作的宏,也能夠不界說留著前面直接寫進代碼
#define SELECT_QUERY "select username from tbb_user where userid = %d"

int main(int argc, char **argv) //char **argv 相當於 char *argv[]
{
  MYSQL mysql,*sock;  //界說數據庫銜接的句柄,它被用於簡直一切的MySQL函數
  MYSQL_RES *res;    //查詢成果集,構造類型
  MYSQL_FIELD *fd ;   //包括字段信息的構造
  MYSQL_ROW row ;    //寄存一行查詢成果的字符串數組
  char qbuf[160];   //寄存查詢sql語句字符串

  if (argc != 2) { //檢討輸出參數
    fprintf(stderr,"usage : mysql_select <userid>\n\n");
    exit(1);
  }

  mysql_init(&mysql);
  if (!(sock = mysql_real_connect(&mysql,"localhost","dbuser","dbpwd","9tmd_bbs_utf8",0,NULL,0))) {
    fprintf(stderr,"Couldn't connect to engine!\n%s\n\n",mysql_error(&mysql));
    perror("");
    exit(1);
  }

  sprintf(qbuf,SELECT_QUERY,atoi(argv[1]));
  if(mysql_query(sock,qbuf)) {
    fprintf(stderr,"Query failed (%s)\n",mysql_error(sock));
    exit(1);
  }

  if (!(res=mysql_store_result(sock))) {
    fprintf(stderr,"Couldn't get result from %s\n", mysql_error(sock));
    exit(1);
  }

  printf("number of fields returned: %d\n",mysql_num_fields(res));

  while (row = mysql_fetch_row(res)) {
    printf("Ther userid #%d 's username is: %s\n", atoi(argv[1]),(((row[0]==NULL)&&(!strlen(row[0]))) ? "NULL" : row[0])) ; 
    puts( "query ok !\n" ) ; 
  } 

  mysql_free_result(res);
  mysql_close(sock);
  exit(0);
  return 0;  //. 為了兼容年夜部門的編譯器參加此行
}

編譯的時刻,應用上面的敕令

gcc -o mysql_select ./mysql_select.c -I/usr/local/include/mysql -L/usr/local/lib/mysql -lmysqlclient (-lz) (-lm) 前面兩個選項可選,依據您的情況情形

運轉的時刻,履行上面的敕令

./mysql_select 1

將前往以下成果:

number of fields returned: 1
Ther userid #1 ‘s username is: Michael
query ok !

以上就是本文的全體內容,願望對年夜家的進修有所贊助。

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