2012-07-03 47 views
4

我是新使用gwan服務器()和在這方面編程c。我想知道在gwan服務器的c腳本中使用mysql的最簡單方法是什麼?在c腳本中連接到mysql?

我已經使用dbi.c做過試驗here和項目頁面可以找到here,但也發現有一個c API用於mysql本身,你可以找到here

任何人都有使用兩者或兩者的經驗嗎?有哪些優點/缺點?有沒有其他的庫可以讓像我這樣的簡單連接到mysql?

任何幫助表示讚賞。

謝謝!

[編輯] 也是libdbi線程安全嗎?它似乎不是。

[編輯2] 看來,MySQL的LIB本身是容易的路要走,除非你認爲可能在稍後切換數據庫類型爲libdbi似乎能夠有不同的驅動程序這是抽象不錯。

與金桂冠對我來說,如果我在處理程序的主要功能有任何「MySQL的代碼」,它似乎是不安全和間歇性地造成的隨機誤差,但如果我把「MySQL代碼」中的初始化函數和把我需要的任何數據放在一個kv商店訪問了一個全局指針隨機錯誤完全消失。 (我用的是libdbi我認爲這將是MySQL的API相同)

希望這有助於

回答

4

我總是喜歡使用原生的C API ...

#pragma link "/usr/lib/libmysqlclient.so" 

#include "gwan.h" 
#include <mysql/mysql.h> 


int 
main (int argc, char **argv) 
{ 
    MYSQL_RES *result; 
    MYSQL_ROW row; 
    MYSQL conn, *conn_h; 

    conn_h = mysql_init (&conn); 
    if (!conn_h) 
    { 
     return 200; 
    } 

    if (!mysql_real_connect (conn_h, "localhost", ctx->usr, ctx->psw, NULL, 0, NULL, 0)) 
    { 
     mysql_close (conn_h); 
     return 200; 
    } 

    mysql_select_db (conn_h, ""); 

    char *query = ""; 

    if (mysql_query (conn_h, query)) 
    { 
     mysql_close (conn_h); 
     return 200; 
    } 

    result = mysql_store_result (conn_h); 
    if (!result) 
    { 
     mysql_close (conn_h); 
     return 200; 
    } 

    if (mysql_num_rows (result) == 0) 
    { 
     return 200; 
    } 

    while ((row = mysql_fetch_row (result))) 
    { 
     /* do something with row[i] */ 
    } 

    mysql_free_result (result); 
    mysql_close (conn_h); 

    return 200; // Ok 
} 

記住你需要初始化mysql庫,如果你計劃產生線程(這個代碼不是線程安全的)。

希望這對你有所幫助。

+0

那麼他們是一個線程安全的連接方式?我的印象是,gwan使用線程同時進行多個連接。 – sbditto85

+0

@ sbditto85連接始終是線程安全的。只有當你在連接中產生了線程時,你才需要小心,至今我所看到的用處不大。 –

+0

但你不必使用線程安全的lib? '線程安全客戶端庫libmysqlclient_r對於每個連接都是線程安全的。 '[請參閱mysql「如何編寫線程客戶端」](http://dev.mysql.com/doc/refman/5.0/en/threaded-clients.html)或者我誤解了一些東西?再次抱歉,我仍然是一個C編程的noob。 – sbditto85