程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> CentOS 6.4系統下使用C語言訪問Mysql

CentOS 6.4系統下使用C語言訪問Mysql

編輯:關於C語言

用C語言連接Mysql數據庫包含兩個步驟:

1 初始化一個連接句柄結構

2 實際進行連接


使用mysql_init來初始化連接句柄

#include <mysql.h>

MYSQL * mysql_init(MYSQL *);

通常你傳遞NULL給這個例程,它會返回一個指向新分配的連接句柄結構的指針。如果你傳遞一個已有的結構,它將被重新初始化。這個例程在出錯時返回NULL。


分配和初始化了一個結構,仍需要使用mysql_real_connect來向一個連接提供參數:

MYSQL * mysql_real_connect(MYSQL *connection,

const char * server_host,

const char * sql_user_name,

const char * sql_password,

const char * db_name,

unsigned int port_number,

const char * unix_socket_name,

unsigned int flags,);

connection:指向已經被mysql_init初始化過的結構

server_host:可以是主機名,也可以是ip地址。如果只是連接到本地機器,你可以通過指定localhost來優化連接類型。

sql_user_name:數據庫登錄名

sql_password:數據庫密碼

db_name:數據庫名

port_number:端口號(沒改變Mysql默認設置,使用0表示默認值)

unix_socket_name:為NULL表示默認值

flags:用來對一些定義的位模式進行OR操作,使得改變使用協議的某些特性。


void mysql_close(MYSQL *connection);

關閉連接。如果連接是由mysql_init建立的,MySQL結構會被釋放。指針將會失效並無法再次使用。保留一個不需要的連接是對資源的浪費,但是重新打開連接也會帶來額外的開銷,所以必須自己權衡何時使用這些選項。



mysql_options(僅能在mysql_init和mysql_real_connect之間調用)

int mysql_options(MYSQL *connection,enum option_to_set,const char *argument);

因為mysql_options一次只能設置一個選項,所以每設置一個選項就得調用它一次。你可以多次調用,只要它出現在mysql_init和mysql_real_connect之間即可。

列出3個最常用的選項,如下:

enum選項實際參數類型說明MySQL_OPT_CONNECT_TIMEOUTconst unsigned int *連接超時之前的等待秒數MySQL_OPT_COMPRESS使用NULL網絡連接中使用壓縮機制MySQL_INIT_COMMANDconst char * 每次連接建立後發送的命令

一次成功的調用返回0。


以用戶名root和密碼yao來連接本機服務器上名為test的數據庫

connect.c

#include <stdlib.h>
#include <stdio.h>
#include "mysql.h"
 int main(int argc,char **argv)
{
   MYSQL * conn_ptr;
                                                                                                                                                                                                                                                                                                                                                                    
   conn_ptr = mysql_init(NULL);
   if(!conn_ptr)
  {
     perror("mysql_init failed\n");
     exit(1);
  }
  conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","yao","test",0,NULL);
 if(conn_ptr)
{
  printf("connection success\n");
}
 else
{
  printf("connection failed\n");
}
                                                                                                                                                                                                                                                                                                                                                                   
  mysql_close(conn_ptr);
                                                                                                                                                                                                                                                                                                                                                                   
  return 0;
}


編譯這個程序,需要同時添加include路徑和庫文件路徑,以及指定鏈接的庫模塊mysqlclient。

gcc -I/usr/include/mysql connect.c -L/usr/lib/mysql -lmysqlclient -o connect


可能的錯誤:

Centos 6.4 64位系統下使用C語言訪問Mysql 找不到mysqlclient


解決:

將 -L/usr/lib/mysql改為 -L/usr/lib64/mysql



錯誤處理

MySQL使用一系列由連接句柄結構報告的返回碼。

unsigned int mysql_errno(MYSQL * connection);

char * mysql_error(MYSQL * connection);

通過調用mysql_errno並傳遞連接結構來獲得錯誤碼,通常都是非0值。如果未設定錯誤碼,它將返回0。因為每次調用庫都會更新錯誤碼,所以你只能得到最後一個執行命令的錯誤碼。上面兩個錯誤檢查函數是例外,它們不會導致錯誤碼的更新。

mysql_errno的返回值實際上就是錯誤碼,它們在頭文件errmsg.h或mysqld_error.h中定義。這兩個文件都可以在MySQL的include目錄中找到。前者報告客戶端錯誤,後者關注服務端錯誤。

如果喜歡文本信息錯誤,調用mysql_error,提供了有意義的文本信息,這些信息被寫入一些內部靜態內存空間中。


使用非動態分配的連接結構

#include <stdlib.h>
#include <stdio.h>
#include "mysql.h"
 int main(int argc,char **argv)
{
  MYSQL mysql_conn;
  mysql_init(&mysql_conn);
           if(mysql_real_connect(&mysql_conn,"localhost","root","dfdsfjfd","test",0,NULL))
{
  printf("connection success\n");
  mysql_close(&mysql_conn);
}
 else
{
  perror("connection failed\n");
  if(mysql_errno(&mysql_conn))
 {
   fprintf(stderr,"connection error %d:%s\n",mysql_errno(&mysql_conn),mysql_error(&mysql_conn));
 }
}
  return 0;
}

注:這裡我使用動態分配的連接結構,錯誤信息不產生。


執行SQL語句

執行SQL語句的函數為

int mysql_query(MYSQL *connection,const char *query);

這個函數接受連接結構指針和文本字符串形式的有效SQL語句(沒有結束的分號)。如果成功,返回0.對於包含二進制數據的查詢,可以使用第二個函數mysql_real_query。


1 不返回數據的SQL語句

不返回任何數據的SQL語句:update delete insert


這裡介紹另一個重要函數,用於檢查首查詢影響的行數

my_ulonglong mysql_affected_rows(MYSQL *connection);

這個函數的返回值類型很不常見,它使用無符號類型。當你使用printf時,推薦使用%lu格式將其轉換為無符號長整數。這個函數返回受之前執行的update、insert或delete查詢影響的行數。如果你使用過其他SQL數據庫,MySQL返回的是被一個更新操作修改的行數,但許多其他數據庫將僅僅因為記錄匹配where子句就把它視為已經更新過。


插入一條數據

#include <stdlib.h>
#include <stdio.h>
#include "mysql.h"
 int main(int argc,char **argv)
{
  MYSQL mysql_conn;
  int res;
  mysql_init(&mysql_conn);
     if(mysql_real_connect(&mysql_conn,"localhost","root","yao","test",0,NULL))
{
  printf("connection success\n");
                
  res = mysql_query(&mysql_conn,"insert into child(childid,age,name) values (1,12,'bing')");
  if(!res)
 {
   printf("inserted %lu rows\n",(unsigned long)mysql_affected_rows(&mysql_conn));
 } 
               
 else
{
  fprintf(stderr,"insert error %d:%s",mysql_errno(&mysql_conn),mysql_error(&mysql_conn)); 
}
  mysql_close(&mysql_conn);
}
 else
{
  fprintf(stderr,"connection failed\n");
  if(mysql_errno(&mysql_conn))
 {
    fprintf(stderr,"Connection error %d:%s\n",mysql_errno(&mysql_conn),mysql_error(&mysql_conn));
 }
}
   return 0;
}

今天先到這,下次繼續補充。。。




本文出自 “技術在於堅持” 博客,請務必保留此出處http://minilinux.blog.51cto.com/4499123/1300703

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